Skip to content

Commit 57a8ffd

Browse files
nshahancommit-bot@chromium.org
authored andcommitted
[ddc] Fix is type tests on nullable types
Types that are represented by primitives in JS were dropping the nullable portion when used in `is` type tests. Add regression test expectations for all built in dart types and a version of the tests that can run with sound null safety. Change-Id: I155a673ac23132eb06749d890bce272db3248b33 Fixes: #42851 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/156060 Reviewed-by: Mark Zhou <[email protected]> Commit-Queue: Nicholas Shahan <[email protected]>
1 parent d159c82 commit 57a8ffd

File tree

4 files changed

+118
-12
lines changed

4 files changed

+118
-12
lines changed

pkg/dev_compiler/lib/src/kernel/compiler.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5300,11 +5300,11 @@ class ProgramCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
53005300
// Generate `is` as `dart.is` or `typeof` depending on the RHS type.
53015301
var lhs = _visitExpression(operand);
53025302
var typeofName = _typeRep.typeFor(type).primitiveTypeOf;
5303-
// Inline primitives other than int (which requires a Math.floor check).
5303+
// Inline non-nullable primitive types other than int (which requires a
5304+
// Math.floor check).
53045305
if (typeofName != null &&
5305-
type != _types.coreTypes.intLegacyRawType &&
5306-
type != _types.coreTypes.intNonNullableRawType &&
5307-
type != _types.coreTypes.intNullableRawType) {
5306+
type.nullability == Nullability.nonNullable &&
5307+
type != _types.coreTypes.intNonNullableRawType) {
53085308
return js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
53095309
} else {
53105310
return js.call('#.is(#)', [_emitType(type), lhs]);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:expect/expect.dart';
6+
7+
// Type tests (is checks) located in a null safe library.
8+
main() {
9+
Expect.isFalse(null is Never);
10+
Expect.isTrue(null is Never?);
11+
Expect.isTrue(null is Null);
12+
Expect.isFalse(null is Object);
13+
Expect.isTrue(null is Object?);
14+
Expect.isTrue(null is dynamic);
15+
16+
// Testing all built in types because of a regression that caused them to be
17+
// handled differently https://github.com/dart-lang/sdk/issues/42851.
18+
Expect.isFalse(null is bool);
19+
Expect.isTrue(null is bool?);
20+
Expect.isFalse(null is num);
21+
Expect.isTrue(null is num?);
22+
Expect.isFalse(null is int);
23+
Expect.isTrue(null is int?);
24+
Expect.isFalse(null is double);
25+
Expect.isTrue(null is double?);
26+
Expect.isFalse(null is String);
27+
Expect.isTrue(null is String?);
28+
Expect.isFalse(null is List);
29+
Expect.isTrue(null is List?);
30+
Expect.isFalse(null is Set);
31+
Expect.isTrue(null is Set?);
32+
Expect.isFalse(null is Map);
33+
Expect.isTrue(null is Map?);
34+
Expect.isFalse(null is Symbol);
35+
Expect.isTrue(null is Symbol?);
36+
}

tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,48 @@ main() {
1818
// `null is Never?`
1919
Expect.isTrue(legacyIsNullable<Never>(null));
2020
Expect.isTrue(null is Null);
21-
// `null is int*`
22-
Expect.isFalse(null is int);
23-
// `null is int?`
24-
Expect.isTrue(legacyIsNullable<int>(null));
2521
// `null is Object*`
2622
Expect.isTrue(null is Object);
2723
// `null is Object?`
2824
Expect.isTrue(legacyIsNullable<Object>(null));
2925
Expect.isTrue(null is dynamic);
26+
27+
// Testing all built in types because of a regression that caused them to be
28+
// handled differently https://github.com/dart-lang/sdk/issues/42851.
29+
// `null is bool*`
30+
Expect.isFalse(null is bool);
31+
// `null is bool?`
32+
Expect.isTrue(legacyIsNullable<bool>(null));
33+
// `null is num*`
34+
Expect.isFalse(null is num);
35+
// `null is num?`
36+
Expect.isTrue(legacyIsNullable<num>(null));
37+
// `null is int*`
38+
Expect.isFalse(null is int);
39+
// `null is int?`
40+
Expect.isTrue(legacyIsNullable<int>(null));
41+
// `null is double*`
42+
Expect.isFalse(null is double);
43+
// `null is double?`
44+
Expect.isTrue(legacyIsNullable<double>(null));
45+
// `null is String*`
46+
Expect.isFalse(null is String);
47+
// `null is String?`
48+
Expect.isTrue(legacyIsNullable<String>(null));
49+
// `null is List*`
50+
Expect.isFalse(null is List);
51+
// `null is List?
52+
Expect.isTrue(legacyIsNullable<List>(null));
53+
// `null is Set*`
54+
Expect.isFalse(null is Set);
55+
// `null is Set?
56+
Expect.isTrue(legacyIsNullable<Set>(null));
57+
// `null is Map*`
58+
Expect.isFalse(null is Map);
59+
// `null is Map?
60+
Expect.isTrue(legacyIsNullable<Map>(null));
61+
// `null is Symbol*`
62+
Expect.isFalse(null is Symbol);
63+
// `null is Symbol?
64+
Expect.isTrue(legacyIsNullable<Symbol>(null));
3065
}

tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,48 @@ main() {
1515
Expect.isTrue(nullSafeIsLegacy<Never>(null));
1616
Expect.isTrue(null is Never?);
1717
Expect.isTrue(null is Null);
18-
Expect.isFalse(null is int);
19-
// `null is int*`
20-
Expect.isFalse(nullSafeIsLegacy<int>(null));
21-
Expect.isTrue(null is int?);
2218
Expect.isFalse(null is Object);
2319
// `null is Object*`
2420
Expect.isTrue(nullSafeIsLegacy<Object>(null));
2521
Expect.isTrue(null is Object?);
2622
Expect.isTrue(null is dynamic);
23+
24+
// Testing all built in types because of a regression that caused them to be
25+
// handled differently https://github.com/dart-lang/sdk/issues/42851.
26+
Expect.isFalse(null is bool);
27+
// `null is bool*`
28+
Expect.isFalse(nullSafeIsLegacy<bool>(null));
29+
Expect.isTrue(null is bool?);
30+
Expect.isFalse(null is num);
31+
// `null is num*`
32+
Expect.isFalse(nullSafeIsLegacy<num>(null));
33+
Expect.isTrue(null is num?);
34+
Expect.isFalse(null is int);
35+
// `null is int*`
36+
Expect.isFalse(nullSafeIsLegacy<int>(null));
37+
Expect.isTrue(null is int?);
38+
Expect.isFalse(null is double);
39+
// `null is double*`
40+
Expect.isFalse(nullSafeIsLegacy<double>(null));
41+
Expect.isTrue(null is double?);
42+
Expect.isFalse(null is String);
43+
// `null is String*`
44+
Expect.isFalse(nullSafeIsLegacy<String>(null));
45+
Expect.isTrue(null is String?);
46+
Expect.isFalse(null is List);
47+
// `null is List*`
48+
Expect.isFalse(nullSafeIsLegacy<List>(null));
49+
Expect.isTrue(null is List?);
50+
Expect.isFalse(null is Set);
51+
// `null is Set*`
52+
Expect.isFalse(nullSafeIsLegacy<Set>(null));
53+
Expect.isTrue(null is Set?);
54+
Expect.isFalse(null is Map);
55+
// `null is Map*`
56+
Expect.isFalse(nullSafeIsLegacy<Map>(null));
57+
Expect.isTrue(null is Map?);
58+
Expect.isFalse(null is Symbol);
59+
// `null is Symbol*`
60+
Expect.isFalse(nullSafeIsLegacy<Symbol>(null));
61+
Expect.isTrue(null is Symbol?);
2762
}

0 commit comments

Comments
 (0)