blob: 46c9b8428add476678d4b8d28653d359bb1deb0c [file] [log] [blame]
// Copyright (c) 2022, 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.
// Regression test for b/230945329.
//
// Check that AssertAssignables for the same uninstantiated type, where the
// instantiated types at runtime may differ, are not optimized away.
//
// VMOptions=--no-use-field-guards --no-use-osr --deterministic --optimization-counter-threshold=5
void main() {
final bar = Box<dynamic>('a'); // T=dynamic
final barInt = Box<int>(1); // T=int
for (int i = 0; i < 5; ++i) {
bar.bar(bar);
}
try {
barInt.bar(bar);
throw 'that should have failed!';
} on TypeError catch (e, s) {}
}
class Box<T> {
final T v;
Box(this.v);
void bar(Box box) {
// The uninstantiated compile type of box.v is T, same as the uninstantiated
// compile type it's being checked against. It's only the instantiated
// versions at runtime that could differ: the first instance type argument
// of box (box.v) vs. the first instance type argument of this (T).
baz(box.v/*=T*/ as T/*=T*/);
}
}
@pragma('vm:never-inline')
baz(e) {}