blob: e9ebe3b508fc40578a97441be9402e7489d8a653 [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// Ensure that aliasing calculation takes try-catch into account.
// Otherwise, optimizations like dead store elimination can produce
// incorrect results.
//
import 'package:expect/expect.dart';
class C {
int v = 0;
}
@pragma('vm:never-inline')
void alwaysThrow() {
throw 'a';
}
void foo() {
C? alias;
final alloc = C();
try {
alias = alloc;
alwaysThrow();
alias = null;
} catch (e) {}
// here [alias] will be aliasing [alloc].
// [alias] should be a `Phi(Constant(null), Parameter(...))`
// where `Parameter` arrives from the catch entry.
alias!.v = 42;
// [alloc] should be referencing a AllocateObject
// directly here.
Expect.equals(42, alloc.v);
}
void main() {
foo();
}