Skip to content

Commit fbe9f61

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Handle Object* in NNBD_TOP_MERGE
Closes flutter#40481 Change-Id: I5f1060b137e9855106873b2173930d3ebed69930 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137921 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
1 parent 5800997 commit fbe9f61

File tree

5 files changed

+98
-3
lines changed

5 files changed

+98
-3
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
/*library: nnbd=true*/
6+
7+
/*class: A:A<T>,Object*/
8+
class A<T> {}
9+
10+
/*class: A_Object:A<Object?>,A_Object,Object*/
11+
class A_Object implements A<Object?> {}
12+
13+
/*class: A_dynamic:A<dynamic>,A_dynamic,Object*/
14+
class A_dynamic implements A<dynamic> {}
15+
16+
/*class: A_void:A<void>,A_void,Object*/
17+
class A_void implements A<void> {}
18+
19+
/*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
20+
class B1 extends A_Object implements A_dynamic {}
21+
22+
/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
23+
/*analyzer.class: B2:A<Object?>,A_Object,A_void,B2,Object*/
24+
class B2 extends A_Object implements A_void {}
25+
26+
main() {}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
/*library: nnbd=true*/
6+
7+
import "opt_out.dart";
8+
9+
/*class: A_dynamic:A<dynamic>,A_dynamic,Object*/
10+
class A_dynamic implements A<dynamic> {}
11+
12+
/*class: A_void:A<void>,A_void,Object*/
13+
class A_void implements A<void> {}
14+
15+
/*cfe|cfe:builder.class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
16+
/*analyzer.class: B1:A<Object*>,A_Object,A_dynamic,B1,Object*/
17+
class B1 extends A_Object implements A_dynamic {}
18+
19+
/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
20+
/*analyzer.class: B2:A<Object*>,A_Object,A_void,B2,Object*/
21+
class B2 extends A_Object implements A_void {}
22+
23+
main() {}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
// @dart=2.6
6+
7+
/*library: nnbd=false*/
8+
9+
/*class: A:A<T*>,Object*/
10+
class A<T> {}
11+
12+
/*class: A_Object:A<Object*>,A_Object,Object*/
13+
class A_Object implements A<Object> {}

pkg/kernel/lib/src/nnbd_top_merge.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ class NnbdTopMergeVisitor extends MergeVisitor {
6161
// NNBD_TOP_MERGE(Object?, Object?) = Object?
6262
return coreTypes.objectNullableRawType;
6363
}
64+
} else if (a == coreTypes.objectLegacyRawType) {
65+
if (b is DynamicType) {
66+
// NNBD_TOP_MERGE(Object*, dynamic) = Object?
67+
return coreTypes.objectNullableRawType;
68+
} else if (b is VoidType) {
69+
// NNBD_TOP_MERGE(Object*, void) = void
70+
return const VoidType();
71+
}
6472
} else if (a == coreTypes.nullType &&
6573
b is NeverType &&
6674
b.nullability == Nullability.legacy) {
@@ -81,6 +89,9 @@ class NnbdTopMergeVisitor extends MergeVisitor {
8189
} else if (b == coreTypes.objectNullableRawType) {
8290
// NNBD_TOP_MERGE(void, Object?) = void
8391
return const VoidType();
92+
} else if (b == coreTypes.objectLegacyRawType) {
93+
// NNBD_TOP_MERGE(void, Object*) = void
94+
return const VoidType();
8495
}
8596
return null;
8697
}
@@ -94,7 +105,10 @@ class NnbdTopMergeVisitor extends MergeVisitor {
94105
// NNBD_TOP_MERGE(dynamic, void) = void
95106
return const VoidType();
96107
} else if (b == coreTypes.objectNullableRawType) {
97-
// NNBD_TOP_MERGE(Object?, dynamic) = Object?
108+
// NNBD_TOP_MERGE(dynamic, Object?) = Object?
109+
return coreTypes.objectNullableRawType;
110+
} else if (b == coreTypes.objectLegacyRawType) {
111+
// NNBD_TOP_MERGE(dynamic, Object*) = Object?
98112
return coreTypes.objectNullableRawType;
99113
}
100114
return null;

pkg/kernel/test/nnbd_top_merge_test.dart

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,16 @@ const Map<String, dynamic> data = {
1313
'Object* vs Object?': 'Object?',
1414
'Object vs Object?': null,
1515
'Object* vs Object': 'Object',
16+
'Object* vs Object*': 'Object*',
1617
'Object vs Object': 'Object',
1718
'dynamic vs dynamic': 'dynamic',
1819
'void vs void': 'void',
1920
'Object? vs void': 'void',
20-
'Object* vs void': null,
21+
'Object* vs void': 'void',
2122
'Object vs void': null,
2223
'dynamic vs void': 'void',
2324
'Object? vs dynamic': 'Object?',
24-
'Object* vs dynamic': null,
25+
'Object* vs dynamic': 'Object?',
2526
'Object vs dynamic': null,
2627
'Never? vs Null': null,
2728
'Never* vs Null': 'Null',
@@ -32,6 +33,24 @@ const Map<String, dynamic> data = {
3233
'int* vs int': 'int',
3334
'int vs int': 'int',
3435
'int? vs int': null,
36+
'List<Object?> vs List<Object?>': 'List<Object?>',
37+
'List<Object*> vs List<Object?>': 'List<Object?>',
38+
'List<Object*> vs List<Object*>': 'List<Object*>',
39+
'List<Object> vs List<Object?>': null,
40+
'List<Object*> vs List<Object>': 'List<Object>',
41+
'List<Object> vs List<Object>': 'List<Object>',
42+
'List<dynamic> vs List<dynamic>': 'List<dynamic>',
43+
'List<void> vs List<void>': 'List<void>',
44+
'List<Object?> vs List<void>': 'List<void>',
45+
'List<Object*> vs List<void>': 'List<void>',
46+
'List<Object> vs List<void>': null,
47+
'List<dynamic> vs List<void>': 'List<void>',
48+
'List<Object?> vs List<dynamic>': 'List<Object?>',
49+
'List<Object*> vs List<dynamic>': 'List<Object?>',
50+
'List<Object> vs List<dynamic>': null,
51+
'List<Never?> vs List<Null>': null,
52+
'List<Never*> vs List<Null>': 'List<Null>',
53+
'List<Never> vs List<Null>': null,
3554
'List<int?> vs List<int?>': 'List<int?>',
3655
'List<int?> vs List<int*>': 'List<int?>',
3756
'List<int*> vs List<int*>': 'List<int*>',

0 commit comments

Comments
 (0)