Version 2.14.0-393.0.dev
Merge commit '934136d239e65c47d7fb6b9e30a462099bf7cdc9' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 90d2f7b..3cc531a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -4787,11 +4787,13 @@
!isThisReceiver) {
Member interfaceMember = readTarget.member!;
if (interfaceMember is Procedure) {
+ DartType typeToCheck = inferrer.isNonNullableByDefault
+ ? interfaceMember.function
+ .computeFunctionType(inferrer.library.nonNullable)
+ : interfaceMember.function.returnType;
checkReturn =
TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
- interfaceMember.enclosingClass!,
- interfaceMember.function
- .computeFunctionType(inferrer.library.nonNullable));
+ interfaceMember.enclosingClass!, typeToCheck);
} else if (interfaceMember is Field) {
checkReturn =
TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
diff --git a/pkg/front_end/testcases/general/bug33298.dart.weak.expect b/pkg/front_end/testcases/general/bug33298.dart.weak.expect
index bac28d2..397db9f 100644
--- a/pkg/front_end/testcases/general/bug33298.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bug33298.dart.weak.expect
@@ -65,7 +65,7 @@
core::List<core::String*>* list1 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(a.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
core::List<core::String*>* list2 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
self::B<core::String*>* b = new self::B::•<core::String*>();
- core::List<core::String*>* list3 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*} as{TypeError,CovarianceCheck} (core::String*) →* core::String*){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+ core::List<core::String*>* list3 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
core::List<core::String*>* list4 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
self::C* c = new self::C::•();
core::List<core::String*>* list5 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(c.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}<core::String*>){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
diff --git a/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect
index 2fa1eb2..8f7030e 100644
--- a/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect
@@ -65,7 +65,7 @@
core::List<core::String*>* list1 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(a.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
core::List<core::String*>* list2 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
self::B<core::String*>* b = new self::B::•<core::String*>();
- core::List<core::String*>* list3 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*} as{TypeError,CovarianceCheck} (core::String*) →* core::String*){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+ core::List<core::String*>* list3 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
core::List<core::String*>* list4 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
self::C* c = new self::C::•();
core::List<core::String*>* list5 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(c.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}<core::String*>){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart
new file mode 100644
index 0000000..60aebf5
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, 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<X extends num> {
+ void f<Y extends X>(Y y) {}
+}
+
+expectThrows(void Function() f) {
+ try {
+ f();
+ } catch (e) {
+ return;
+ }
+ throw "Expected an exception to be thrown!";
+}
+
+main() {
+ A<num> a = new A<int>();
+ void Function<Y extends num>(Y) f = a.f;
+ expectThrows(() {
+ f(3.14);
+ });
+}
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.textual_outline.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.textual_outline.expect
new file mode 100644
index 0000000..29b47f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+// @dart = 2.6
+class A<X extends num> {
+ void f<Y extends X>(Y y) {}
+}
+
+expectThrows(void Function() f) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..29b47f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+// @dart = 2.6
+class A<X extends num> {
+ void f<Y extends X>(Y y) {}
+}
+
+expectThrows(void Function() f) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.expect
new file mode 100644
index 0000000..9be07d6
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num*> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X*>*
+ : super core::Object::•()
+ ;
+ method f<generic-covariant-impl Y extends self::A::X*>(self::A::f::Y* y) → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method expectThrows(() →* void f) → dynamic {
+ try {
+ f(){() →* void};
+ }
+ on dynamic catch(final dynamic e) {
+ return;
+ }
+ throw "Expected an exception to be thrown!";
+}
+static method main() → dynamic {
+ self::A<core::num*>* a = new self::A::•<core::int*>();
+ <Y extends core::num*>(Y*) →* void f = a.{self::A::f}{<generic-covariant-impl Y extends core::num*>(Y*) →* void};
+ self::expectThrows(() → Null {
+ f<core::double*>(3.14){(core::double*) →* void};
+ });
+}
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.outline.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.outline.expect
new file mode 100644
index 0000000..50b76a4
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num*> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X*>*
+ ;
+ method f<generic-covariant-impl Y extends self::A::X*>(self::A::f::Y* y) → void
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method expectThrows(() →* void f) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.transformed.expect
new file mode 100644
index 0000000..9be07d6
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num*> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X*>*
+ : super core::Object::•()
+ ;
+ method f<generic-covariant-impl Y extends self::A::X*>(self::A::f::Y* y) → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method expectThrows(() →* void f) → dynamic {
+ try {
+ f(){() →* void};
+ }
+ on dynamic catch(final dynamic e) {
+ return;
+ }
+ throw "Expected an exception to be thrown!";
+}
+static method main() → dynamic {
+ self::A<core::num*>* a = new self::A::•<core::int*>();
+ <Y extends core::num*>(Y*) →* void f = a.{self::A::f}{<generic-covariant-impl Y extends core::num*>(Y*) →* void};
+ self::expectThrows(() → Null {
+ f<core::double*>(3.14){(core::double*) →* void};
+ });
+}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart
index 11693a1..0d4dd96 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart
@@ -15,7 +15,7 @@
}
F<num> g1(C<num> c) {
- return c. /*@ checkReturn=(num*) ->* void*/ f1;
+ return c.f1;
}
void g2(C<int> c, Object x) {
@@ -24,7 +24,7 @@
}
G<List<num>, num> g3(C<num> c) {
- return c. /*@ checkReturn=(List<num*>*) ->* num**/ f2;
+ return c.f2;
}
void test() {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.expect
index 5d38dc5..05ac14b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.expect
@@ -23,14 +23,14 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method g1(self::C<core::num*>* c) → (core::num*) →* void {
- return c.{self::C::f1}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+ return c.{self::C::f1}{(core::num*) →* void};
}
static method g2(self::C<core::int*>* c, core::Object* x) → void {
(core::Object*) →* void f = self::g1(c) as (core::Object*) →* void;
f(x){(core::Object*) →* void};
}
static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
- return c.{self::C::f2}{(core::List<core::num*>*) →* core::num*} as{TypeError,CovarianceCheck} (core::List<core::num*>*) →* core::num*;
+ return c.{self::C::f2}{(core::List<core::num*>*) →* core::num*};
}
static method test() → void {
(core::num*) →* void x = self::g1(new self::C::•<core::int*>());
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.transformed.expect
index 5d38dc5..05ac14b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.transformed.expect
@@ -23,14 +23,14 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method g1(self::C<core::num*>* c) → (core::num*) →* void {
- return c.{self::C::f1}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+ return c.{self::C::f1}{(core::num*) →* void};
}
static method g2(self::C<core::int*>* c, core::Object* x) → void {
(core::Object*) →* void f = self::g1(c) as (core::Object*) →* void;
f(x){(core::Object*) →* void};
}
static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
- return c.{self::C::f2}{(core::List<core::num*>*) →* core::num*} as{TypeError,CovarianceCheck} (core::List<core::num*>*) →* core::num*;
+ return c.{self::C::f2}{(core::List<core::num*>*) →* core::num*};
}
static method test() → void {
(core::num*) →* void x = self::g1(new self::C::•<core::int*>());
diff --git a/tools/VERSION b/tools/VERSION
index 766dd7a..dcb9cbd 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 392
+PRERELEASE 393
PRERELEASE_PATCH 0
\ No newline at end of file