| // 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 |
| |
| // VMOptions=--optimization_counter_threshold=10 --deterministic |
| |
| // Regression test for https://dartbug.com/40792 and https://dartbug.com/40795. |
| // Verifies that non-nullability is not inferred from 'is' tests which |
| // accept null. |
| |
| import "package:expect/expect.dart"; |
| |
| dynamic result; |
| |
| // Use separate functions so their parameter types can be inferred separately. |
| setResult1(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| setResult2(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| setResult3(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| setResult4(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| setResult5(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| setResult6(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| setResult7(x) { |
| result = (x == null) ? 'null' : 'not null'; |
| } |
| |
| class A<S, T extends S> { |
| @pragma('vm:never-inline') |
| test1(S x) { |
| if (x is T) { |
| setResult1(x); |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| test2(S x) { |
| if (x is T) { |
| setResult2(x); |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| test3(S x) { |
| if (x is T) { |
| setResult2(x); |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| test4(S x) { |
| if (x is T) { |
| setResult2(x); |
| } |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| test5(x) { |
| if (x is Null) { |
| setResult5(x); |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| test6(x) { |
| if (x is Object) { |
| setResult6(x); |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| test7(x) { |
| if (x is dynamic) { |
| setResult7(x); |
| } |
| } |
| |
| void doTests() { |
| result = 'unexpected'; |
| new A<Null, Null>().test1(null); |
| Expect.equals('null', result); |
| |
| result = 'unexpected'; |
| new A<Object, Object>().test2(null); |
| Expect.equals('null', result); |
| |
| result = 'unexpected'; |
| new A<dynamic, dynamic>().test3(null); |
| Expect.equals('null', result); |
| |
| result = 'unexpected'; |
| new A<void, void>().test4(null); |
| Expect.equals('null', result); |
| |
| result = 'unexpected'; |
| test5(null); |
| Expect.equals('null', result); |
| |
| result = 'unexpected'; |
| test6(null); |
| Expect.equals('null', result); |
| |
| result = 'unexpected'; |
| test7(null); |
| Expect.equals('null', result); |
| } |
| |
| main(List<String> args) { |
| for (int i = 0; i < 20; ++i) { |
| doTests(); |
| } |
| } |