[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:
committed by
commit-bot@chromium.org
parent
3c0e9642d2
commit
3f18d37333
@@ -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> {}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user