| // 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) {} |