| // Copyright (c) 2021, 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. |
| |
| import 'package:expect/expect.dart'; |
| |
| // Tests where late variable or field has a predictable value. An incorrect |
| // optimization might try to eliminate part of the check. |
| |
| String lastTag = 'unset'; |
| |
| int zero(String tag) { |
| lastTag = tag; |
| return 0; |
| } |
| |
| int one(String tag) { |
| lastTag = tag; |
| return 1; |
| } |
| |
| int? returnNull(String tag) { |
| lastTag = tag; |
| return null; |
| } |
| |
| class C1 { |
| late int? i1 = zero('C1.i1'); |
| late int i2 = zero('C1.i2'); |
| late int? i3 = returnNull('C1.i3'); |
| late int i4 = one('C1.i4'); |
| } |
| |
| class C2 { |
| late final int? i1 = zero('C2.i1'); |
| late final int i2 = zero('C2.i2'); |
| late final int? i3 = returnNull('C2.i3'); |
| late int i4 = one('C2.i4'); |
| } |
| |
| void test1() { |
| for (int i = 0; i < 10; i++) { |
| final c = C1(); |
| lastTag = ''; |
| Expect.equals(0, c.i1); |
| Expect.equals('C1.i1', lastTag); |
| Expect.equals(0, c.i2); |
| Expect.equals('C1.i2', lastTag); |
| Expect.equals(null, c.i3); |
| Expect.equals('C1.i3', lastTag); |
| |
| Expect.equals(0, c.i1); |
| Expect.equals('C1.i3', lastTag); |
| Expect.equals(0, c.i2); |
| Expect.equals('C1.i3', lastTag); |
| Expect.equals(null, c.i3); |
| Expect.equals('C1.i3', lastTag); |
| |
| Expect.equals(1, c.i4); |
| Expect.equals('C1.i4', lastTag); |
| } |
| } |
| |
| void test2() { |
| final c = C2(); |
| lastTag = ''; |
| Expect.equals(0, c.i1); |
| Expect.equals('C2.i1', lastTag); |
| Expect.equals(0, c.i2); |
| Expect.equals('C2.i2', lastTag); |
| Expect.equals(null, c.i3); |
| Expect.equals('C2.i3', lastTag); |
| |
| Expect.equals(0, c.i1); |
| Expect.equals('C2.i3', lastTag); |
| Expect.equals(0, c.i2); |
| Expect.equals('C2.i3', lastTag); |
| Expect.equals(null, c.i3); |
| Expect.equals('C2.i3', lastTag); |
| |
| Expect.equals(1, c.i4); |
| Expect.equals('C2.i4', lastTag); |
| } |
| |
| main() { |
| test1(); |
| test2(); |
| } |