[cfe] Implement NNBD_TOP_MERGE update

Change-Id: I6b204b5d7def6a9d1dd4709e47f95eb102741489
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/144763
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther
2020-04-27 16:28:08 +00:00
committed by commit-bot@chromium.org
parent 3c0e9642d2
commit 3f18d37333
22 changed files with 371 additions and 72 deletions
@@ -56,57 +56,49 @@ class E4 implements B, A {
/*class: F1:A,C,F1,Object*/
class F1 extends A implements C {
/*cfe|cfe:builder.member: F1.method:void Function(void, {void named})*/
/*analyzer.member: F1.method:Object? Function(Object?, {Object? named})*/
/*member: F1.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: F2:A,C,F2,Object*/
class F2 extends C implements A {
/*cfe|cfe:builder.member: F2.method:void Function(void, {void named})*/
/*analyzer.member: F2.method:Object? Function(Object?, {Object? named})*/
/*member: F2.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: F3:A,C,F3,Object*/
class F3 implements A, C {
/*cfe|cfe:builder.member: F3.method:void Function(void, {void named})*/
/*analyzer.member: F3.method:Object? Function(Object?, {Object? named})*/
/*member: F3.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: F4:A,C,F4,Object*/
class F4 implements C, A {
/*cfe|cfe:builder.member: F4.method:void Function(void, {void named})*/
/*analyzer.member: F4.method:Object? Function(Object?, {Object? named})*/
/*member: F4.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: G1:A,B,C,G1,Object*/
class G1 extends B implements C {
/*cfe|cfe:builder.member: G1.method:void Function(void, {void named})*/
/*analyzer.member: G1.method:Object? Function(Object?, {Object? named})*/
/*member: G1.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: G2:A,B,C,G2,Object*/
class G2 extends C implements B {
/*cfe|cfe:builder.member: G2.method:void Function(void, {void named})*/
/*analyzer.member: G2.method:Object? Function(Object?, {Object? named})*/
/*member: G2.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: G3:A,B,C,G3,Object*/
class G3 implements B, C {
/*cfe|cfe:builder.member: G3.method:void Function(void, {void named})*/
/*analyzer.member: G3.method:Object? Function(Object?, {Object? named})*/
/*member: G3.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
/*class: G4:A,B,C,G4,Object*/
class G4 implements C, B {
/*cfe|cfe:builder.member: G4.method:void Function(void, {void named})*/
/*analyzer.member: G4.method:Object? Function(Object?, {Object? named})*/
/*member: G4.method:Object? Function(Object?, {Object? named})*/
method(o, {named}) {}
}
@@ -19,8 +19,7 @@ class A_void implements A<void> {}
/*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
class B1 extends A_Object implements A_dynamic {}
/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
/*analyzer.class: B2:A<Object?>,A_Object,A_void,B2,Object*/
/*class: B2:A<Object?>,A_Object,A_void,B2,Object*/
class B2 extends A_Object implements A_void {}
main() {}
@@ -15,8 +15,7 @@ class A_void implements A<void> {}
/*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
class B1 extends A_Object implements A_dynamic {}
/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
/*analyzer.class: B2:A<Object?>,A_Object,A_void,B2,Object*/
/*class: B2:A<Object?>,A_Object,A_void,B2,Object*/
class B2 extends A_Object implements A_void {}
main() {}
@@ -0,0 +1,47 @@
// 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.
/*library: nnbd=true*/
/*class: A:A<T>,Object*/
class A<T> {
/*member: A.member:T Function()*/
T member() => throw "Unreachable";
}
/*class: B:A<T>,B<T>,Object*/
/*member: B.member:T Function()*/
class B<T> extends A<T> {}
/*class: D0:A<Object?>,B<Object?>,D0,Object*/
/*member: D0.member:Object? Function()*/
class D0 extends A<dynamic> implements B<Object?> {}
/*class: D1:A<Object?>,B<dynamic>,D1,Object*/
/*member: D1.member:Object? Function()*/
class D1 extends A<Object?> implements B<dynamic> {}
/*class: D2:A<Object?>,B<Object?>,D2,Object*/
/*member: D2.member:Object? Function()*/
class D2 extends A<void> implements B<Object?> {}
/*class: D3:A<Object?>,B<void>,D3,Object*/
/*member: D3.member:Object? Function()*/
class D3 extends A<Object?> implements B<void> {}
/*class: D4:A<Object?>,B<dynamic>,D4,Object*/
/*member: D4.member:Object? Function()*/
class D4 extends A<void> implements B<dynamic> {}
/*class: D5:A<Object?>,B<void>,D5,Object*/
/*member: D5.member:Object? Function()*/
class D5 extends A<dynamic> implements B<void> {}
/*class: D6:A<void>,B<void>,D6,Object*/
/*member: D6.member:void Function()*/
class D6 extends A<void> implements B<void> {}
/*class: D7:A<dynamic>,B<dynamic>,D7,Object*/
/*member: D7.member:dynamic Function()*/
class D7 extends A<dynamic> implements B<dynamic> {}
@@ -0,0 +1,49 @@
// 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.
/*library: nnbd=true*/
/*class: A:A<T>,Object*/
abstract class A<T> {
/*member: A.member:T Function()*/
T member();
}
/*cfe|cfe:builder.class: B:B<T>,Object*/
/*cfe|cfe:builder.member: B.member:T Function()*/
mixin B<T> {
T member();
}
/*class: D0:A<dynamic>,B<Object?>,D0,Object*/
/*member: D0.member:Object? Function()*/
abstract class D0 extends A<dynamic> with B<Object?> {}
/*class: D1:A<Object?>,B<dynamic>,D1,Object*/
/*member: D1.member:dynamic Function()*/
abstract class D1 extends A<Object?> with B<dynamic> {}
/*class: D2:A<void>,B<Object?>,D2,Object*/
/*member: D2.member:Object? Function()*/
abstract class D2 extends A<void> with B<Object?> {}
/*class: D3:A<Object?>,B<void>,D3,Object*/
/*member: D3.member:void Function()*/
abstract class D3 extends A<Object?> with B<void> {}
/*class: D4:A<void>,B<dynamic>,D4,Object*/
/*member: D4.member:dynamic Function()*/
abstract class D4 extends A<void> with B<dynamic> {}
/*class: D5:A<dynamic>,B<void>,D5,Object*/
/*member: D5.member:void Function()*/
abstract class D5 extends A<dynamic> with B<void> {}
/*class: D6:A<void>,B<void>,D6,Object*/
/*member: D6.member:void Function()*/
abstract class D6 extends A<void> with B<void> {}
/*class: D7:A<dynamic>,B<dynamic>,D7,Object*/
/*member: D7.member:dynamic Function()*/
abstract class D7 extends A<dynamic> with B<dynamic> {}
@@ -32,8 +32,7 @@ abstract class D {
/*class: E1:A,B,C,D,E1,Object*/
abstract class E1 implements A, B, C, D {
/*cfe|cfe:builder.member: E1.method:void Function(void)*/
/*analyzer.member: E1.method:Object? Function(Object?)*/
/*member: E1.method:Object? Function(Object?)*/
}
/*class: E2:A,B,E2,Object*/
@@ -43,14 +42,12 @@ abstract class E2 implements A, B {
/*class: E3:B,C,E3,Object*/
abstract class E3 implements B, C {
/*cfe|cfe:builder.member: E3.method:void Function(void)*/
/*analyzer.member: E3.method:Object? Function(Object?)*/
/*member: E3.method:Object? Function(Object?)*/
}
/*class: E4:A,C,E4,Object*/
abstract class E4 implements A, C {
/*cfe|cfe:builder.member: E4.method:void Function(void)*/
/*analyzer.member: E4.method:Object? Function(Object?)*/
/*member: E4.method:Object? Function(Object?)*/
}
/*class: E5:A,D,E5,Object*/
@@ -71,24 +68,20 @@ abstract class F {
/*class: G1:A,C,F,G1,Object*/
abstract class G1 implements A, C, F {
/*cfe|cfe:builder.member: G1.method:void Function(void)*/
/*analyzer.member: G1.method:Object? Function(Object?)*/
/*member: G1.method:Object? Function(Object?)*/
}
/*class: G2:A,C,F,G2,Object*/
abstract class G2 implements A, F, C {
/*cfe|cfe:builder.member: G2.method:void Function(void)*/
/*analyzer.member: G2.method:Object? Function(Object?)*/
/*member: G2.method:Object? Function(Object?)*/
}
/*class: G3:A,C,F,G3,Object*/
abstract class G3 implements C, A, F {
/*cfe|cfe:builder.member: G3.method:void Function(void)*/
/*analyzer.member: G3.method:Object? Function(Object?)*/
/*member: G3.method:Object? Function(Object?)*/
}
/*class: G4:A,C,F,G4,Object*/
abstract class G4 implements C, F, A {
/*cfe|cfe:builder.member: G4.method:void Function(void)*/
/*analyzer.member: G4.method:Object? Function(Object?)*/
/*member: G4.method:Object? Function(Object?)*/
}
@@ -40,7 +40,7 @@ abstract class G extends core::Object implements self::C {
abstract class H extends core::Object implements self::D, self::E, self::F, self::C {
synthetic constructor •() → self::H
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class I extends core::Object implements self::D {
synthetic constructor •() → self::I
@@ -50,17 +50,17 @@ abstract class I extends core::Object implements self::D {
abstract class J extends core::Object implements self::H {
synthetic constructor •() → self::J
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
abstract class K extends core::Object implements self::I, self::E, self::G {
synthetic constructor •() → self::K
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class L extends core::Object implements self::K {
synthetic constructor •() → self::L
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
static method main() → dynamic
;
@@ -48,7 +48,7 @@ abstract class H extends core::Object implements self::D, self::E, self::F, self
synthetic constructor •() → self::H
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class I extends core::Object implements self::D {
synthetic constructor •() → self::I
@@ -60,18 +60,18 @@ abstract class J extends core::Object implements self::H {
synthetic constructor •() → self::J
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
abstract class K extends core::Object implements self::I, self::E, self::G {
synthetic constructor •() → self::K
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class L extends core::Object implements self::K {
synthetic constructor •() → self::L
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
static method main() → dynamic {}
@@ -48,7 +48,7 @@ abstract class H extends core::Object implements self::D, self::E, self::F, self
synthetic constructor •() → self::H
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class I extends core::Object implements self::D {
synthetic constructor •() → self::I
@@ -60,18 +60,18 @@ abstract class J extends core::Object implements self::H {
synthetic constructor •() → self::J
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
abstract class K extends core::Object implements self::I, self::E, self::G {
synthetic constructor •() → self::K
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class L extends core::Object implements self::K {
synthetic constructor •() → self::L
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
static method main() → dynamic {}
@@ -48,7 +48,7 @@ abstract class H extends core::Object implements self::D, self::E, self::F, self
synthetic constructor •() → self::H
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class I extends core::Object implements self::D {
synthetic constructor •() → self::I
@@ -60,18 +60,18 @@ abstract class J extends core::Object implements self::H {
synthetic constructor •() → self::J
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
abstract class K extends core::Object implements self::I, self::E, self::G {
synthetic constructor •() → self::K
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class L extends core::Object implements self::K {
synthetic constructor •() → self::L
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
static method main() → dynamic {}
@@ -48,7 +48,7 @@ abstract class H extends core::Object implements self::D, self::E, self::F, self
synthetic constructor •() → self::H
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class I extends core::Object implements self::D {
synthetic constructor •() → self::I
@@ -60,18 +60,18 @@ abstract class J extends core::Object implements self::H {
synthetic constructor •() → self::J
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
abstract class K extends core::Object implements self::I, self::E, self::G {
synthetic constructor •() → self::K
: super core::Object::•()
;
abstract forwarding-stub member-signature method m(covariant core::num a) → void;
abstract forwarding-stub member-signature method m(covariant core::num a) → core::Object?;
}
abstract class L extends core::Object implements self::K {
synthetic constructor •() → self::L
: super core::Object::•()
;
abstract method m(covariant core::num a) → void;
abstract method m(covariant core::num a) → core::Object?;
}
static method main() → dynamic {}
@@ -0,0 +1,17 @@
// 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.
import 'issue41567_lib.dart';
class B extends A {}
class in1 extends out_Object implements B {} // ok
class in2 extends B implements out_Object {} // ok
class in3 extends out_int implements B {} // error
class in4 extends B implements out_int {} // error
main() {}
@@ -0,0 +1,58 @@
//
// Problems in component:
//
// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A<int>' and 'A<dynamic>'
// - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in3 extends out_int implements B {} // error
// ^
//
// pkg/front_end/testcases/nnbd/issue41567.dart:15:7: Error: 'in4' can't implement both 'A<dynamic>' and 'A<int>'
// - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in4 extends B implements out_int {} // error
// ^
//
library /*isNonNullableByDefault*/;
import self as self;
import "issue41567_lib.dart" as iss;
import "org-dartlang-testcase:///issue41567_lib.dart";
class B extends iss::A<dynamic> {
synthetic constructor •() → self::B
;
}
class in1 extends iss::out_Object implements self::B {
synthetic constructor •() → self::in1
;
}
class in2 extends self::B implements iss::out_Object {
synthetic constructor •() → self::in2
;
}
class in3 extends iss::out_int implements self::B {
synthetic constructor •() → self::in3
;
}
class in4 extends self::B implements iss::out_int {
synthetic constructor •() → self::in4
;
}
static method main() → dynamic
;
library;
import self as iss;
import "dart:core" as core;
class A<T extends core::Object* = dynamic> extends core::Object {
synthetic constructor •() → iss::A<iss::A::T*>*
;
}
class out_int extends iss::A<core::int*> {
synthetic constructor •() → iss::out_int*
;
}
class out_Object extends iss::A<core::Object*> {
synthetic constructor •() → iss::out_Object*
;
}
@@ -0,0 +1,65 @@
//
// Problems in component:
//
// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A<int>' and 'A<dynamic>'
// - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in3 extends out_int implements B {} // error
// ^
//
// pkg/front_end/testcases/nnbd/issue41567.dart:15:7: Error: 'in4' can't implement both 'A<dynamic>' and 'A<int>'
// - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in4 extends B implements out_int {} // error
// ^
//
library /*isNonNullableByDefault*/;
import self as self;
import "issue41567_lib.dart" as iss;
import "org-dartlang-testcase:///issue41567_lib.dart";
class B extends iss::A<dynamic> {
synthetic constructor •() → self::B
: super iss::A::•()
;
}
class in1 extends iss::out_Object implements self::B {
synthetic constructor •() → self::in1
: super iss::out_Object::•()
;
}
class in2 extends self::B implements iss::out_Object {
synthetic constructor •() → self::in2
: super self::B::•()
;
}
class in3 extends iss::out_int implements self::B {
synthetic constructor •() → self::in3
: super iss::out_int::•()
;
}
class in4 extends self::B implements iss::out_int {
synthetic constructor •() → self::in4
: super self::B::•()
;
}
static method main() → dynamic {}
library;
import self as iss;
import "dart:core" as core;
class A<T extends core::Object* = dynamic> extends core::Object {
synthetic constructor •() → iss::A<iss::A::T*>*
: super core::Object::•()
;
}
class out_int extends iss::A<core::int*> {
synthetic constructor •() → iss::out_int*
: super iss::A::•()
;
}
class out_Object extends iss::A<core::Object*> {
synthetic constructor •() → iss::out_Object*
: super iss::A::•()
;
}
@@ -0,0 +1,65 @@
//
// Problems in component:
//
// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A<int>' and 'A<dynamic>'
// - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in3 extends out_int implements B {} // error
// ^
//
// pkg/front_end/testcases/nnbd/issue41567.dart:15:7: Error: 'in4' can't implement both 'A<dynamic>' and 'A<int>'
// - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in4 extends B implements out_int {} // error
// ^
//
library /*isNonNullableByDefault*/;
import self as self;
import "issue41567_lib.dart" as iss;
import "org-dartlang-testcase:///issue41567_lib.dart";
class B extends iss::A<dynamic> {
synthetic constructor •() → self::B
: super iss::A::•()
;
}
class in1 extends iss::out_Object implements self::B {
synthetic constructor •() → self::in1
: super iss::out_Object::•()
;
}
class in2 extends self::B implements iss::out_Object {
synthetic constructor •() → self::in2
: super self::B::•()
;
}
class in3 extends iss::out_int implements self::B {
synthetic constructor •() → self::in3
: super iss::out_int::•()
;
}
class in4 extends self::B implements iss::out_int {
synthetic constructor •() → self::in4
: super self::B::•()
;
}
static method main() → dynamic {}
library;
import self as iss;
import "dart:core" as core;
class A<T extends core::Object* = dynamic> extends core::Object {
synthetic constructor •() → iss::A<iss::A::T*>*
: super core::Object::•()
;
}
class out_int extends iss::A<core::int*> {
synthetic constructor •() → iss::out_int*
: super iss::A::•()
;
}
class out_Object extends iss::A<core::Object*> {
synthetic constructor •() → iss::out_Object*
: super iss::A::•()
;
}
@@ -0,0 +1,11 @@
// 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.6
class A<T> {}
class out_int extends A<int> {}
class out_Object extends A<Object> {}
+1
View File
@@ -40,6 +40,7 @@ inference/mixin_inference_outwards_4: TypeCheckError
inference/mixin_inference_unification_1: TypeCheckError
inference/mixin_inference_unification_2: TypeCheckError
nnbd/inheritance_from_opt_in: TypeCheckError
nnbd/issue41567: TypeCheckError
nnbd/messages_with_types_opt_in: TypeCheckError
nnbd/messages_with_types_opt_out: TypeCheckError
nnbd/never_opt_out: TypeCheckError
+1
View File
@@ -167,6 +167,7 @@ instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError #
instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
nnbd/inheritance_from_opt_in: TypeCheckError
nnbd/issue41180: RuntimeError # Strong mode runtime checking fails due to mixed strong mode.
nnbd/issue41567: TypeCheckError
nnbd/messages_with_types_opt_in: TypeCheckError
nnbd/messages_with_types_opt_out: TypeCheckError
nnbd/never_opt_out: TypeCheckError
@@ -165,6 +165,7 @@ instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError
instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError
nnbd/inheritance_from_opt_in: TypeCheckError
nnbd/issue41180: RuntimeError
nnbd/issue41567: TypeCheckError
nnbd/messages_with_types_opt_in: TypeCheckError
nnbd/messages_with_types_opt_out: TypeCheckError
nnbd/never_opt_out: TypeCheckError
+1
View File
@@ -59,6 +59,7 @@ general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
general_nnbd_opt_out/unsound_promotion: TypeCheckError
general_nnbd_opt_out/void_methods: RuntimeError
nnbd/inheritance_from_opt_in: TypeCheckError
nnbd/issue41567: TypeCheckError
nnbd/messages_with_types_opt_in: TypeCheckError
nnbd/messages_with_types_opt_out: TypeCheckError
nnbd/never_opt_out: TypeCheckError
+12 -12
View File
@@ -55,8 +55,8 @@ class NnbdTopMergeVisitor extends MergeVisitor {
// NNBD_TOP_MERGE(Object?, dynamic) = Object?
return coreTypes.objectNullableRawType;
} else if (b is VoidType) {
// NNBD_TOP_MERGE(Object?, void) = void
return const VoidType();
// NNBD_TOP_MERGE(Object?, void) = Object?
return coreTypes.objectNullableRawType;
} else if (b == coreTypes.objectNullableRawType) {
// NNBD_TOP_MERGE(Object?, Object?) = Object?
return coreTypes.objectNullableRawType;
@@ -66,8 +66,8 @@ class NnbdTopMergeVisitor extends MergeVisitor {
// NNBD_TOP_MERGE(Object*, dynamic) = Object?
return coreTypes.objectNullableRawType;
} else if (b is VoidType) {
// NNBD_TOP_MERGE(Object*, void) = void
return const VoidType();
// NNBD_TOP_MERGE(Object*, void) = Object?
return coreTypes.objectNullableRawType;
}
} else if (a == coreTypes.nullType &&
b is NeverType &&
@@ -81,17 +81,17 @@ class NnbdTopMergeVisitor extends MergeVisitor {
@override
DartType visitVoidType(VoidType a, DartType b) {
if (b is DynamicType) {
// NNBD_TOP_MERGE(void, dynamic) = void
return const VoidType();
// NNBD_TOP_MERGE(void, dynamic) = Object?
return coreTypes.objectNullableRawType;
} else if (b is VoidType) {
// NNBD_TOP_MERGE(void, void) = void
return const VoidType();
} else if (b == coreTypes.objectNullableRawType) {
// NNBD_TOP_MERGE(void, Object?) = void
return const VoidType();
// NNBD_TOP_MERGE(void, Object?) = Object?
return coreTypes.objectNullableRawType;
} else if (b == coreTypes.objectLegacyRawType) {
// NNBD_TOP_MERGE(void, Object*) = void
return const VoidType();
// NNBD_TOP_MERGE(void, Object*) = Object?
return coreTypes.objectNullableRawType;
}
return null;
}
@@ -102,8 +102,8 @@ class NnbdTopMergeVisitor extends MergeVisitor {
// NNBD_TOP_MERGE(dynamic, dynamic) = dynamic
return const DynamicType();
} else if (b is VoidType) {
// NNBD_TOP_MERGE(dynamic, void) = void
return const VoidType();
// NNBD_TOP_MERGE(dynamic, void) = Object?
return coreTypes.objectNullableRawType;
} else if (b == coreTypes.objectNullableRawType) {
// NNBD_TOP_MERGE(dynamic, Object?) = Object?
return coreTypes.objectNullableRawType;
+6 -6
View File
@@ -17,10 +17,10 @@ const Map<String, dynamic> data = {
'Object vs Object': 'Object',
'dynamic vs dynamic': 'dynamic',
'void vs void': 'void',
'Object? vs void': 'void',
'Object* vs void': 'void',
'Object? vs void': 'Object?',
'Object* vs void': 'Object?',
'Object vs void': null,
'dynamic vs void': 'void',
'dynamic vs void': 'Object?',
'Object? vs dynamic': 'Object?',
'Object* vs dynamic': 'Object?',
'Object vs dynamic': null,
@@ -41,10 +41,10 @@ const Map<String, dynamic> data = {
'List<Object> vs List<Object>': 'List<Object>',
'List<dynamic> vs List<dynamic>': 'List<dynamic>',
'List<void> vs List<void>': 'List<void>',
'List<Object?> vs List<void>': 'List<void>',
'List<Object*> vs List<void>': 'List<void>',
'List<Object?> vs List<void>': 'List<Object?>',
'List<Object*> vs List<void>': 'List<Object?>',
'List<Object> vs List<void>': null,
'List<dynamic> vs List<void>': 'List<void>',
'List<dynamic> vs List<void>': 'List<Object?>',
'List<Object?> vs List<dynamic>': 'List<Object?>',
'List<Object*> vs List<dynamic>': 'List<Object?>',
'List<Object> vs List<dynamic>': null,