| // Copyright (c) 2023, 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. |
| |
| // Tests that field promotion works when the promotion condition is stored in a |
| // local variable. |
| |
| import 'package:expect/static_type_helper.dart'; |
| |
| class C { |
| final Object? _o; |
| C(this._o); |
| } |
| |
| void usingNullCheck_withoutInterveningPromotion(C c) { |
| bool b = c._o != null; |
| if (b) { |
| c._o.expectStaticType<Exactly<Object>>(); |
| } |
| } |
| |
| void usingIsTest_withoutInterveningPromotion(C c) { |
| bool b = c._o is int; |
| if (b) { |
| c._o.expectStaticType<Exactly<int>>(); |
| } |
| } |
| |
| void usingNullCheck_withInterveningRelatedPromotion(C c) { |
| bool b = c._o != null; |
| if (c._o != null) { |
| c._o.expectStaticType<Exactly<Object>>(); |
| } |
| if (b) { |
| c._o.expectStaticType<Exactly<Object>>(); |
| } |
| } |
| |
| void usingIsTest_withInterveningRelatedPromotion(C c) { |
| bool b = c._o is int; |
| if (c._o is int) { |
| c._o.expectStaticType<Exactly<int>>(); |
| } |
| if (b) { |
| c._o.expectStaticType<Exactly<int>>(); |
| } |
| } |
| |
| void usingNullCheck_withInterveningUnrelatedPromotion(C c, int? i) { |
| bool b = c._o != null; |
| i!; |
| if (b) { |
| c._o.expectStaticType<Exactly<Object>>(); |
| } |
| } |
| |
| void usingIsTest_withInterveningUnrelatedPromotion(C c, int? i) { |
| bool b = c._o is int; |
| i!; |
| if (b) { |
| c._o.expectStaticType<Exactly<int>>(); |
| } |
| } |
| |
| void usingNullCheck_disabledByAssignment(C c, C c2) { |
| bool b = c._o != null; |
| if (c._o != null) { |
| c._o.expectStaticType<Exactly<Object>>(); |
| } |
| c = c2; |
| if (b) { |
| c._o.expectStaticType<Exactly<Object?>>(); |
| } |
| } |
| |
| void usingIsTest_disabledByAssignment(C c, C c2) { |
| bool b = c._o is int; |
| if (c._o is int) { |
| c._o.expectStaticType<Exactly<int>>(); |
| } |
| c = c2; |
| if (b) { |
| c._o.expectStaticType<Exactly<Object?>>(); |
| } |
| } |
| |
| main() { |
| usingNullCheck_withoutInterveningPromotion(C(0)); |
| usingIsTest_withoutInterveningPromotion(C(0)); |
| usingNullCheck_withInterveningRelatedPromotion(C(0)); |
| usingIsTest_withInterveningRelatedPromotion(C(0)); |
| usingNullCheck_withInterveningUnrelatedPromotion(C(0), 1); |
| usingIsTest_withInterveningUnrelatedPromotion(C(0), 1); |
| usingNullCheck_disabledByAssignment(C(0), C(1)); |
| usingIsTest_disabledByAssignment(C(0), C(1)); |
| } |