blob: 19d37390a0a4702efcce7f88543626818fcdaf80 [file] [log] [blame]
// 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();
}
}