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