Version 2.12.0-6.0.dev
Merge commit '5efe55abf71056690842e95536ba44e5d215efea' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index ff5fd50..8207e58 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -952,9 +952,12 @@
// potentially nullable access.
isPotentiallyNullable: false);
}
- if (includeExtensionMethods) {
+ if (includeExtensionMethods && receiverBound is! DynamicType) {
ObjectAccessTarget target = _findExtensionMember(
- receiverBound, coreTypes.objectClass, name, fileOffset,
+ isNonNullableByDefault ? receiverType : receiverBound,
+ coreTypes.objectClass,
+ name,
+ fileOffset,
setter: setter);
if (target != null) {
return target;
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..dbc33c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.transformed.expect
@@ -0,0 +1,88 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_bound_access.dart:22:36: Error: The getter 'length' isn't defined for the class 'num'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+// num method2() => field1 + field2.length;
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+ generic-covariant-impl field self::DynamicClass::T* field1;
+ generic-covariant-impl field self::DynamicClass::T* field2;
+ constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
+ : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
+ ;
+ method method() → dynamic
+ return this.{self::DynamicClass::field1}.*(this.{self::DynamicClass::field2});
+ 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
+}
+class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+ generic-covariant-impl field self::NumClass::T* field1;
+ generic-covariant-impl field self::NumClass::S* field2;
+ constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
+ : self::NumClass::field1 = field1, self::NumClass::field2 = field2, super core::Object::•()
+ ;
+ method method1() → core::num*
+ return this.{self::NumClass::field1}.{core::num::*}(this.{self::NumClass::field2});
+ method method2() → core::num*
+ return this.{self::NumClass::field1}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/type_variable_bound_access.dart:22:36: Error: The getter 'length' isn't defined for the class 'num'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+ num method2() => field1 + field2.length;
+ ^^^^^^");
+ 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
+}
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+ generic-covariant-impl field self::Class::X0* field0 = null;
+ generic-covariant-impl field self::Class::X1* field1 = null;
+ generic-covariant-impl field self::Class::X2* field2 = null;
+ generic-covariant-impl field self::Class::X3* field3 = null;
+ generic-covariant-impl field self::Class::X4* field4 = null;
+ generic-covariant-impl field self::Class::X5* field5 = null;
+ synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+ : super core::Object::•()
+ ;
+ method method() → dynamic {
+ this.{self::Class::field0}.{core::int::isEven};
+ this.{self::Class::field1}.{core::int::isEven};
+ this.{self::Class::field2}.{core::int::isEven};
+ this.{self::Class::field3}.{core::int::isEven};
+ this.{self::Class::field4}.{core::int::isEven};
+ this.{self::Class::field5}.{core::int::isEven};
+ }
+ 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 main() → dynamic {
+ new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
+ new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
+}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.transformed.expect
new file mode 100644
index 0000000..a7cabde
--- /dev/null
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.transformed.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart:24:36: Error: The getter 'length' isn't defined for the class 'num'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+// num method2() => field1 + field2.length;
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+ generic-covariant-impl field self::DynamicClass::T* field1;
+ generic-covariant-impl field self::DynamicClass::T* field2;
+ constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
+ : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
+ ;
+ method method() → dynamic
+ return this.{self::DynamicClass::field1}.*(this.{self::DynamicClass::field2});
+ 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
+}
+class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+ generic-covariant-impl field self::NumClass::T* field1;
+ generic-covariant-impl field self::NumClass::S* field2;
+ constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
+ : self::NumClass::field1 = field1, self::NumClass::field2 = field2, super core::Object::•()
+ ;
+ method method1() → core::num*
+ return this.{self::NumClass::field1}.{core::num::*}(this.{self::NumClass::field2});
+ method method2() → core::num*
+ return this.{self::NumClass::field1}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart:24:36: Error: The getter 'length' isn't defined for the class 'num'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+ num method2() => field1 + field2.length;
+ ^^^^^^");
+ 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 main() → dynamic {
+ new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
+ new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart b/pkg/front_end/testcases/nnbd/issue43591.dart
new file mode 100644
index 0000000..f845be9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart
@@ -0,0 +1,26 @@
+// 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.
+
+extension E<T> on T {
+ T Function(T) get f => (T t) => t;
+}
+
+method1<S>(S s) {
+ S Function(S) f = s.f;
+}
+
+method2<S extends dynamic>(S s) {
+ throws(() => s.f);
+}
+
+main() {}
+
+throws(void Function() f) {
+ try {
+ f();
+ } catch (e) {
+ return;
+ }
+ throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.outline.expect
new file mode 100644
index 0000000..dbf8690
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+ get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+ ;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic
+ ;
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic
+ ;
+static method main() → dynamic
+ ;
+static method throws(() → void f) → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+ get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+ return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+ (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+ self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+ try {
+ f.call();
+ }
+ on core::Object catch(final core::Object e) {
+ return;
+ }
+ throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+ get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+ return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+ (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+ self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+ try {
+ f.call();
+ }
+ on core::Object catch(final core::Object e) {
+ return;
+ }
+ throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.textual_outline.expect
new file mode 100644
index 0000000..eb34b94
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+extension E<T> (){}
+on T (){}
+method1<S>(S s) {}
+method2<S extends dynamic>(S s) {}
+main() {}
+throws(void Function() f) {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+ get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+ return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+ (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+ self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+ try {
+ f.call();
+ }
+ on core::Object catch(final core::Object e) {
+ return;
+ }
+ throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+ get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+ return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+ (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+ self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+ try {
+ f.call();
+ }
+ on core::Object catch(final core::Object e) {
+ return;
+ }
+ throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index c5561f0..452295f 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -90,7 +90,6 @@
general/spread_collection: RuntimeError
general/type_parameter_type_named_int: RuntimeError # Expected
general/type_variable_as_super: RuntimeError
-general/type_variable_bound_access: TypeCheckError
general/unsound_promotion: TypeCheckError
general/void_methods: RuntimeError
general/with_dependencies/issue_43084/issue_43084: RuntimeError
@@ -138,7 +137,6 @@
general_nnbd_opt_out/statements: Crash
general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError # Expected
general_nnbd_opt_out/type_variable_as_super: RuntimeError
-general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
general_nnbd_opt_out/unsound_promotion: TypeCheckError
general_nnbd_opt_out/void_methods: RuntimeError
inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 144376f..7d1edf3 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -93,7 +93,6 @@
general/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
general/type_parameter_type_named_int: RuntimeError
general/type_variable_as_super: RuntimeError
-general/type_variable_bound_access: TypeCheckError
general/unsound_promotion: TypeCheckError
general/void_methods: RuntimeError
general/with_dependencies/issue_43084/issue_43084: RuntimeError
@@ -140,7 +139,6 @@
general_nnbd_opt_out/statements: Crash
general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError
general_nnbd_opt_out/type_variable_as_super: RuntimeError
-general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
general_nnbd_opt_out/unsound_promotion: TypeCheckError
general_nnbd_opt_out/void_methods: RuntimeError
inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 015fa36..1d7593c 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -191,6 +191,7 @@
nnbd/issue43211: FormatterCrash
nnbd/issue43278: FormatterCrash
nnbd/issue43354: FormatterCrash
+nnbd/issue43591: FormatterCrash
nnbd/issue43689: FormatterCrash
nnbd/language_issue1182: FormatterCrash
nnbd/late: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 3ef9d65..21b2c44 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -53,7 +53,6 @@
general_nnbd_opt_out/spread_collection: RuntimeError
general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError # Expected
general_nnbd_opt_out/type_variable_as_super: RuntimeError
-general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
general_nnbd_opt_out/unsound_promotion: TypeCheckError
general_nnbd_opt_out/void_methods: RuntimeError
late_lowering/covariant_late_field: TypeCheckError
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 1178a0c..2eb77b3 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -255,6 +255,11 @@
@override
void checkUnresolvedInvocation(DartType receiver, TreeNode where) {
+ while (receiver is TypeParameterType) {
+ TypeParameterType typeParameterType = receiver;
+ receiver = typeParameterType.bound;
+ }
+
if (receiver is DynamicType) {
return;
}
diff --git a/tests/language/extension_methods/static_extension_resolution_7_test.dart b/tests/language/extension_methods/static_extension_resolution_7_test.dart
index 96c1712..64bb976 100644
--- a/tests/language/extension_methods/static_extension_resolution_7_test.dart
+++ b/tests/language/extension_methods/static_extension_resolution_7_test.dart
@@ -32,8 +32,8 @@
void testPromotedType(S s) {
if (s is int) {
- // Check that `int` has no `f`, bind `T` to `int`.
- int Function(int) f = s.f;
+ // Check that `int` has no `f`, erase `S & int` to `S`, bind `T` to `S`.
+ S Function(S) f = s.f;
}
}
}
diff --git a/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart b/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart
index fd4ebed..11a3d2b 100644
--- a/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart
+++ b/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart
@@ -97,7 +97,12 @@
void uninitializedUntyped() {
late var x;
x = 0;
- x.expectStaticType<Exactly<dynamic>>();
+ if (false) {
+ // Check that the static type of [x] is dynamic:
+ Never n = x;
+ x = 0;
+ x = false;
+ }
// Attempting to promote to `int?` should be ok, since `int?` is a subtype of
// `dynamic`.
if (x is int?) {
diff --git a/tests/language/operator/number_operator_typing_test.dart b/tests/language/operator/number_operator_typing_test.dart
index c650e61..a6fcd7d 100644
--- a/tests/language/operator/number_operator_typing_test.dart
+++ b/tests/language/operator/number_operator_typing_test.dart
@@ -149,11 +149,41 @@
n.remainder(never).expectStaticType<Exactly<num>>();
}
- (dyn1 + d).expectStaticType<Exactly<dynamic>>();
- (dyn1 - d).expectStaticType<Exactly<dynamic>>();
- (dyn1 * d).expectStaticType<Exactly<dynamic>>();
- (dyn1 % d).expectStaticType<Exactly<dynamic>>();
- dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+ var dyn1a = dyn1 + d;
+ if (false) {
+ // Check that the static type of [dyn1a] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
+ var dyn1b = dyn1 - d;
+ if (false) {
+ // Check that the static type of [dyn1b] is dynamic:
+ Never n = dyn1b;
+ dyn1b = 0;
+ dyn1b = false;
+ }
+ var dyn1c = dyn1 * d;
+ if (false) {
+ // Check that the static type of [dyn1c] is dynamic:
+ Never n = dyn1c;
+ dyn1c = 0;
+ dyn1c = false;
+ }
+ var dyn1d = dyn1 % d;
+ if (false) {
+ // Check that the static type of [dyn1d] is dynamic:
+ Never n = dyn1d;
+ dyn1d = 0;
+ dyn1d = false;
+ }
+ var dyn1e = dyn1.remainder(d);
+ if (false) {
+ // Check that the static type of [dyn1e] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
if (false) {
(never + d).expectStaticType<Exactly<Never>>();
@@ -356,11 +386,41 @@
n.remainder(never).expectStaticType<Exactly<num>>();
}
- (dyn1 + d).expectStaticType<Exactly<dynamic>>();
- (dyn1 - d).expectStaticType<Exactly<dynamic>>();
- (dyn1 * d).expectStaticType<Exactly<dynamic>>();
- (dyn1 % d).expectStaticType<Exactly<dynamic>>();
- dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+ var dyn1a = dyn1 + d;
+ if (false) {
+ // Check that the static type of [dyn1a] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
+ var dyn1b = dyn1 - d;
+ if (false) {
+ // Check that the static type of [dyn1b] is dynamic:
+ Never n = dyn1b;
+ dyn1b = 0;
+ dyn1b = false;
+ }
+ var dyn1c = dyn1 * d;
+ if (false) {
+ // Check that the static type of [dyn1c] is dynamic:
+ Never n = dyn1c;
+ dyn1c = 0;
+ dyn1c = false;
+ }
+ var dyn1d = dyn1 % d;
+ if (false) {
+ // Check that the static type of [dyn1d] is dynamic:
+ Never n = dyn1d;
+ dyn1d = 0;
+ dyn1d = false;
+ }
+ var dyn1e = dyn1.remainder(d);
+ if (false) {
+ // Check that the static type of [dyn1e] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
if (false) {
(never + d).expectStaticType<Exactly<Never>>();
@@ -599,11 +659,41 @@
n.remainder(never).expectStaticType<Exactly<num>>();
}
- (dyn1 + d).expectStaticType<Exactly<dynamic>>();
- (dyn1 - d).expectStaticType<Exactly<dynamic>>();
- (dyn1 * d).expectStaticType<Exactly<dynamic>>();
- (dyn1 % d).expectStaticType<Exactly<dynamic>>();
- dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+ var dyn1a = dyn1 + d;
+ if (false) {
+ // Check that the static type of [dyn1a] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
+ var dyn1b = dyn1 - d;
+ if (false) {
+ // Check that the static type of [dyn1b] is dynamic:
+ Never n = dyn1b;
+ dyn1b = 0;
+ dyn1b = false;
+ }
+ var dyn1c = dyn1 * d;
+ if (false) {
+ // Check that the static type of [dyn1c] is dynamic:
+ Never n = dyn1c;
+ dyn1c = 0;
+ dyn1c = false;
+ }
+ var dyn1d = dyn1 % d;
+ if (false) {
+ // Check that the static type of [dyn1d] is dynamic:
+ Never n = dyn1d;
+ dyn1d = 0;
+ dyn1d = false;
+ }
+ var dyn1e = dyn1.remainder(d);
+ if (false) {
+ // Check that the static type of [dyn1e] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
if (false) {
(never + d).expectStaticType<Exactly<Never>>();
@@ -820,11 +910,41 @@
n.remainder(never).expectStaticType<Exactly<num>>();
}
- (dyn1 + d).expectStaticType<Exactly<dynamic>>();
- (dyn1 - d).expectStaticType<Exactly<dynamic>>();
- (dyn1 * d).expectStaticType<Exactly<dynamic>>();
- (dyn1 % d).expectStaticType<Exactly<dynamic>>();
- dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+ var dyn1a = dyn1 + d;
+ if (false) {
+ // Check that the static type of [dyn1a] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
+ var dyn1b = dyn1 - d;
+ if (false) {
+ // Check that the static type of [dyn1b] is dynamic:
+ Never n = dyn1b;
+ dyn1b = 0;
+ dyn1b = false;
+ }
+ var dyn1c = dyn1 * d;
+ if (false) {
+ // Check that the static type of [dyn1c] is dynamic:
+ Never n = dyn1c;
+ dyn1c = 0;
+ dyn1c = false;
+ }
+ var dyn1d = dyn1 % d;
+ if (false) {
+ // Check that the static type of [dyn1d] is dynamic:
+ Never n = dyn1d;
+ dyn1d = 0;
+ dyn1d = false;
+ }
+ var dyn1e = dyn1.remainder(d);
+ if (false) {
+ // Check that the static type of [dyn1e] is dynamic:
+ Never n = dyn1a;
+ dyn1a = 0;
+ dyn1a = false;
+ }
if (false) {
(never + d).expectStaticType<Exactly<Never>>();
diff --git a/tools/VERSION b/tools/VERSION
index 0da300e..2ba0f39 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 5
+PRERELEASE 6
PRERELEASE_PATCH 0
\ No newline at end of file