Version 2.10.0-125.0.dev

Merge commit 'cdd1260ef0086ddf1e376ca16ff4b8e6867b4b0d' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 974b9ac..b34c637 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -564,16 +564,17 @@
       }
       // TODO(brianwilkerson) Version information is currently being ignored,
       //  but needs to be used to select a translator.
-      var transformations = _translateList(
+      var transforms = _translateList(
           node.valueAt(_transformsKey),
           ErrorContext(key: _transformsKey, parentNode: node),
           _translateTransform);
-      if (transformations == null) {
+      if (transforms == null) {
         // The error has already been reported.
         return null;
       }
+      transforms.sort((first, second) => first.date.compareTo(second.date));
       var set = TransformSet();
-      for (var transform in transformations) {
+      for (var transform in transforms) {
         set.addTransform(transform);
       }
       return set;
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 284c144..8a9fa88 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -867,16 +867,21 @@
     var savedTopLevelClass = _classEmittingExtends;
     _classEmittingExtends = c;
 
-    // Unroll mixins.
+    // Refers to 'S' in `class C extends S`. Set this to null to avoid
+    // referencing deferred supertypes in _emitClassConstructor's JS output.
+    js_ast.Expression baseClass;
+
     if (shouldDefer(supertype)) {
       deferredSupertypes.add(runtimeStatement('setBaseClass(#, #)', [
         getBaseClass(isMixinAliasClass(c) ? 0 : mixins.length),
         emitDeferredType(supertype),
       ]));
+      // Refers to 'supertype' without any type arguments.
       supertype =
           _coreTypes.rawType(supertype.classNode, _currentLibrary.nonNullable);
+    } else {
+      baseClass = emitClassRef(supertype);
     }
-    var baseClass = emitClassRef(supertype);
 
     if (isMixinAliasClass(c)) {
       // Given `class C = Object with M [implements I1, I2 ...];`
diff --git a/runtime/tests/vm/dart/split_aot_kernel_generation2_test.dart b/runtime/tests/vm/dart/split_aot_kernel_generation2_test.dart
index 32b4f00..b54e3cb 100644
--- a/runtime/tests/vm/dart/split_aot_kernel_generation2_test.dart
+++ b/runtime/tests/vm/dart/split_aot_kernel_generation2_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// OtherResources=../../../../tests/language/vm/regress_flutter_55345_test.dart
+// OtherResources=../../../../tests/language/mixin/regress_flutter_55345_test.dart
 
 // Runs regress_flutter_55345_test.dart using AOT kernel generation split into
 // 2 steps using '--from-dill' option.
@@ -14,5 +14,5 @@
 
 main() async {
   await runSplitAOTKernelGenerationTest(Platform.script.resolve(
-      '../../../../tests/language/vm/regress_flutter_55345_test.dart'));
+      '../../../../tests/language/mixin/regress_flutter_55345_test.dart'));
 }
diff --git a/runtime/tests/vm/dart_2/split_aot_kernel_generation2_test.dart b/runtime/tests/vm/dart_2/split_aot_kernel_generation2_test.dart
index da7925a..5d49f2c 100644
--- a/runtime/tests/vm/dart_2/split_aot_kernel_generation2_test.dart
+++ b/runtime/tests/vm/dart_2/split_aot_kernel_generation2_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// OtherResources=../../../../tests/language_2/vm/regress_flutter_55345_test.dart
+// OtherResources=../../../../tests/language_2/mixin/regress_flutter_55345_test.dart
 
 // Runs regress_flutter_55345_test.dart using AOT kernel generation split into
 // 2 steps using '--from-dill' option.
@@ -14,5 +14,5 @@
 
 main() async {
   await runSplitAOTKernelGenerationTest(Platform.script.resolve(
-      '../../../../tests/language_2/vm/regress_flutter_55345_test.dart'));
+      '../../../../tests/language_2/mixin/regress_flutter_55345_test.dart'));
 }
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 34cc58e..9732d93 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -626,22 +626,26 @@
           if (super_type_arg.IsBeingFinalized()) {
             // The super_type_arg was instantiated from a type being finalized.
             // We need to finish finalizing its type arguments.
-            ASSERT(super_type_arg.IsTypeRef());
-            AbstractType& ref_super_type_arg =
-                AbstractType::Handle(TypeRef::Cast(super_type_arg).type());
-            if (FLAG_trace_type_finalization) {
-              THR_Print("Instantiated TypeRef '%s': '%s'\n",
-                        String::Handle(super_type_arg.Name()).ToCString(),
-                        ref_super_type_arg.ToCString());
+            AbstractType& unfinalized_type = AbstractType::Handle();
+            if (super_type_arg.IsTypeRef()) {
+              unfinalized_type = TypeRef::Cast(super_type_arg).type();
+            } else {
+              ASSERT(super_type_arg.IsType());
+              unfinalized_type = super_type_arg.raw();
             }
-            CheckRecursiveType(cls, ref_super_type_arg, pending_types);
-            pending_types->Add(ref_super_type_arg);
+            if (FLAG_trace_type_finalization) {
+              THR_Print("Instantiated unfinalized '%s': '%s'\n",
+                        String::Handle(unfinalized_type.Name()).ToCString(),
+                        unfinalized_type.ToCString());
+            }
+            CheckRecursiveType(cls, unfinalized_type, pending_types);
+            pending_types->Add(unfinalized_type);
             const Class& super_cls =
-                Class::Handle(ref_super_type_arg.type_class());
+                Class::Handle(unfinalized_type.type_class());
             const TypeArguments& super_args =
-                TypeArguments::Handle(ref_super_type_arg.arguments());
+                TypeArguments::Handle(unfinalized_type.arguments());
             // Mark as finalized before finalizing to avoid cycles.
-            ref_super_type_arg.SetIsFinalized();
+            unfinalized_type.SetIsFinalized();
             // Although the instantiator is different between cls and super_cls,
             // we still need to pass the current instantiation trail as to avoid
             // divergence. Finalizing the type arguments of super_cls may indeed
@@ -652,9 +656,9 @@
                 super_cls.NumTypeArguments() - super_cls.NumTypeParameters(),
                 pending_types, trail);
             if (FLAG_trace_type_finalization) {
-              THR_Print("Finalized instantiated TypeRef '%s': '%s'\n",
-                        String::Handle(super_type_arg.Name()).ToCString(),
-                        ref_super_type_arg.ToCString());
+              THR_Print("Finalized instantiated '%s': '%s'\n",
+                        String::Handle(unfinalized_type.Name()).ToCString(),
+                        unfinalized_type.ToCString());
             }
           }
         }
diff --git a/tests/language/class/cyclic_hierarchy_test.dart b/tests/language/class/cyclic_hierarchy_test.dart
new file mode 100644
index 0000000..0a892f3
--- /dev/null
+++ b/tests/language/class/cyclic_hierarchy_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// Test for cyclic class hierarchy seen in: https://github.com/flutter/flutter/issues/64011
+
+class A extends B<C> {}
+
+class C extends A {}
+
+class B<T> {}
+
+main() => print(A());
diff --git a/tests/language/vm/regress_flutter_55345_const_test.dart b/tests/language/mixin/regress_flutter_55345_const_test.dart
similarity index 94%
rename from tests/language/vm/regress_flutter_55345_const_test.dart
rename to tests/language/mixin/regress_flutter_55345_const_test.dart
index a30bb11..ccf04a9 100644
--- a/tests/language/vm/regress_flutter_55345_const_test.dart
+++ b/tests/language/mixin/regress_flutter_55345_const_test.dart
@@ -34,4 +34,5 @@
     },
     'abc'
   ]);
+  // No compile time or runtime errors.
 }
diff --git a/tests/language/vm/regress_flutter_55345_test.dart b/tests/language/mixin/regress_flutter_55345_test.dart
similarity index 95%
rename from tests/language/vm/regress_flutter_55345_test.dart
rename to tests/language/mixin/regress_flutter_55345_test.dart
index 3fbe990..70df054 100644
--- a/tests/language/vm/regress_flutter_55345_test.dart
+++ b/tests/language/mixin/regress_flutter_55345_test.dart
@@ -38,4 +38,5 @@
   var x3 = foo(x2);
   var x4 = bar(x3);
   x4(x3);
+  // No compile time or runtime errors.
 }
diff --git a/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart b/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
index 78681be..7a18cec 100644
--- a/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
+++ b/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
@@ -12,8 +12,24 @@
 class C {
   static int staticField = 0;
 
+  static int get staticGetterSetter => staticField;
+
+  static set staticGetterSetter(int? value) {}
+
   int instanceField;
 
+  int get instanceGetterSetter => instanceField;
+
+  set instanceGetterSetter(int? value) {}
+
+  int operator [](int index) => instanceField;
+
+  operator []=(int index, int? value) {}
+
+  static late String error;
+
+  get throwingGetter => throw error;
+
   C(this.instanceField);
 }
 
@@ -24,6 +40,39 @@
     super.instanceField ??= f(); // ignore: dead_null_aware_expression
     // Should throw if `instanceField` returns null (rather than calling `f`).
   }
+
+  void ifNullAssignSuper_nullableSetter(int f()) {
+    super.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
+    // Should throw if `instanceGetterSetter` returns null (rather than calling
+    // `f`).
+  }
+
+  void ifNullAssignSuperIndex(int f()) {
+    super[0] ??= f(); // ignore: dead_null_aware_expression
+    // Should throw if `super[0]` returns null (rather than calling `f`).
+  }
+}
+
+class E {
+  int instanceField;
+
+  E(this.instanceField);
+}
+
+extension EExt on E {
+  int get instanceGetterSetter => instanceField;
+
+  set instanceGetterSetter(int? value) {}
+
+  int operator [](int index) => instanceField;
+
+  operator []=(int index, int? value) {}
+}
+
+extension IntQExt on int? {
+  int extendedMethod(int value) => value;
+
+  int get extendedGetter => 0;
 }
 
 class NeverField {
@@ -50,34 +99,63 @@
   // Should throw if `i` is null.
 }
 
+void isPromoteToNever_noIf(int i) {
+  i is int;
+  // Should throw if `i` is null.
+}
+
 void isNotPromoteToNever(int i) {
   if (i is! int) {
     // Should throw if `i` is null.
   }
 }
 
+void isNotPromoteToNever_noIf(int i) {
+  i is! int;
+}
+
 void equalNullPromoteToNever(int f()) {
   if (f() == null) { // ignore: unnecessary_null_comparison
     // Should throw if `f` returns null.
   }
 }
 
+void equalNullPromoteToNever_noIf(int f()) {
+  f() == null; // ignore: unnecessary_null_comparison
+  // Should throw if `f` returns null.
+}
+
 void notEqualNullPromoteToNever(int f()) {
   if (f() != null) return; // ignore: unnecessary_null_comparison
   // Should throw if `f` returns null.
 }
 
+void notEqualNullPromoteToNever_noIf(int f()) {
+  f() != null; // ignore: unnecessary_null_comparison
+  // Should throw if `f` returns null.
+}
+
 void nullEqualPromoteToNever(int f()) {
   if (null == f()) { // ignore: unnecessary_null_comparison
     // Should throw if `f` returns null.
   }
 }
 
+void nullEqualPromoteToNever_noIf(int f()) {
+  null == f(); // ignore: unnecessary_null_comparison
+  // Should throw if `f` returns null.
+}
+
 void nullNotEqualPromoteToNever(int f()) {
   if (null != f()) return; // ignore: unnecessary_null_comparison
   // Should throw if `f` returns null.
 }
 
+void nullNotEqualPromoteToNever_noIf(int f()) {
+  null != f(); // ignore: unnecessary_null_comparison
+  // Should throw if `f` returns null.
+}
+
 int unnecessaryIfNull(int f(), int g()) {
   return f() ?? g(); // ignore: dead_null_aware_expression
   // Should throw if `f` returns null (rather than calling `g`).
@@ -93,20 +171,72 @@
   // Should throw if `staticField` returns null (rather than calling `f`).
 }
 
+void ifNullAssignStaticGetter_nullableSetter(int f()) {
+  C.staticGetterSetter ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `staticGetterSetter` returns null (rather than calling
+  // `f`).
+}
+
 void ifNullAssignField(C c, int f()) {
   c.instanceField ??= f(); // ignore: dead_null_aware_expression
   // Should throw if `instanceField` returns null (rather than calling `f`).
 }
 
+void ifNullAssignGetter_nullableSetter(C c, int f()) {
+  c.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `instanceGetterSetter` returns null (rather than calling
+  // `f`).
+}
+
+void ifNullAssignGetter_implicitExtension(E e, int f()) {
+  e.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `instanceGetterSetter` returns null (rather than calling
+  // `f`).
+}
+
+void ifNullAssignGetter_explicitExtension(E e, int f()) {
+  EExt(e).instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `instanceGetterSetter` returns null (rather than calling
+  // `f`).
+}
+
 void ifNullAssignIndex(List<int> x, int f()) {
   x[0] ??= f(); // ignore: dead_null_aware_expression
   // Should throw if `x[0]` returns null (rather than calling `f`).
 }
 
+void ifNullAssignIndex_nullAware(List<int>? x, int f()) {
+  x?[0] ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `x[0]` returns null (rather than calling `f`).
+}
+
+void ifNullAssignIndex_nullableSetter(C x, int f()) {
+  x[0] ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `x[0]` returns null (rather than calling `f`).
+}
+
+void ifNullAssignIndex_implicitExtension(E x, int f()) {
+  x[0] ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `x[0]` returns null (rather than calling `f`).
+}
+
+void ifNullAssignIndex_explicitExtension(E x, int f()) {
+  EExt(x)[0] ??= f(); // ignore: dead_null_aware_expression
+  // Should throw if `x[0]` returns null (rather than calling `f`).
+}
+
 void ifNullAssignSuper(D d, int f()) {
   d.ifNullAssignSuper(f);
 }
 
+void ifNullAssignSuper_nullableSetter(D d, int f()) {
+  d.ifNullAssignSuper_nullableSetter(f);
+}
+
+void ifNullAssignSuperIndex(D d, int f()) {
+  d.ifNullAssignSuperIndex(f);
+}
+
 int? ifNullAssignNullAwareField(C? c, int f()) {
   return c?.instanceField ??= f(); // ignore: dead_null_aware_expression
   // Should throw if `instanceField` returns null (rather than calling `f`).
@@ -122,6 +252,77 @@
   // Should throw if `f` returns null.
 }
 
+void unnecessaryNullAwareAccess_cascaded(int f(), String error) {
+  f()?..gcd(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_methodOnObject(int f(), String error) {
+  f()?.toString().compareTo(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_cascaded_methodOnObject(int f(), String error) {
+  f()?..toString().compareTo(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_methodOnExtension(int f(), String error) {
+  f()?.extendedMethod(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_cascaded_methodOnExtension(
+    int f(), String error) {
+  f()?..extendedMethod(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_methodOnExtension_explicit(
+    int f(), String error) {
+  IntQExt(f())?.extendedMethod(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_getter(C f(), String error) {
+  C.error = error;
+  f()?.throwingGetter; // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_cascaded_getter(C f(), String error) {
+  C.error = error;
+  f()?..throwingGetter; // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_getterOnObject(int f(), String error) {
+  f()?.hashCode.remainder(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_cascaded_getterOnObject(int f(), String error) {
+  f()?..hashCode.remainder(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_getterOnExtension(int f(), String error) {
+  f()?.extendedGetter.remainder(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_cascaded_getterOnExtension(
+    int f(), String error) {
+  f()?..extendedGetter.remainder(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
+void unnecessaryNullAwareAccess_getterOnExtension_explicit(
+    int f(), String error) {
+  IntQExt(f())?.extendedGetter.remainder(throw error); // ignore: invalid_null_aware_operator
+  // Should throw if `f` returns null.
+}
+
 void getterReturnsNever(A a) {
   a.getter;
   // Should throw if `getter` completes normally.
@@ -152,19 +353,22 @@
   // Should throw if `method` completes normally.
 }
 
-
 void switchOnBool(bool b) {
   switch (b) {
-    case true: return;
-    case false: return;
+    case true:
+      return;
+    case false:
+      return;
   }
   // Should throw if the implicit `default` branch is taken.
 }
 
 void switchOnEnum(Hand hand) {
   switch (hand) {
-    case Hand.left: return;
-    case Hand.right: return;
+    case Hand.left:
+      return;
+    case Hand.right:
+      return;
   }
   // Should throw if the implicit `default` branch is taken.
-}
\ No newline at end of file
+}
diff --git a/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart b/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
index c50d3a4..d3f2d71 100644
--- a/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
+++ b/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
@@ -49,26 +49,50 @@
   });
 
   Expect.throws(() {
+    isPromoteToNever_noIf(null);
+  });
+
+  Expect.throws(() {
     isNotPromoteToNever(null);
   });
 
   Expect.throws(() {
+    isNotPromoteToNever_noIf(null);
+  });
+
+  Expect.throws(() {
     equalNullPromoteToNever(() => null);
   });
 
   Expect.throws(() {
+    equalNullPromoteToNever_noIf(() => null);
+  });
+
+  Expect.throws(() {
     notEqualNullPromoteToNever(() => null);
   });
 
   Expect.throws(() {
+    notEqualNullPromoteToNever_noIf(() => null);
+  });
+
+  Expect.throws(() {
     nullEqualPromoteToNever(() => null);
   });
 
   Expect.throws(() {
+    nullEqualPromoteToNever_noIf(() => null);
+  });
+
+  Expect.throws(() {
     nullNotEqualPromoteToNever(() => null);
   });
 
   Expect.throws(() {
+    nullNotEqualPromoteToNever_noIf(() => null);
+  });
+
+  Expect.throws(() {
     unnecessaryIfNull(() => null, () => throw "should not reach");
   }, (error) => error != "should not reach");
 
@@ -81,19 +105,64 @@
     ifNullAssignStatic(() => throw "should not reach");
   }, (error) => error != "should not reach");
 
+  C.staticField = null;
+  Expect.throws(() {
+    ifNullAssignStaticGetter_nullableSetter(() => throw "should not reach");
+  }, (error) => error != "should not reach");
+
   Expect.throws(() {
     ifNullAssignField(C(null), () => throw "should not reach");
   }, (error) => error != "should not reach");
 
   Expect.throws(() {
+    ifNullAssignGetter_nullableSetter(C(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    ifNullAssignGetter_implicitExtension(
+        E(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    ifNullAssignGetter_explicitExtension(
+        E(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
     ifNullAssignIndex(<int>[null], () => throw "should not reach");
   }, (error) => error != "should not reach");
 
   Expect.throws(() {
+    ifNullAssignIndex_nullAware(<int>[null], () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    ifNullAssignIndex_nullableSetter(C(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    ifNullAssignIndex_implicitExtension(
+        E(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    ifNullAssignIndex_explicitExtension(
+        E(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
     ifNullAssignSuper(D(null), () => throw "should not reach");
   }, (error) => error != "should not reach");
 
   Expect.throws(() {
+    ifNullAssignSuper_nullableSetter(D(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    ifNullAssignSuperIndex(D(null), () => throw "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
     ifNullAssignNullAwareField(C(null), () => throw "should not reach");
   }, (error) => error != "should not reach");
 
@@ -110,6 +179,66 @@
   }, (error) => error != "should not reach");
 
   Expect.throws(() {
+    unnecessaryNullAwareAccess_methodOnObject(() => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_cascaded_methodOnObject(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_methodOnExtension(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_cascaded_methodOnExtension(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_methodOnExtension_explicit(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_getter(() => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_cascaded(() => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_cascaded_getter(() => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_getterOnObject(() => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_cascaded_getterOnObject(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_getterOnExtension(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_cascaded_getterOnExtension(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
+    unnecessaryNullAwareAccess_getterOnExtension_explicit(
+        () => null, "should not reach");
+  }, (error) => error != "should not reach");
+
+  Expect.throws(() {
     getterReturnsNever(AImpl());
   });
 
diff --git a/tests/language/regress/regress65278_test.dart b/tests/language/regress/regress65278_test.dart
new file mode 100644
index 0000000..9edf22c
--- /dev/null
+++ b/tests/language/regress/regress65278_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+void main() {
+  ContentTabsWidget();
+}
+
+class StatefulWidget {}
+
+class State<T> {}
+
+class WidgetsBindingObserver {}
+
+class IBase {}
+
+class ContentTabsWidget extends BaseStatefulWidget<ContentTabsState, dynamic> {}
+
+class ContentTabsState<W extends ContentTabsWidget>
+    extends BaseState<W, dynamic> {}
+
+class BaseStatefulWidget<ST extends SuperState, T>
+    extends SuperStatefulWidget<ST, T, IBase> {}
+
+class BaseState<W extends StatefulWidget, T> extends SuperState<W, T, IBase> {}
+
+class SuperStatefulWidget<S extends SuperState, T, B> extends StatefulWidget {}
+
+class SuperState<W extends StatefulWidget, T, B> extends State<W>
+    with WidgetsBindingObserver {}
diff --git a/tests/language_2/vm/regress_flutter_55345_const_test.dart b/tests/language_2/mixin/regress_flutter_55345_const_test.dart
similarity index 94%
rename from tests/language_2/vm/regress_flutter_55345_const_test.dart
rename to tests/language_2/mixin/regress_flutter_55345_const_test.dart
index 9b548ff..9c9551d 100644
--- a/tests/language_2/vm/regress_flutter_55345_const_test.dart
+++ b/tests/language_2/mixin/regress_flutter_55345_const_test.dart
@@ -34,4 +34,5 @@
     },
     'abc'
   ]);
+  // No compile time or runtime errors.
 }
diff --git a/tests/language_2/vm/regress_flutter_55345_test.dart b/tests/language_2/mixin/regress_flutter_55345_test.dart
similarity index 95%
rename from tests/language_2/vm/regress_flutter_55345_test.dart
rename to tests/language_2/mixin/regress_flutter_55345_test.dart
index f5ee00a..0cb0441 100644
--- a/tests/language_2/vm/regress_flutter_55345_test.dart
+++ b/tests/language_2/mixin/regress_flutter_55345_test.dart
@@ -41,4 +41,5 @@
   var x3 = foo(x2);
   var x4 = bar(x3);
   x4(x3);
+  // No compile time or runtime errors.
 }
diff --git a/tests/language_2/regress/regress65278_test.dart b/tests/language_2/regress/regress65278_test.dart
new file mode 100644
index 0000000..9edf22c
--- /dev/null
+++ b/tests/language_2/regress/regress65278_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+void main() {
+  ContentTabsWidget();
+}
+
+class StatefulWidget {}
+
+class State<T> {}
+
+class WidgetsBindingObserver {}
+
+class IBase {}
+
+class ContentTabsWidget extends BaseStatefulWidget<ContentTabsState, dynamic> {}
+
+class ContentTabsState<W extends ContentTabsWidget>
+    extends BaseState<W, dynamic> {}
+
+class BaseStatefulWidget<ST extends SuperState, T>
+    extends SuperStatefulWidget<ST, T, IBase> {}
+
+class BaseState<W extends StatefulWidget, T> extends SuperState<W, T, IBase> {}
+
+class SuperStatefulWidget<S extends SuperState, T, B> extends StatefulWidget {}
+
+class SuperState<W extends StatefulWidget, T, B> extends State<W>
+    with WidgetsBindingObserver {}
diff --git a/tools/VERSION b/tools/VERSION
index f2e2efb..775d3f3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 124
+PRERELEASE 125
 PRERELEASE_PATCH 0
\ No newline at end of file