diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/infer_parameter_opt_in.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/infer_parameter_opt_in.dart index ce6524550cd..0ee78c73e7f 100644 --- a/pkg/_fe_analyzer_shared/test/inheritance/data/infer_parameter_opt_in.dart +++ b/pkg/_fe_analyzer_shared/test/inheritance/data/infer_parameter_opt_in.dart @@ -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}) {} } diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart index a388a8d1320..5b562498dab 100644 --- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart +++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart @@ -19,8 +19,7 @@ class A_void implements A {} /*class: B1:A,A_Object,A_dynamic,B1,Object*/ class B1 extends A_Object implements A_dynamic {} -/*cfe|cfe:builder.class: B2:A,A_Object,A_void,B2,Object*/ -/*analyzer.class: B2:A,A_Object,A_void,B2,Object*/ +/*class: B2:A,A_Object,A_void,B2,Object*/ class B2 extends A_Object implements A_void {} main() {} diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart index a84f5d184af..64689932a84 100644 --- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart +++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart @@ -15,8 +15,7 @@ class A_void implements A {} /*class: B1:A,A_Object,A_dynamic,B1,Object*/ class B1 extends A_Object implements A_dynamic {} -/*cfe|cfe:builder.class: B2:A,A_Object,A_void,B2,Object*/ -/*analyzer.class: B2:A,A_Object,A_void,B2,Object*/ +/*class: B2:A,A_Object,A_void,B2,Object*/ class B2 extends A_Object implements A_void {} main() {} diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_direct.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_direct.dart new file mode 100644 index 00000000000..bb1b4ab637e --- /dev/null +++ b/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_direct.dart @@ -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,Object*/ +class A { + /*member: A.member:T Function()*/ + T member() => throw "Unreachable"; +} + +/*class: B:A,B,Object*/ +/*member: B.member:T Function()*/ +class B extends A {} + +/*class: D0:A,B,D0,Object*/ +/*member: D0.member:Object? Function()*/ +class D0 extends A implements B {} + +/*class: D1:A,B,D1,Object*/ +/*member: D1.member:Object? Function()*/ +class D1 extends A implements B {} + +/*class: D2:A,B,D2,Object*/ +/*member: D2.member:Object? Function()*/ +class D2 extends A implements B {} + +/*class: D3:A,B,D3,Object*/ +/*member: D3.member:Object? Function()*/ +class D3 extends A implements B {} + +/*class: D4:A,B,D4,Object*/ +/*member: D4.member:Object? Function()*/ +class D4 extends A implements B {} + +/*class: D5:A,B,D5,Object*/ +/*member: D5.member:Object? Function()*/ +class D5 extends A implements B {} + +/*class: D6:A,B,D6,Object*/ +/*member: D6.member:void Function()*/ +class D6 extends A implements B {} + +/*class: D7:A,B,D7,Object*/ +/*member: D7.member:dynamic Function()*/ +class D7 extends A implements B {} diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_mixin.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_mixin.dart new file mode 100644 index 00000000000..597a802b8ab --- /dev/null +++ b/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_mixin.dart @@ -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,Object*/ +abstract class A { + /*member: A.member:T Function()*/ + T member(); +} + +/*cfe|cfe:builder.class: B:B,Object*/ +/*cfe|cfe:builder.member: B.member:T Function()*/ +mixin B { + T member(); +} + +/*class: D0:A,B,D0,Object*/ +/*member: D0.member:Object? Function()*/ +abstract class D0 extends A with B {} + +/*class: D1:A,B,D1,Object*/ +/*member: D1.member:dynamic Function()*/ +abstract class D1 extends A with B {} + +/*class: D2:A,B,D2,Object*/ +/*member: D2.member:Object? Function()*/ +abstract class D2 extends A with B {} + +/*class: D3:A,B,D3,Object*/ +/*member: D3.member:void Function()*/ +abstract class D3 extends A with B {} + +/*class: D4:A,B,D4,Object*/ +/*member: D4.member:dynamic Function()*/ +abstract class D4 extends A with B {} + +/*class: D5:A,B,D5,Object*/ +/*member: D5.member:void Function()*/ +abstract class D5 extends A with B {} + +/*class: D6:A,B,D6,Object*/ +/*member: D6.member:void Function()*/ +abstract class D6 extends A with B {} + +/*class: D7:A,B,D7,Object*/ +/*member: D7.member:dynamic Function()*/ +abstract class D7 extends A with B {} diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_opt_in.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_opt_in.dart index bd4dc1f0e52..3845f870d4d 100644 --- a/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_opt_in.dart +++ b/pkg/_fe_analyzer_shared/test/inheritance/data/top_merge_opt_in.dart @@ -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?)*/ } diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect index 5f8c4b8f1e7..f0f39bc4674 100644 --- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect +++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect @@ -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 ; diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect index cc03fc1a27c..85e72a08854 100644 --- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect +++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect @@ -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 {} diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect index cc03fc1a27c..85e72a08854 100644 --- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect @@ -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 {} diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect index cc03fc1a27c..85e72a08854 100644 --- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect +++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect @@ -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 {} diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect index cc03fc1a27c..85e72a08854 100644 --- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect @@ -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 {} diff --git a/pkg/front_end/testcases/nnbd/issue41567.dart b/pkg/front_end/testcases/nnbd/issue41567.dart new file mode 100644 index 00000000000..9df55901081 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41567.dart @@ -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() {} diff --git a/pkg/front_end/testcases/nnbd/issue41567.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41567.dart.outline.expect new file mode 100644 index 00000000000..4214a62dda3 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41567.dart.outline.expect @@ -0,0 +1,58 @@ +// +// Problems in component: +// +// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A' and 'A' +// - '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' and 'A' +// - '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 { + 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 extends core::Object { + synthetic constructor •() → iss::A* + ; +} +class out_int extends iss::A { + synthetic constructor •() → iss::out_int* + ; +} +class out_Object extends iss::A { + synthetic constructor •() → iss::out_Object* + ; +} diff --git a/pkg/front_end/testcases/nnbd/issue41567.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41567.dart.strong.expect new file mode 100644 index 00000000000..5ae9d2565d4 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41567.dart.strong.expect @@ -0,0 +1,65 @@ +// +// Problems in component: +// +// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A' and 'A' +// - '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' and 'A' +// - '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 { + 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 extends core::Object { + synthetic constructor •() → iss::A* + : super core::Object::•() + ; +} +class out_int extends iss::A { + synthetic constructor •() → iss::out_int* + : super iss::A::•() + ; +} +class out_Object extends iss::A { + synthetic constructor •() → iss::out_Object* + : super iss::A::•() + ; +} diff --git a/pkg/front_end/testcases/nnbd/issue41567.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41567.dart.weak.expect new file mode 100644 index 00000000000..5ae9d2565d4 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41567.dart.weak.expect @@ -0,0 +1,65 @@ +// +// Problems in component: +// +// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A' and 'A' +// - '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' and 'A' +// - '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 { + 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 extends core::Object { + synthetic constructor •() → iss::A* + : super core::Object::•() + ; +} +class out_int extends iss::A { + synthetic constructor •() → iss::out_int* + : super iss::A::•() + ; +} +class out_Object extends iss::A { + synthetic constructor •() → iss::out_Object* + : super iss::A::•() + ; +} diff --git a/pkg/front_end/testcases/nnbd/issue41567_lib.dart b/pkg/front_end/testcases/nnbd/issue41567_lib.dart new file mode 100644 index 00000000000..e45bcd9a40c --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41567_lib.dart @@ -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 {} + +class out_int extends A {} + +class out_Object extends A {} diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status index ca35b47ab32..8103acb98f3 100644 --- a/pkg/front_end/testcases/outline.status +++ b/pkg/front_end/testcases/outline.status @@ -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 diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status index fb0f63b534c..907af6e9143 100644 --- a/pkg/front_end/testcases/strong.status +++ b/pkg/front_end/testcases/strong.status @@ -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 diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status index d42f2cb7143..41d9cf99cc5 100644 --- a/pkg/front_end/testcases/text_serialization.status +++ b/pkg/front_end/testcases/text_serialization.status @@ -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 diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status index 23e902357bb..4de00b084ea 100644 --- a/pkg/front_end/testcases/weak.status +++ b/pkg/front_end/testcases/weak.status @@ -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 diff --git a/pkg/kernel/lib/src/nnbd_top_merge.dart b/pkg/kernel/lib/src/nnbd_top_merge.dart index 317b1df612e..f0c5b4e71c5 100644 --- a/pkg/kernel/lib/src/nnbd_top_merge.dart +++ b/pkg/kernel/lib/src/nnbd_top_merge.dart @@ -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; diff --git a/pkg/kernel/test/nnbd_top_merge_test.dart b/pkg/kernel/test/nnbd_top_merge_test.dart index da9bd8d89dd..4eb5d4069da 100644 --- a/pkg/kernel/test/nnbd_top_merge_test.dart +++ b/pkg/kernel/test/nnbd_top_merge_test.dart @@ -17,10 +17,10 @@ const Map 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 data = { 'List vs List': 'List', 'List vs List': 'List', 'List vs List': 'List', - 'List vs List': 'List', - 'List vs List': 'List', + 'List vs List': 'List', + 'List vs List': 'List', 'List vs List': null, - 'List vs List': 'List', + 'List vs List': 'List', 'List vs List': 'List', 'List vs List': 'List', 'List vs List': null,