| // Copyright (c) 2020, 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. |
| |
| // @dart = 2.9 |
| |
| // Test that an assignment inside a promotion scope defeats the promotion, even |
| // if it is nested inside another unrelated promotion scope. |
| |
| class A {} |
| |
| class B extends A {} |
| |
| class C extends A {} |
| |
| // An invocation of the form `checkNotB(x)` verifies that the static type of `x` |
| // is not `B`, since `B` is not assignable to `C`. |
| checkNotB(C c) {} |
| |
| // An invocation of the form `alwaysTrue(x)` always returns `true` regardless of |
| // `x`. |
| bool alwaysTrue(dynamic x) => true; |
| |
| noNesting([A a]) { |
| if (a is B) { |
| checkNotB(a); |
| a = null; |
| } |
| } |
| |
| nestedInsideConditionalExpressionThen([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| b ? a = null : null; |
| } |
| } |
| |
| nestedInsideConditionalExpressionElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| b ? null : a = null; |
| } |
| } |
| |
| nestedInsideIfStatementThenNoElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| if (b) { |
| a = null; |
| } |
| } |
| } |
| |
| nestedInsideIfStatementThenWithElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| if (b) { |
| a = null; |
| } else {} |
| } |
| } |
| |
| nestedInsideIfStatementElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| if (b) { |
| } else { |
| a = null; |
| } |
| } |
| } |
| |
| nestedInsideIfElementThenNoElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| [if (b) alwaysTrue(a = null)]; |
| } |
| } |
| |
| nestedInsideIfElementThenWithElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| [if (b) alwaysTrue(a = null) else 0]; |
| } |
| } |
| |
| nestedInsideIfElementElse([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| [if (b) 0 else alwaysTrue(a = null)]; |
| } |
| } |
| |
| nestedInsideRhsOfAnd([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| b && alwaysTrue(a = null); |
| } |
| } |
| |
| nestedInsideRhsOfOr([A a, bool b = true]) { |
| if (a is B) { |
| checkNotB(a); |
| b || alwaysTrue(a = null); |
| } |
| } |
| |
| main() { |
| noNesting(); |
| nestedInsideConditionalExpressionThen(); |
| nestedInsideConditionalExpressionElse(); |
| nestedInsideIfStatementThenNoElse(); |
| nestedInsideIfStatementThenWithElse(); |
| nestedInsideIfStatementElse(); |
| nestedInsideIfElementThenNoElse(); |
| nestedInsideIfElementThenWithElse(); |
| nestedInsideIfElementElse(); |
| nestedInsideRhsOfAnd(); |
| nestedInsideRhsOfOr(); |
| } |