Version 2.11.0-202.0.dev

Merge commit '51c6ba0edb29098fae632aab4b595a5be8551ce1' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index de9e6cc..03877e4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -2938,7 +2938,7 @@
         _assignedVariables._getInfoForNode(node);
     ++_functionNestingLevel;
     _current = _current.conservativeJoin(const [], info._written);
-    _stack.add(new _SimpleContext(_current));
+    _stack.add(new _FunctionExpressionContext(_current));
     _current = _current.conservativeJoin(_assignedVariables._anywhere._written,
         _assignedVariables._anywhere._captured);
   }
@@ -2948,7 +2948,7 @@
     --_functionNestingLevel;
     assert(_functionNestingLevel >= 0);
     _SimpleContext<Variable, Type> context =
-        _stack.removeLast() as _SimpleContext<Variable, Type>;
+        _stack.removeLast() as _FunctionExpressionContext<Variable, Type>;
     _current = context._previous;
   }
 
@@ -2979,6 +2979,9 @@
 
   @override
   void ifNullExpression_end() {
+    // TODO(paulberry): CFE sometimes calls ifNullExpression_end and
+    // nullAwareAccess_end out of order, so as a workaround we cast to the
+    // common base class.  See https://github.com/dart-lang/sdk/issues/43725.
     _SimpleContext<Variable, Type> context =
         _stack.removeLast() as _SimpleContext<Variable, Type>;
     _current = _join(_current, context._previous);
@@ -2997,7 +3000,7 @@
     } else {
       promoted = _current;
     }
-    _stack.add(new _SimpleContext<Variable, Type>(promoted));
+    _stack.add(new _IfNullExpressionContext<Variable, Type>(promoted));
     return true;
   }
 
@@ -3148,6 +3151,9 @@
 
   @override
   void nullAwareAccess_end() {
+    // TODO(paulberry): CFE sometimes calls ifNullExpression_end and
+    // nullAwareAccess_end out of order, so as a workaround we cast to the
+    // common base class.  See https://github.com/dart-lang/sdk/issues/43725.
     _SimpleContext<Variable, Type> context =
         _stack.removeLast() as _SimpleContext<Variable, Type>;
     _current = _join(_current, context._previous);
@@ -3156,7 +3162,7 @@
   @override
   bool nullAwareAccess_rightBegin(Expression target, Type targetType) {
     assert(targetType != null);
-    _stack.add(new _SimpleContext<Variable, Type>(_current));
+    _stack.add(new _NullAwareAccessContext<Variable, Type>(_current));
     if (target != null) {
       ExpressionInfo<Variable, Type> targetInfo = _getExpressionInfo(target);
       if (targetInfo is _VariableReadInfo<Variable, Type>) {
@@ -3406,6 +3412,16 @@
 /// language for which flow analysis information needs to be tracked.
 abstract class _FlowContext {}
 
+/// [_FlowContext] representing a function expression.
+class _FunctionExpressionContext<Variable, Type>
+    extends _SimpleContext<Variable, Type> {
+  _FunctionExpressionContext(FlowModel<Variable, Type> previous)
+      : super(previous);
+
+  @override
+  String toString() => '_FunctionExpressionContext(previous: $_previous)';
+}
+
 /// [_FlowContext] representing an `if` statement.
 class _IfContext<Variable, Type> extends _BranchContext<Variable, Type> {
   /// Flow model associated with the state of program execution after the `if`
@@ -3420,6 +3436,25 @@
       '_IfContext(conditionInfo: $_conditionInfo, afterThen: $_afterThen)';
 }
 
+/// [_FlowContext] representing an "if-null" (`??`) expression.
+class _IfNullExpressionContext<Variable, Type>
+    extends _SimpleContext<Variable, Type> {
+  _IfNullExpressionContext(FlowModel<Variable, Type> previous)
+      : super(previous);
+
+  @override
+  String toString() => '_IfNullExpressionContext(previous: $_previous)';
+}
+
+/// [_FlowContext] representing a null aware access (`?.`).
+class _NullAwareAccessContext<Variable, Type>
+    extends _SimpleContext<Variable, Type> {
+  _NullAwareAccessContext(FlowModel<Variable, Type> previous) : super(previous);
+
+  @override
+  String toString() => '_NullAwareAccessContext(previous: $_previous)';
+}
+
 /// [ExpressionInfo] representing a `null` literal.
 class _NullInfo<Variable, Type> implements ExpressionInfo<Variable, Type> {
   @override
@@ -3437,7 +3472,7 @@
 /// [_FlowContext] representing a language construct for which flow analysis
 /// must store a flow model state to be retrieved later, such as a `try`
 /// statement, function expression, or "if-null" (`??`) expression.
-class _SimpleContext<Variable, Type> extends _FlowContext {
+abstract class _SimpleContext<Variable, Type> extends _FlowContext {
   /// The stored state.  For a `try` statement, this is the state from the
   /// beginning of the `try` block.  For a function expression, this is the
   /// state at the point the function expression was created.  For an "if-null"
@@ -3446,9 +3481,6 @@
   final FlowModel<Variable, Type> _previous;
 
   _SimpleContext(this._previous);
-
-  @override
-  String toString() => '_SimpleContext(previous: $_previous)';
 }
 
 /// [_FlowContext] representing a language construct that can be targeted by
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index df9fd1e..a7d67b8 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -687,7 +687,7 @@
     templateCantInferReturnTypeDueToInconsistentOverrides =
     const Template<Message Function(String name)>(
         messageTemplate:
-            r"""Can't infer a return type for '#name' as some of the inherited members have different types.""",
+            r"""Can't infer a return type for '#name' as some of the overridden members have different types.""",
         tipTemplate: r"""Try adding an explicit type.""",
         withArguments:
             _withArgumentsCantInferReturnTypeDueToInconsistentOverrides);
@@ -707,7 +707,38 @@
   name = demangleMixinApplicationName(name);
   return new Message(codeCantInferReturnTypeDueToInconsistentOverrides,
       message:
-          """Can't infer a return type for '${name}' as some of the inherited members have different types.""",
+          """Can't infer a return type for '${name}' as some of the overridden members have different types.""",
+      tip: """Try adding an explicit type.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateCantInferReturnTypeDueToNoCombinedSignature =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Can't infer a return type for '#name' as the overridden members don't have a combined signature.""",
+        tipTemplate: r"""Try adding an explicit type.""",
+        withArguments:
+            _withArgumentsCantInferReturnTypeDueToNoCombinedSignature);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeCantInferReturnTypeDueToNoCombinedSignature =
+    const Code<Message Function(String name)>(
+        "CantInferReturnTypeDueToNoCombinedSignature",
+        templateCantInferReturnTypeDueToNoCombinedSignature,
+        analyzerCodes: <String>[
+      "COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE"
+    ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantInferReturnTypeDueToNoCombinedSignature(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeCantInferReturnTypeDueToNoCombinedSignature,
+      message:
+          """Can't infer a return type for '${name}' as the overridden members don't have a combined signature.""",
       tip: """Try adding an explicit type.""",
       arguments: {'name': name});
 }
@@ -744,7 +775,7 @@
     templateCantInferTypeDueToInconsistentOverrides =
     const Template<Message Function(String name)>(
         messageTemplate:
-            r"""Can't infer a type for '#name' as some of the inherited members have different types.""",
+            r"""Can't infer a type for '#name' as some of the overridden members have different types.""",
         tipTemplate: r"""Try adding an explicit type.""",
         withArguments: _withArgumentsCantInferTypeDueToInconsistentOverrides);
 
@@ -762,7 +793,39 @@
   name = demangleMixinApplicationName(name);
   return new Message(codeCantInferTypeDueToInconsistentOverrides,
       message:
-          """Can't infer a type for '${name}' as some of the inherited members have different types.""",
+          """Can't infer a type for '${name}' as some of the overridden members have different types.""",
+      tip: """Try adding an explicit type.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateCantInferTypeDueToNoCombinedSignature = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Can't infer a type for '#name' as the overridden members don't have a combined signature.""",
+    tipTemplate: r"""Try adding an explicit type.""",
+    withArguments: _withArgumentsCantInferTypeDueToNoCombinedSignature);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeCantInferTypeDueToNoCombinedSignature =
+    const Code<Message Function(String name)>(
+        "CantInferTypeDueToNoCombinedSignature",
+        templateCantInferTypeDueToNoCombinedSignature,
+        analyzerCodes: <String>[
+      "COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE"
+    ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantInferTypeDueToNoCombinedSignature(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeCantInferTypeDueToNoCombinedSignature,
+      message:
+          """Can't infer a type for '${name}' as the overridden members don't have a combined signature.""",
       tip: """Try adding an explicit type.""",
       arguments: {'name': name});
 }
@@ -1909,14 +1972,14 @@
         message: r"""This is the inherited member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeDeclaredMemberConflictsWithInheritedMembersCause =
-    messageDeclaredMemberConflictsWithInheritedMembersCause;
+const Code<Null> codeDeclaredMemberConflictsWithOverriddenMembersCause =
+    messageDeclaredMemberConflictsWithOverriddenMembersCause;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageDeclaredMemberConflictsWithInheritedMembersCause =
-    const MessageCode("DeclaredMemberConflictsWithInheritedMembersCause",
+const MessageCode messageDeclaredMemberConflictsWithOverriddenMembersCause =
+    const MessageCode("DeclaredMemberConflictsWithOverriddenMembersCause",
         severity: Severity.context,
-        message: r"""This is one of the inherited members.""");
+        message: r"""This is one of the overridden members.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDefaultListConstructorError =
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/mixed_if_null_and_null_aware.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/mixed_if_null_and_null_aware.dart
new file mode 100644
index 0000000..31091b0
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/mixed_if_null_and_null_aware.dart
@@ -0,0 +1,8 @@
+// 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.
+
+// This test verifies that we don't crash when trying to analyze an expression
+// that combines if-null with null-aware access.
+
+f(int? i, List? l) => i ?? l?.length;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 81255f6..858f235 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -462,11 +462,11 @@
         element.isFinal = node.isFinal;
         element.parameterKind = node.kind;
         _setCodeRange(element, node);
-        element.metadata = _createElementAnnotations(node.metadata);
       }
       nameNode.staticElement = element;
     }
 
+    element.metadata = _createElementAnnotations(node.metadata);
     node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
 
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 5f397fd..a116216 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -326,6 +326,17 @@
 ''');
   }
 
+  test_localFunction_defaultFieldFormalParameter_metadata() async {
+    await _assertCanBeAnalyzed(r'''
+const my = 0;
+
+void foo() {
+  // ignore:unused_element
+  void bar({@my this.x}) {}
+}
+''');
+  }
+
   test_typeBeforeAnnotation() async {
     await _assertCanBeAnalyzed('''
 class A {
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 429d5f1..9fa3c80 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -232,6 +232,8 @@
   Set<ClassMember> _overrideDependencies;
 
   void registerOverrideDependency(ClassMember overriddenMember) {
+    assert(overriddenMember.classBuilder != classBuilder,
+        "Unexpected override dependency for $this: $overriddenMember");
     _overrideDependencies ??= {};
     _overrideDependencies.add(overriddenMember);
   }
diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
index d91935f..f8700b1 100644
--- a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
@@ -4,28 +4,47 @@
 
 library fasta.never_type_builder;
 
-import 'package:kernel/ast.dart' show DartType, Nullability;
+import 'package:kernel/ast.dart' show DartType, InterfaceType, Nullability;
 
 import 'builtin_type_declaration_builder.dart';
+import 'class_builder.dart';
 import 'library_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
 class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
-  NeverTypeDeclarationBuilder(
-      DartType type, LibraryBuilder compilationUnit, int charOffset)
-      : super("Never", type, compilationUnit, charOffset);
+  final LibraryBuilder coreLibrary;
+  DartType _nullType;
+
+  NeverTypeDeclarationBuilder(DartType type, this.coreLibrary, int charOffset)
+      : super("Never", type, coreLibrary, charOffset) {
+    assert(coreLibrary.importUri == Uri.parse('dart:core'));
+  }
 
   String get debugName => "NeverTypeDeclarationBuilder";
 
+  DartType get nullType {
+    if (_nullType == null) {
+      ClassBuilder nullClass = coreLibrary.lookupLocalMember('Null');
+      _nullType = new InterfaceType(nullClass.cls, Nullability.nullable, []);
+    }
+    return _nullType;
+  }
+
   DartType buildType(LibraryBuilder library,
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
       [bool notInstanceContext]) {
+    if (!library.isNonNullableByDefault) {
+      return nullType;
+    }
     return type.withDeclaredNullability(nullabilityBuilder.build(library));
   }
 
   DartType buildTypesWithBuiltArguments(LibraryBuilder library,
       Nullability nullability, List<DartType> arguments) {
+    if (!library.isNonNullableByDefault) {
+      return nullType;
+    }
     return type.withDeclaredNullability(nullability);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index b42e61e..0fd06ec 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -250,6 +250,8 @@
   Set<ClassMember> _overrideDependencies;
 
   void registerOverrideDependency(ClassMember overriddenMember) {
+    assert(overriddenMember.classBuilder != classBuilder,
+        "Unexpected override dependency for $this: $overriddenMember");
     _overrideDependencies ??= {};
     _overrideDependencies.add(overriddenMember);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 43778fe..a4af6df 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -43,14 +43,16 @@
         Message,
         messageDeclaredMemberConflictsWithInheritedMember,
         messageDeclaredMemberConflictsWithInheritedMemberCause,
-        messageDeclaredMemberConflictsWithInheritedMembersCause,
+        messageDeclaredMemberConflictsWithOverriddenMembersCause,
         messageInheritedMembersConflict,
         messageInheritedMembersConflictCause1,
         messageInheritedMembersConflictCause2,
         messageStaticAndInstanceConflict,
         messageStaticAndInstanceConflictCause,
         templateCantInferReturnTypeDueToInconsistentOverrides,
+        templateCantInferReturnTypeDueToNoCombinedSignature,
         templateCantInferTypeDueToInconsistentOverrides,
+        templateCantInferTypeDueToNoCombinedSignature,
         templateCombinedMemberSignatureFailed,
         templateDuplicatedDeclaration,
         templateDuplicatedDeclarationCause,
@@ -680,165 +682,163 @@
       DartType inferredReturnType;
       Map<FormalParameterBuilder, DartType> inferredParameterTypes = {};
 
-      for (ClassMember classMember
-          in toSet(declaredMember.classBuilder, overriddenMembers)) {
-        Member overriddenMember = classMember.getMember(hierarchy);
-        Substitution classSubstitution;
-        if (classBuilder.cls != overriddenMember.enclosingClass) {
-          assert(
-              substitutions.containsKey(overriddenMember.enclosingClass),
-              "No substitution found for '${classBuilder.fullNameForErrors}' "
-              "as instance of '${overriddenMember.enclosingClass.name}'. "
-              "Substitutions available for: ${substitutions.keys}");
-          classSubstitution = substitutions[overriddenMember.enclosingClass];
-          debug?.log("${classBuilder.fullNameForErrors} -> "
-              "${overriddenMember.enclosingClass.name} $classSubstitution");
-        }
-        if (overriddenMember is! Procedure) {
-          debug?.log("Giving up 1");
-          continue;
-        }
-        Procedure overriddenProcedure = overriddenMember;
-        FunctionNode overriddenFunction = overriddenProcedure.function;
-
-        List<TypeParameter> overriddenTypeParameters =
-            overriddenFunction.typeParameters;
-        int typeParameterCount = declaredTypeParameters.length;
-        if (typeParameterCount != overriddenTypeParameters.length) {
-          debug?.log("Giving up 2");
-          continue;
-        }
-        Substitution methodSubstitution;
-        if (typeParameterCount != 0) {
-          List<DartType> types = new List<DartType>(typeParameterCount);
-          for (int i = 0; i < typeParameterCount; i++) {
-            types[i] = new TypeParameterType.forAlphaRenaming(
-                overriddenTypeParameters[i], declaredTypeParameters[i]);
-          }
-          methodSubstitution =
-              Substitution.fromPairs(overriddenTypeParameters, types);
-          for (int i = 0; i < typeParameterCount; i++) {
-            DartType declaredBound = declaredTypeParameters[i].bound;
-            DartType overriddenBound = methodSubstitution
-                .substituteType(overriddenTypeParameters[i].bound);
-            if (!hierarchy.types
-                .performNullabilityAwareMutualSubtypesCheck(
-                    declaredBound, overriddenBound)
-                .isSubtypeWhenUsingNullabilities()) {
-              debug?.log("Giving up 3");
-              continue;
-            }
-          }
-        }
-
-        DartType inheritedReturnType = overriddenFunction.returnType;
-        if (classSubstitution != null) {
-          inheritedReturnType =
-              classSubstitution.substituteType(inheritedReturnType);
-        }
-        if (methodSubstitution != null) {
-          inheritedReturnType =
-              methodSubstitution.substituteType(inheritedReturnType);
-        }
-        if (declaredMember.returnType == null &&
-            inferredReturnType is! InvalidType) {
-          inferredReturnType = mergeTypeInLibrary(
-              hierarchy, classBuilder, inferredReturnType, inheritedReturnType);
-          if (inferredReturnType == null) {
-            // A different type has already been inferred.
+      Set<ClassMember> overriddenMemberSet =
+          toSet(declaredMember.classBuilder, overriddenMembers);
+      if (classBuilder.library.isNonNullableByDefault) {
+        CombinedMemberSignature combinedMemberSignature =
+            new CombinedMemberSignature(
+                hierarchy, classBuilder, overriddenMemberSet.toList(),
+                forSetter: false);
+        FunctionType combinedMemberSignatureType = combinedMemberSignature
+            .getCombinedSignatureTypeInContext(declaredTypeParameters);
+        if (declaredMember.returnType == null) {
+          if (combinedMemberSignatureType == null) {
             inferredReturnType = const InvalidType();
             reportCantInferReturnType(
                 classBuilder, declaredMember, hierarchy, overriddenMembers);
+          } else {
+            inferredReturnType = combinedMemberSignatureType.returnType;
           }
         }
-        if (declaredFunction.requiredParameterCount >
-            overriddenFunction.requiredParameterCount) {
-          debug?.log("Giving up 4");
-          continue;
-        }
-        List<VariableDeclaration> overriddenPositional =
-            overriddenFunction.positionalParameters;
-        if (declaredPositional.length < overriddenPositional.length) {
-          debug?.log("Giving up 5");
-          continue;
-        }
-
-        for (int i = 0; i < overriddenPositional.length; i++) {
-          FormalParameterBuilder declaredParameter = declaredMember.formals[i];
-          if (declaredParameter.type != null) continue;
-
-          VariableDeclaration overriddenParameter = overriddenPositional[i];
-          DartType inheritedParameterType = overriddenParameter.type;
-          if (classSubstitution != null) {
-            inheritedParameterType =
-                classSubstitution.substituteType(inheritedParameterType);
-          }
-          if (methodSubstitution != null) {
-            inheritedParameterType =
-                methodSubstitution.substituteType(inheritedParameterType);
-          }
-          if (hierarchy.coreTypes.objectClass.enclosingLibrary
-                  .isNonNullableByDefault &&
-              !declaredMember.classBuilder.library.isNonNullableByDefault &&
-              overriddenProcedure == hierarchy.coreTypes.objectEquals) {
-            // In legacy code we special case `Object.==` to infer `dynamic`
-            // instead `Object!`.
-            inheritedParameterType = const DynamicType();
-          }
-          DartType inferredParameterType =
-              inferredParameterTypes[declaredParameter];
-          inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
-              inferredParameterType, inheritedParameterType);
-          if (inferredParameterType == null) {
-            // A different type has already been inferred.
-            inferredParameterType = const InvalidType();
-            reportCantInferParameterType(
-                classBuilder, declaredParameter, hierarchy, overriddenMembers);
-          }
-          inferredParameterTypes[declaredParameter] = inferredParameterType;
-        }
-
-        List<VariableDeclaration> overriddenNamed =
-            overriddenFunction.namedParameters;
-        named:
-        if (declaredNamed.isNotEmpty || overriddenNamed.isNotEmpty) {
-          if (declaredPositional.length != overriddenPositional.length) {
-            debug?.log("Giving up 9");
-            break named;
-          }
-          if (declaredFunction.requiredParameterCount !=
-              overriddenFunction.requiredParameterCount) {
-            debug?.log("Giving up 10");
-            break named;
-          }
-
-          overriddenNamed = overriddenNamed.toList()
-            ..sort(compareNamedParameters);
-          int declaredIndex = 0;
-          for (int overriddenIndex = 0;
-              overriddenIndex < overriddenNamed.length;
-              overriddenIndex++) {
-            String name = overriddenNamed[overriddenIndex].name;
-            for (; declaredIndex < declaredNamed.length; declaredIndex++) {
-              if (declaredNamed[declaredIndex].name == name) break;
+        if (declaredMember.formals != null) {
+          for (int i = 0; i < declaredPositional.length; i++) {
+            FormalParameterBuilder declaredParameter =
+                declaredMember.formals[i];
+            if (declaredParameter.type != null) {
+              continue;
             }
-            if (declaredIndex == declaredNamed.length) {
-              debug?.log("Giving up 11");
-              break named;
+
+            DartType inferredParameterType;
+            if (combinedMemberSignatureType == null) {
+              inferredParameterType = const InvalidType();
+              reportCantInferParameterType(classBuilder, declaredParameter,
+                  hierarchy, overriddenMembers);
+            } else if (i <
+                combinedMemberSignatureType.positionalParameters.length) {
+              inferredParameterType =
+                  combinedMemberSignatureType.positionalParameters[i];
             }
-            FormalParameterBuilder declaredParameter;
-            for (int i = declaredPositional.length;
-                i < declaredMember.formals.length;
-                ++i) {
-              if (declaredMember.formals[i].name == name) {
-                declaredParameter = declaredMember.formals[i];
-                break;
+            inferredParameterTypes[declaredParameter] = inferredParameterType;
+          }
+
+          Map<String, DartType> namedParameterTypes;
+          for (int i = declaredPositional.length;
+              i < declaredMember.formals.length;
+              i++) {
+            FormalParameterBuilder declaredParameter =
+                declaredMember.formals[i];
+            if (declaredParameter.type != null) {
+              continue;
+            }
+
+            DartType inferredParameterType;
+            if (combinedMemberSignatureType == null) {
+              inferredParameterType = const InvalidType();
+              reportCantInferParameterType(classBuilder, declaredParameter,
+                  hierarchy, overriddenMembers);
+            } else {
+              if (namedParameterTypes == null) {
+                namedParameterTypes = {};
+                for (NamedType namedType
+                    in combinedMemberSignatureType.namedParameters) {
+                  namedParameterTypes[namedType.name] = namedType.type;
+                }
+              }
+              inferredParameterType =
+                  namedParameterTypes[declaredParameter.name];
+            }
+            inferredParameterTypes[declaredParameter] = inferredParameterType;
+          }
+        }
+      } else {
+        for (ClassMember classMember in overriddenMemberSet) {
+          Member overriddenMember = classMember.getMember(hierarchy);
+          Substitution classSubstitution;
+          if (classBuilder.cls != overriddenMember.enclosingClass) {
+            assert(
+                substitutions.containsKey(overriddenMember.enclosingClass),
+                "No substitution found for '${classBuilder.fullNameForErrors}' "
+                "as instance of '${overriddenMember.enclosingClass.name}'. "
+                "Substitutions available for: ${substitutions.keys}");
+            classSubstitution = substitutions[overriddenMember.enclosingClass];
+            debug?.log("${classBuilder.fullNameForErrors} -> "
+                "${overriddenMember.enclosingClass.name} $classSubstitution");
+          }
+          if (overriddenMember is! Procedure) {
+            debug?.log("Giving up 1");
+            continue;
+          }
+          Procedure overriddenProcedure = overriddenMember;
+          FunctionNode overriddenFunction = overriddenProcedure.function;
+
+          List<TypeParameter> overriddenTypeParameters =
+              overriddenFunction.typeParameters;
+          int typeParameterCount = declaredTypeParameters.length;
+          if (typeParameterCount != overriddenTypeParameters.length) {
+            debug?.log("Giving up 2");
+            continue;
+          }
+          Substitution methodSubstitution;
+          if (typeParameterCount != 0) {
+            List<DartType> types = new List<DartType>(typeParameterCount);
+            for (int i = 0; i < typeParameterCount; i++) {
+              types[i] = new TypeParameterType.forAlphaRenaming(
+                  overriddenTypeParameters[i], declaredTypeParameters[i]);
+            }
+            methodSubstitution =
+                Substitution.fromPairs(overriddenTypeParameters, types);
+            for (int i = 0; i < typeParameterCount; i++) {
+              DartType declaredBound = declaredTypeParameters[i].bound;
+              DartType overriddenBound = methodSubstitution
+                  .substituteType(overriddenTypeParameters[i].bound);
+              if (!hierarchy.types
+                  .performNullabilityAwareMutualSubtypesCheck(
+                      declaredBound, overriddenBound)
+                  .isSubtypeWhenUsingNullabilities()) {
+                debug?.log("Giving up 3");
+                continue;
               }
             }
-            if (declaredParameter.type != null) continue;
-            VariableDeclaration overriddenParameter =
-                overriddenNamed[overriddenIndex];
+          }
 
+          DartType inheritedReturnType = overriddenFunction.returnType;
+          if (classSubstitution != null) {
+            inheritedReturnType =
+                classSubstitution.substituteType(inheritedReturnType);
+          }
+          if (methodSubstitution != null) {
+            inheritedReturnType =
+                methodSubstitution.substituteType(inheritedReturnType);
+          }
+          if (declaredMember.returnType == null &&
+              inferredReturnType is! InvalidType) {
+            inferredReturnType = mergeTypeInLibrary(hierarchy, classBuilder,
+                inferredReturnType, inheritedReturnType);
+            if (inferredReturnType == null) {
+              // A different type has already been inferred.
+              inferredReturnType = const InvalidType();
+              reportCantInferReturnType(
+                  classBuilder, declaredMember, hierarchy, overriddenMembers);
+            }
+          }
+          if (declaredFunction.requiredParameterCount >
+              overriddenFunction.requiredParameterCount) {
+            debug?.log("Giving up 4");
+            continue;
+          }
+          List<VariableDeclaration> overriddenPositional =
+              overriddenFunction.positionalParameters;
+          if (declaredPositional.length < overriddenPositional.length) {
+            debug?.log("Giving up 5");
+            continue;
+          }
+
+          for (int i = 0; i < overriddenPositional.length; i++) {
+            FormalParameterBuilder declaredParameter =
+                declaredMember.formals[i];
+            if (declaredParameter.type != null) continue;
+
+            VariableDeclaration overriddenParameter = overriddenPositional[i];
             DartType inheritedParameterType = overriddenParameter.type;
             if (classSubstitution != null) {
               inheritedParameterType =
@@ -848,6 +848,14 @@
               inheritedParameterType =
                   methodSubstitution.substituteType(inheritedParameterType);
             }
+            if (hierarchy.coreTypes.objectClass.enclosingLibrary
+                    .isNonNullableByDefault &&
+                !declaredMember.classBuilder.library.isNonNullableByDefault &&
+                overriddenProcedure == hierarchy.coreTypes.objectEquals) {
+              // In legacy code we special case `Object.==` to infer `dynamic`
+              // instead `Object!`.
+              inheritedParameterType = const DynamicType();
+            }
             DartType inferredParameterType =
                 inferredParameterTypes[declaredParameter];
             inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
@@ -860,6 +868,70 @@
             }
             inferredParameterTypes[declaredParameter] = inferredParameterType;
           }
+
+          List<VariableDeclaration> overriddenNamed =
+              overriddenFunction.namedParameters;
+          named:
+          if (declaredNamed.isNotEmpty || overriddenNamed.isNotEmpty) {
+            if (declaredPositional.length != overriddenPositional.length) {
+              debug?.log("Giving up 9");
+              break named;
+            }
+            if (declaredFunction.requiredParameterCount !=
+                overriddenFunction.requiredParameterCount) {
+              debug?.log("Giving up 10");
+              break named;
+            }
+
+            overriddenNamed = overriddenNamed.toList()
+              ..sort(compareNamedParameters);
+            int declaredIndex = 0;
+            for (int overriddenIndex = 0;
+                overriddenIndex < overriddenNamed.length;
+                overriddenIndex++) {
+              String name = overriddenNamed[overriddenIndex].name;
+              for (; declaredIndex < declaredNamed.length; declaredIndex++) {
+                if (declaredNamed[declaredIndex].name == name) break;
+              }
+              if (declaredIndex == declaredNamed.length) {
+                debug?.log("Giving up 11");
+                break named;
+              }
+              FormalParameterBuilder declaredParameter;
+              for (int i = declaredPositional.length;
+                  i < declaredMember.formals.length;
+                  ++i) {
+                if (declaredMember.formals[i].name == name) {
+                  declaredParameter = declaredMember.formals[i];
+                  break;
+                }
+              }
+              if (declaredParameter.type != null) continue;
+              VariableDeclaration overriddenParameter =
+                  overriddenNamed[overriddenIndex];
+
+              DartType inheritedParameterType = overriddenParameter.type;
+              if (classSubstitution != null) {
+                inheritedParameterType =
+                    classSubstitution.substituteType(inheritedParameterType);
+              }
+              if (methodSubstitution != null) {
+                inheritedParameterType =
+                    methodSubstitution.substituteType(inheritedParameterType);
+              }
+              DartType inferredParameterType =
+                  inferredParameterTypes[declaredParameter];
+              inferredParameterType = mergeTypeInLibrary(hierarchy,
+                  classBuilder, inferredParameterType, inheritedParameterType);
+              if (inferredParameterType == null) {
+                // A different type has already been inferred.
+                inferredParameterType = const InvalidType();
+                reportCantInferParameterType(classBuilder, declaredParameter,
+                    hierarchy, overriddenMembers);
+              }
+              inferredParameterTypes[declaredParameter] = inferredParameterType;
+            }
+          }
         }
       }
       if (declaredMember.returnType == null) {
@@ -1016,69 +1088,115 @@
     if (declaredMember.classBuilder == classBuilder &&
         declaredMember.returnType == null) {
       DartType inferredType;
-
-      void inferFrom(ClassMember classMember) {
-        if (inferredType is InvalidType) return;
-
-        Member overriddenMember = classMember.getMember(hierarchy);
-        Substitution substitution;
-        if (classBuilder.cls != overriddenMember.enclosingClass) {
-          assert(
-              substitutions.containsKey(overriddenMember.enclosingClass),
-              "No substitution found for '${classBuilder.fullNameForErrors}' "
-              "as instance of '${overriddenMember.enclosingClass.name}'. "
-              "Substitutions available for: ${substitutions.keys}");
-          substitution = substitutions[overriddenMember.enclosingClass];
-        }
-        DartType inheritedType;
-        if (overriddenMember is Field) {
-          inheritedType = overriddenMember.type;
-          assert(inheritedType is! ImplicitFieldType);
-        } else if (overriddenMember is Procedure) {
-          if (overriddenMember.kind == ProcedureKind.Setter) {
-            VariableDeclaration bParameter =
-                overriddenMember.function.positionalParameters.single;
-            inheritedType = bParameter.type;
-          } else if (overriddenMember.kind == ProcedureKind.Getter) {
-            inheritedType = overriddenMember.function.returnType;
-          } else {
-            debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
-            return;
-          }
-        } else {
-          debug?.log(
-              "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
-          return;
-        }
-        if (substitution != null) {
-          inheritedType = substitution.substituteType(inheritedType);
-        }
-        inferredType = mergeTypeInLibrary(
-            hierarchy, classBuilder, inferredType, inheritedType);
-
-        if (inferredType == null) {
-          // A different type has already been inferred.
-          inferredType = const InvalidType();
-          reportCantInferReturnType(
-              classBuilder, declaredMember, hierarchy, overriddenMembers);
-        }
-      }
-
       overriddenMembers = toSet(classBuilder, overriddenMembers);
-      // The getter type must be inferred from getters first.
-      for (ClassMember overriddenMember in overriddenMembers) {
-        if (!overriddenMember.forSetter) {
-          inferFrom(overriddenMember);
-        }
-      }
-      if (inferredType == null) {
-        // The getter type must be inferred from setters if no type was
-        // inferred from getters.
+      if (classBuilder.library.isNonNullableByDefault) {
+        List<ClassMember> overriddenGetters = [];
+        List<ClassMember> overriddenSetters = [];
         for (ClassMember overriddenMember in overriddenMembers) {
           if (overriddenMember.forSetter) {
+            overriddenSetters.add(overriddenMember);
+          } else {
+            overriddenGetters.add(overriddenMember);
+          }
+        }
+
+        void inferFrom(List<ClassMember> members, {bool forSetter}) {
+          assert(forSetter != null);
+          CombinedMemberSignature combinedMemberSignature =
+              new CombinedMemberSignature(hierarchy, classBuilder, members,
+                  forSetter: forSetter);
+          DartType combinedMemberSignatureType =
+              combinedMemberSignature.combinedMemberSignatureType;
+          if (combinedMemberSignatureType == null) {
+            inferredType = const InvalidType();
+            reportCantInferReturnType(
+                classBuilder, declaredMember, hierarchy, members);
+          } else {
+            inferredType = combinedMemberSignatureType;
+          }
+        }
+
+        if (overriddenGetters.isNotEmpty) {
+          // 1) The return type of a getter, parameter type of a setter or type
+          // of a field which overrides/implements only one or more getters is
+          // inferred to be the return type of the combined member signature of
+          // said getter in the direct superinterfaces.
+
+          // 2) The return type of a getter which overrides/implements both a
+          // setter and a getter is inferred to be the return type of the
+          // combined member signature of said getter in the direct
+          // superinterfaces.
+          inferFrom(overriddenGetters, forSetter: false);
+        } else {
+          // The return type of a getter, parameter type of a setter or type of
+          // a field which overrides/implements only one or more setters is
+          // inferred to be the parameter type of the combined member signature
+          // of said setter in the direct superinterfaces.
+          inferFrom(overriddenSetters, forSetter: true);
+        }
+      } else {
+        void inferFrom(ClassMember classMember) {
+          if (inferredType is InvalidType) return;
+
+          Member overriddenMember = classMember.getMember(hierarchy);
+          Substitution substitution;
+          if (classBuilder.cls != overriddenMember.enclosingClass) {
+            assert(
+                substitutions.containsKey(overriddenMember.enclosingClass),
+                "No substitution found for '${classBuilder.fullNameForErrors}' "
+                "as instance of '${overriddenMember.enclosingClass.name}'. "
+                "Substitutions available for: ${substitutions.keys}");
+            substitution = substitutions[overriddenMember.enclosingClass];
+          }
+          DartType inheritedType;
+          if (overriddenMember is Field) {
+            inheritedType = overriddenMember.type;
+            assert(inheritedType is! ImplicitFieldType);
+          } else if (overriddenMember is Procedure) {
+            if (overriddenMember.kind == ProcedureKind.Setter) {
+              VariableDeclaration bParameter =
+                  overriddenMember.function.positionalParameters.single;
+              inheritedType = bParameter.type;
+            } else if (overriddenMember.kind == ProcedureKind.Getter) {
+              inheritedType = overriddenMember.function.returnType;
+            } else {
+              debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+              return;
+            }
+          } else {
+            debug?.log("Giving up (not field/procedure: "
+                "${overriddenMember.runtimeType})");
+            return;
+          }
+          if (substitution != null) {
+            inheritedType = substitution.substituteType(inheritedType);
+          }
+          inferredType = mergeTypeInLibrary(
+              hierarchy, classBuilder, inferredType, inheritedType);
+
+          if (inferredType == null) {
+            // A different type has already been inferred.
+            inferredType = const InvalidType();
+            reportCantInferReturnType(
+                classBuilder, declaredMember, hierarchy, overriddenMembers);
+          }
+        }
+
+        // The getter type must be inferred from getters first.
+        for (ClassMember overriddenMember in overriddenMembers) {
+          if (!overriddenMember.forSetter) {
             inferFrom(overriddenMember);
           }
         }
+        if (inferredType == null) {
+          // The getter type must be inferred from setters if no type was
+          // inferred from getters.
+          for (ClassMember overriddenMember in overriddenMembers) {
+            if (overriddenMember.forSetter) {
+              inferFrom(overriddenMember);
+            }
+          }
+        }
       }
 
       inferredType ??= const DynamicType();
@@ -1097,67 +1215,114 @@
     if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
       DartType inferredType;
 
-      void inferFrom(ClassMember classMember) {
-        if (inferredType is InvalidType) return;
-
-        Member overriddenMember = classMember.getMember(hierarchy);
-        Substitution substitution;
-        if (classBuilder.cls != overriddenMember.enclosingClass) {
-          assert(
-              substitutions.containsKey(overriddenMember.enclosingClass),
-              "No substitution found for '${classBuilder.fullNameForErrors}' "
-              "as instance of '${overriddenMember.enclosingClass.name}'. "
-              "Substitutions available for: ${substitutions.keys}");
-          substitution = substitutions[overriddenMember.enclosingClass];
-        }
-        DartType inheritedType;
-        if (overriddenMember is Field) {
-          inheritedType = overriddenMember.type;
-          assert(inheritedType is! ImplicitFieldType);
-        } else if (overriddenMember is Procedure) {
-          if (classMember.isSetter) {
-            VariableDeclaration bParameter =
-                overriddenMember.function.positionalParameters.single;
-            inheritedType = bParameter.type;
-          } else if (classMember.isGetter) {
-            inheritedType = overriddenMember.function.returnType;
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+      if (classBuilder.library.isNonNullableByDefault) {
+        List<ClassMember> overriddenGetters = [];
+        List<ClassMember> overriddenSetters = [];
+        for (ClassMember overriddenMember in overriddenMembers) {
+          if (overriddenMember.forSetter) {
+            overriddenSetters.add(overriddenMember);
           } else {
-            debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+            overriddenGetters.add(overriddenMember);
+          }
+        }
+
+        void inferFrom(List<ClassMember> members, {bool forSetter}) {
+          assert(forSetter != null);
+          CombinedMemberSignature combinedMemberSignature =
+              new CombinedMemberSignature(hierarchy, classBuilder, members,
+                  forSetter: forSetter);
+          DartType combinedMemberSignatureType =
+              combinedMemberSignature.combinedMemberSignatureType;
+          if (combinedMemberSignatureType == null) {
+            inferredType = const InvalidType();
+            reportCantInferReturnType(
+                classBuilder, declaredMember, hierarchy, members);
+          } else {
+            inferredType = combinedMemberSignatureType;
+          }
+        }
+
+        if (overriddenSetters.isNotEmpty) {
+          // 1) The return type of a getter, parameter type of a setter or type
+          // of a field which overrides/implements only one or more setters is
+          // inferred to be the parameter type of the combined member signature
+          // of said setter in the direct superinterfaces.
+          //
+          // 2) The parameter type of a setter which overrides/implements both a
+          // setter and a getter is inferred to be the parameter type of the
+          // combined member signature of said setter in the direct
+          // superinterfaces.
+          inferFrom(overriddenSetters, forSetter: true);
+        } else {
+          // The return type of a getter, parameter type of a setter or type of
+          // a field which overrides/implements only one or more getters is
+          // inferred to be the return type of the combined member signature of
+          // said getter in the direct superinterfaces.
+          inferFrom(overriddenGetters, forSetter: false);
+        }
+      } else {
+        void inferFrom(ClassMember classMember) {
+          if (inferredType is InvalidType) return;
+
+          Member overriddenMember = classMember.getMember(hierarchy);
+          Substitution substitution;
+          if (classBuilder.cls != overriddenMember.enclosingClass) {
+            assert(
+                substitutions.containsKey(overriddenMember.enclosingClass),
+                "No substitution found for '${classBuilder.fullNameForErrors}' "
+                "as instance of '${overriddenMember.enclosingClass.name}'. "
+                "Substitutions available for: ${substitutions.keys}");
+            substitution = substitutions[overriddenMember.enclosingClass];
+          }
+          DartType inheritedType;
+          if (overriddenMember is Field) {
+            inheritedType = overriddenMember.type;
+            assert(inheritedType is! ImplicitFieldType);
+          } else if (overriddenMember is Procedure) {
+            if (classMember.isSetter) {
+              VariableDeclaration bParameter =
+                  overriddenMember.function.positionalParameters.single;
+              inheritedType = bParameter.type;
+            } else if (classMember.isGetter) {
+              inheritedType = overriddenMember.function.returnType;
+            } else {
+              debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+              return;
+            }
+          } else {
+            debug?.log("Giving up (not field/procedure: "
+                "${overriddenMember.runtimeType})");
             return;
           }
-        } else {
-          debug?.log(
-              "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
-          return;
+          if (substitution != null) {
+            inheritedType = substitution.substituteType(inheritedType);
+          }
+          inferredType = mergeTypeInLibrary(
+              hierarchy, classBuilder, inferredType, inheritedType);
+          if (inferredType == null) {
+            // A different type has already been inferred.
+            inferredType = const InvalidType();
+            reportCantInferParameterType(
+                classBuilder, parameter, hierarchy, overriddenMembers);
+          }
         }
-        if (substitution != null) {
-          inheritedType = substitution.substituteType(inheritedType);
-        }
-        inferredType = mergeTypeInLibrary(
-            hierarchy, classBuilder, inferredType, inheritedType);
-        if (inferredType == null) {
-          // A different type has already been inferred.
-          inferredType = const InvalidType();
-          reportCantInferParameterType(
-              classBuilder, parameter, hierarchy, overriddenMembers);
-        }
-      }
 
-      overriddenMembers = toSet(classBuilder, overriddenMembers);
-      // The setter type must be inferred from setters first.
-      for (ClassMember overriddenMember in overriddenMembers) {
-        if (overriddenMember.forSetter) {
-          inferFrom(overriddenMember);
-        }
-      }
-      if (inferredType == null) {
-        // The setter type must be inferred from getters if no type was
-        // inferred from setters.
+        // The setter type must be inferred from setters first.
         for (ClassMember overriddenMember in overriddenMembers) {
-          if (!overriddenMember.forSetter) {
+          if (overriddenMember.forSetter) {
             inferFrom(overriddenMember);
           }
         }
+        if (inferredType == null) {
+          // The setter type must be inferred from getters if no type was
+          // inferred from setters.
+          for (ClassMember overriddenMember in overriddenMembers) {
+            if (!overriddenMember.forSetter) {
+              inferFrom(overriddenMember);
+            }
+          }
+        }
       }
 
       inferredType ??= const DynamicType();
@@ -1214,72 +1379,137 @@
         fieldBuilder.type == null) {
       DartType inferredType;
 
-      void inferFrom(ClassMember classMember) {
-        if (inferredType is InvalidType) return;
-
-        Member overriddenMember = classMember.getMember(hierarchy);
-        DartType inheritedType;
-        if (overriddenMember is Procedure) {
-          if (overriddenMember.isSetter) {
-            VariableDeclaration parameter =
-                overriddenMember.function.positionalParameters.single;
-            inheritedType = parameter.type;
-          } else if (overriddenMember.isGetter) {
-            inheritedType = overriddenMember.function.returnType;
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+      if (classBuilder.library.isNonNullableByDefault) {
+        List<ClassMember> overriddenGetters = [];
+        List<ClassMember> overriddenSetters = [];
+        for (ClassMember overriddenMember in overriddenMembers) {
+          if (overriddenMember.forSetter) {
+            overriddenSetters.add(overriddenMember);
+          } else {
+            overriddenGetters.add(overriddenMember);
           }
-        } else if (overriddenMember is Field) {
-          inheritedType = overriddenMember.type;
         }
-        if (inheritedType == null) {
-          debug
-              ?.log("Giving up (inheritedType == null)\n${StackTrace.current}");
-          return;
+
+        DartType inferFrom(List<ClassMember> members, {bool forSetter}) {
+          assert(forSetter != null);
+          CombinedMemberSignature combinedMemberSignature =
+              new CombinedMemberSignature(hierarchy, classBuilder, members,
+                  forSetter: forSetter);
+          return combinedMemberSignature.combinedMemberSignatureType;
         }
-        Substitution substitution;
-        if (classBuilder.cls != overriddenMember.enclosingClass) {
-          assert(
-              substitutions.containsKey(overriddenMember.enclosingClass),
-              "${classBuilder.fullNameForErrors} "
-              "${overriddenMember.enclosingClass.name}");
-          substitution = substitutions[overriddenMember.enclosingClass];
-          debug?.log("${classBuilder.fullNameForErrors} -> "
-              "${overriddenMember.enclosingClass.name} $substitution");
+
+        DartType combinedMemberSignatureType;
+        if (fieldBuilder.isAssignable &&
+            overriddenGetters.isNotEmpty &&
+            overriddenSetters.isNotEmpty) {
+          // The type of a non-final field which overrides/implements both a
+          // setter and a getter is inferred to be the parameter type of the
+          // combined member signature of said setter in the direct
+          // superinterfaces, if this type is the same as the return type of the
+          // combined member signature of said getter in the direct
+          // superinterfaces. If the types are not the same then inference fails
+          // with an error.
+          DartType getterType = inferFrom(overriddenGetters, forSetter: false);
+          DartType setterType = inferFrom(overriddenSetters, forSetter: true);
+          if (getterType == setterType) {
+            combinedMemberSignatureType = getterType;
+          }
+        } else if (overriddenGetters.isNotEmpty) {
+          // 1) The return type of a getter, parameter type of a setter or type
+          // of a field which overrides/implements only one or more getters is
+          // inferred to be the return type of the combined member signature of
+          // said getter in the direct superinterfaces.
+          //
+          // 2) The type of a final field which overrides/implements both a
+          // setter and a getter is inferred to be the return type of the
+          // combined member signature of said getter in the direct
+          // superinterfaces.
+          combinedMemberSignatureType =
+              inferFrom(overriddenGetters, forSetter: false);
+        } else {
+          // The return type of a getter, parameter type of a setter or type of
+          // a field which overrides/implements only one or more setters is
+          // inferred to be the parameter type of the combined member signature
+          // of said setter in the direct superinterfaces.
+          combinedMemberSignatureType =
+              inferFrom(overriddenSetters, forSetter: true);
         }
-        assert(inheritedType is! ImplicitFieldType);
-        if (substitution != null) {
-          inheritedType = substitution.substituteType(inheritedType);
-        }
-        inferredType = mergeTypeInLibrary(
-            hierarchy, classBuilder, inferredType, inheritedType);
-        if (inferredType == null) {
-          // A different type has already been inferred.
+
+        if (combinedMemberSignatureType == null) {
           inferredType = const InvalidType();
           reportCantInferFieldType(
               classBuilder, fieldBuilder, overriddenMembers);
-        }
-      }
-
-      overriddenMembers = toSet(classBuilder, overriddenMembers);
-      if (fieldBuilder.isAssignable) {
-        // The field type must be inferred from both getters and setters.
-        for (ClassMember overriddenMember in overriddenMembers) {
-          inferFrom(overriddenMember);
+        } else {
+          inferredType = combinedMemberSignatureType;
         }
       } else {
-        // The field type must be inferred from getters first.
-        for (ClassMember overriddenMember in overriddenMembers) {
-          if (!overriddenMember.forSetter) {
-            inferFrom(overriddenMember);
+        void inferFrom(ClassMember classMember) {
+          if (inferredType is InvalidType) return;
+
+          Member overriddenMember = classMember.getMember(hierarchy);
+          DartType inheritedType;
+          if (overriddenMember is Procedure) {
+            if (overriddenMember.isSetter) {
+              VariableDeclaration parameter =
+                  overriddenMember.function.positionalParameters.single;
+              inheritedType = parameter.type;
+            } else if (overriddenMember.isGetter) {
+              inheritedType = overriddenMember.function.returnType;
+            }
+          } else if (overriddenMember is Field) {
+            inheritedType = overriddenMember.type;
+          }
+          if (inheritedType == null) {
+            debug?.log(
+                "Giving up (inheritedType == null)\n${StackTrace.current}");
+            return;
+          }
+          Substitution substitution;
+          if (classBuilder.cls != overriddenMember.enclosingClass) {
+            assert(
+                substitutions.containsKey(overriddenMember.enclosingClass),
+                "${classBuilder.fullNameForErrors} "
+                "${overriddenMember.enclosingClass.name}");
+            substitution = substitutions[overriddenMember.enclosingClass];
+            debug?.log("${classBuilder.fullNameForErrors} -> "
+                "${overriddenMember.enclosingClass.name} $substitution");
+          }
+          assert(inheritedType is! ImplicitFieldType);
+          if (substitution != null) {
+            inheritedType = substitution.substituteType(inheritedType);
+          }
+          inferredType = mergeTypeInLibrary(
+              hierarchy, classBuilder, inferredType, inheritedType);
+          if (inferredType == null) {
+            // A different type has already been inferred.
+            inferredType = const InvalidType();
+            reportCantInferFieldType(
+                classBuilder, fieldBuilder, overriddenMembers);
           }
         }
-        if (inferredType == null) {
-          // The field type must be inferred from setters if no type was
-          // inferred from getters.
+
+        if (fieldBuilder.isAssignable) {
+          // The field type must be inferred from both getters and setters.
           for (ClassMember overriddenMember in overriddenMembers) {
-            if (overriddenMember.forSetter) {
+            inferFrom(overriddenMember);
+          }
+        } else {
+          // The field type must be inferred from getters first.
+          for (ClassMember overriddenMember in overriddenMembers) {
+            if (!overriddenMember.forSetter) {
               inferFrom(overriddenMember);
             }
           }
+          if (inferredType == null) {
+            // The field type must be inferred from setters if no type was
+            // inferred from getters.
+            for (ClassMember overriddenMember in overriddenMembers) {
+              if (overriddenMember.forSetter) {
+                inferFrom(overriddenMember);
+              }
+            }
+          }
         }
       }
 
@@ -1720,10 +1950,18 @@
     void registerOverrideDependency(
         ClassMember member, ClassMember overriddenMember) {
       if (classBuilder == member.classBuilder && member.isSourceDeclaration) {
-        Set<ClassMember> dependencies =
-            overrideDependencies[member] ??= <ClassMember>{};
-        dependencies.add(overriddenMember);
-        member.registerOverrideDependency(overriddenMember);
+        if (overriddenMember.hasDeclarations &&
+            classBuilder == overriddenMember.classBuilder) {
+          for (int i = 0; i < overriddenMember.declarations.length; i++) {
+            registerOverrideDependency(
+                member, overriddenMember.declarations[i]);
+          }
+        } else {
+          Set<ClassMember> dependencies =
+              overrideDependencies[member] ??= <ClassMember>{};
+          dependencies.add(overriddenMember);
+          member.registerOverrideDependency(overriddenMember);
+        }
       }
     }
 
@@ -1973,6 +2211,14 @@
 
       void checkMemberVsSetter(
           ClassMember member, ClassMember overriddenMember) {
+        if (overriddenMember.classBuilder == classBuilder &&
+            overriddenMember.hasDeclarations) {
+          for (ClassMember declaration in overriddenMember.declarations) {
+            checkMemberVsSetter(member, declaration);
+          }
+          return;
+        }
+
         if (classBuilder is! SourceClassBuilder) return;
         if (overriddenMember.isStatic) return;
         if (member == overriddenMember) return;
@@ -2961,46 +3207,6 @@
         isImplicitlyAbstract == other.isImplicitlyAbstract;
   }
 
-  DartType computeMemberType(
-      ClassHierarchyBuilder hierarchy, DartType thisType, Member member) {
-    DartType type;
-    if (member is Procedure) {
-      if (member.isGetter) {
-        type = member.getterType;
-      } else if (member.isSetter) {
-        type = member.setterType;
-      } else {
-        type = member.function
-            .computeFunctionType(member.enclosingLibrary.nonNullable);
-      }
-    } else if (member is Field) {
-      type = member.type;
-    } else {
-      unhandled("${member.runtimeType}", "$member", classBuilder.charOffset,
-          classBuilder.fileUri);
-    }
-    InterfaceType instance = hierarchy.getTypeAsInstanceOf(
-        thisType,
-        member.enclosingClass,
-        classBuilder.library.library,
-        hierarchy.coreTypes);
-    assert(
-        instance != null,
-        "No instance of $thisType as ${member.enclosingClass} found for "
-        "$member.");
-    return Substitution.fromInterfaceType(instance).substituteType(type);
-  }
-
-  bool isMoreSpecific(ClassHierarchyBuilder hierarchy, DartType a, DartType b) {
-    if (isSetter) {
-      return hierarchy.types
-          .isSubtypeOf(b, a, SubtypeCheckMode.withNullabilities);
-    } else {
-      return hierarchy.types
-          .isSubtypeOf(a, b, SubtypeCheckMode.withNullabilities);
-    }
-  }
-
   @override
   Member getMember(ClassHierarchyBuilder hierarchy) {
     if (combinedMemberSignatureResult != null) {
@@ -3010,89 +3216,16 @@
       return combinedMemberSignatureResult =
           declarations.first.getMember(hierarchy);
     }
-    ClassMember bestSoFar;
-    int bestSoFarIndex;
-    Map<DartType, int> mutualSubtypes;
-    if (declarations.length == 1) {
-      bestSoFar = declarations[0];
-      bestSoFarIndex = 0;
-    } else {
-      DartType thisType = hierarchy.coreTypes.thisInterfaceType(
-          classBuilder.cls, classBuilder.library.nonNullable);
-      bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
 
-      DartType bestTypeSoFar;
-      List<DartType> candidateTypes = new List<DartType>(declarations.length);
-      for (int candidateIndex = declarations.length - 1;
-          candidateIndex >= 0;
-          candidateIndex--) {
-        ClassMember candidate = declarations[candidateIndex];
-        Member target = candidate.getMember(hierarchy);
-        assert(target != null,
-            "No member computed for ${candidate} (${candidate.runtimeType})");
-        DartType candidateType = computeMemberType(hierarchy, thisType, target);
-        if (!isNonNullableByDefault) {
-          candidateType = legacyErasure(hierarchy.coreTypes, candidateType);
-        }
-        candidateTypes[candidateIndex] = candidateType;
-        if (bestSoFar == null) {
-          bestSoFar = candidate;
-          bestTypeSoFar = candidateType;
-          bestSoFarIndex = candidateIndex;
-        } else {
-          if (isMoreSpecific(hierarchy, candidateType, bestTypeSoFar)) {
-            debug?.log("Combined Member Signature: ${candidate.fullName} "
-                "${candidateType} <: ${bestSoFar.fullName} ${bestTypeSoFar}");
-            if (isNonNullableByDefault &&
-                isMoreSpecific(hierarchy, bestTypeSoFar, candidateType)) {
-              if (mutualSubtypes == null) {
-                mutualSubtypes = {
-                  bestTypeSoFar: bestSoFarIndex,
-                  candidateType: candidateIndex
-                };
-              } else {
-                mutualSubtypes[candidateType] = candidateIndex;
-              }
-            } else {
-              mutualSubtypes = null;
-            }
-            bestSoFarIndex = candidateIndex;
-            bestSoFar = candidate;
-            bestTypeSoFar = candidateType;
-          } else {
-            debug?.log("Combined Member Signature: "
-                "${candidate.fullName} !<: ${bestSoFar.fullName}");
-          }
-        }
-      }
-      if (bestSoFar != null) {
-        debug?.log("Combined Member Signature bestSoFar: "
-            "${bestSoFar.fullName}");
-        for (int candidateIndex = 0;
-            candidateIndex < declarations.length;
-            candidateIndex++) {
-          ClassMember candidate = declarations[candidateIndex];
-          DartType candidateType = candidateTypes[candidateIndex];
-          if (!isMoreSpecific(hierarchy, bestTypeSoFar, candidateType)) {
-            debug?.log("Combined Member Signature: "
-                "${bestSoFar.fullName} !<: ${candidate.fullName}");
+    CombinedMemberSignature combinedMemberSignature =
+        new CombinedMemberSignature(hierarchy, classBuilder, declarations,
+            forSetter: isSetter);
 
-            if (!shouldOverrideProblemBeOverlooked(classBuilder)) {
-              bestSoFar = null;
-              bestTypeSoFar = null;
-              mutualSubtypes = null;
-            }
-            break;
-          }
-        }
-      }
-    }
-
-    if (bestSoFar == null) {
+    if (combinedMemberSignature.canonicalClassMember == null) {
       String name = classBuilder.fullNameForErrors;
       int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
       List<LocatedMessage> context = declarations.map((ClassMember d) {
-        return messageDeclaredMemberConflictsWithInheritedMembersCause
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
             .withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
       }).toList();
 
@@ -3109,12 +3242,13 @@
           declarations.first.getMember(hierarchy);
     }
     debug?.log("Combined Member Signature of ${fullNameForErrors}: "
-        "${bestSoFar.fullName}");
+        "${combinedMemberSignature.canonicalClassMember.fullName}");
 
     if (modifyKernel) {
       ProcedureKind kind = ProcedureKind.Method;
-      Member bestMemberSoFar = bestSoFar.getMember(hierarchy);
-      if (bestSoFar.isProperty) {
+      Member bestMemberSoFar =
+          combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
+      if (combinedMemberSignature.canonicalClassMember.isProperty) {
         kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
       } else if (bestMemberSoFar is Procedure &&
           bestMemberSoFar.kind == ProcedureKind.Operator) {
@@ -3122,20 +3256,16 @@
       }
 
       debug?.log("Combined Member Signature of ${fullNameForErrors}: new "
-          "ForwardingNode($classBuilder, $bestSoFar, $declarations, $kind)");
-      Member stub = new ForwardingNode(
-              hierarchy,
-              classBuilder,
-              bestSoFar,
-              bestSoFarIndex,
-              declarations,
-              kind,
-              mutualSubtypes?.values?.toSet())
-          .finalize();
+          "ForwardingNode($classBuilder, "
+          "${combinedMemberSignature.canonicalClassMember}, "
+          "$declarations, $kind)");
+      Member stub =
+          new ForwardingNode(combinedMemberSignature, kind).finalize();
       if (classBuilder.cls == stub.enclosingClass) {
         classBuilder.cls.addMember(stub);
         SourceLibraryBuilder library = classBuilder.library;
-        Member bestMemberSoFar = bestSoFar.getMember(hierarchy);
+        Member bestMemberSoFar =
+            combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
         if (bestMemberSoFar is Procedure) {
           library.forwardersOrigins..add(stub)..add(bestMemberSoFar);
         }
@@ -3147,7 +3277,8 @@
 
     debug?.log(
         "Combined Member Signature of ${fullNameForErrors}: picked bestSoFar");
-    return combinedMemberSignatureResult = bestSoFar.getMember(hierarchy);
+    return combinedMemberSignatureResult =
+        combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
   }
 
   @override
@@ -3246,8 +3377,10 @@
       if (modifyKernel) {
         // This call will add a body to the abstract method if needed for
         // isGenericCovariantImpl checks.
-        new ForwardingNode(hierarchy, classBuilder, abstractMember, 1,
-                declarations, kind, null)
+        new ForwardingNode(
+                new CombinedMemberSignature.internal(
+                    hierarchy, classBuilder, 1, declarations),
+                kind)
             .finalize();
       }
     }
@@ -3326,7 +3459,7 @@
   String name = parameter.name;
   List<LocatedMessage> context = overriddenMembers
       .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithInheritedMembersCause
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
             .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
                 overriddenMember.fullNameForErrors.length);
       })
@@ -3335,7 +3468,9 @@
       .toSet()
       .toList();
   cls.addProblem(
-      templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
+      cls.library.isNonNullableByDefault
+          ? templateCantInferTypeDueToNoCombinedSignature.withArguments(name)
+          : templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
       parameter.charOffset,
       name.length,
       wasHandled: true,
@@ -3347,7 +3482,7 @@
   String name = member.fullNameForErrors;
   List<LocatedMessage> context = overriddenMembers
       .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithInheritedMembersCause
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
             .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
                 overriddenMember.fullNameForErrors.length);
       })
@@ -3403,7 +3538,11 @@
   //   }
   // }
   cls.addProblem(
-      templateCantInferReturnTypeDueToInconsistentOverrides.withArguments(name),
+      cls.library.isNonNullableByDefault
+          ? templateCantInferReturnTypeDueToNoCombinedSignature
+              .withArguments(name)
+          : templateCantInferReturnTypeDueToInconsistentOverrides
+              .withArguments(name),
       member.charOffset,
       name.length,
       wasHandled: true,
@@ -3414,7 +3553,7 @@
     Iterable<ClassMember> overriddenMembers) {
   List<LocatedMessage> context = overriddenMembers
       .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithInheritedMembersCause
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
             .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
                 overriddenMember.fullNameForErrors.length);
       })
@@ -3424,7 +3563,9 @@
       .toList();
   String name = member.fullNameForErrors;
   cls.addProblem(
-      templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
+      cls.library.isNonNullableByDefault
+          ? templateCantInferTypeDueToNoCombinedSignature.withArguments(name)
+          : templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
       member.charOffset,
       name.length,
       wasHandled: true,
@@ -3469,3 +3610,300 @@
     }
   }
 }
+
+/// Class used for computing and inspecting the combined member signature for
+/// a set of overridden/inherited members.
+class CombinedMemberSignature {
+  /// The class hierarchy builder used for building this class.
+  final ClassHierarchyBuilder hierarchy;
+
+  /// The target class for the combined member signature.
+  ///
+  /// The [_memberTypes] are computed in terms of each member is inherited into
+  /// [classBuilder].
+  ///
+  /// [classBuilder] is also used for determining whether the combined member
+  /// signature should be computed using nnbd or legacy semantics.
+  final SourceClassBuilder classBuilder;
+
+  /// The list of the members inherited into or overridden in [classBuilder].
+  final List<ClassMember> members;
+
+  /// The index within [members] for the member whose type is the most specific
+  /// among [members]. If `null`, the combined member signature is not defined
+  /// for [members] in [classBuilder].
+  ///
+  /// For the legacy computation, the type of this member defines the combined
+  /// member signature.
+  ///
+  /// For the nnbd computation, this is one of the members whose type define
+  /// the combined member signature, and the indices of the remaining members
+  /// are stored in [_mutualSubtypes].
+  int _canonicalMemberIndex;
+
+  /// For the nnbd computation, this maps each distinct but most specific member
+  /// type to the index of one of the [members] with that type.
+  ///
+  /// If there is only one most specific member type, this is `null`.
+  Map<DartType, int> _mutualSubtypes;
+
+  /// Cache for the types of [members] as inherited into [classBuilder].
+  List<DartType> _memberTypes;
+
+  /// Cache for the this type of [classBuilder].
+  DartType _thisType;
+
+  /// If `true` the combined member signature type has been computed.
+  ///
+  /// Note that the combined member signature type might be undefined in which
+  /// case [_combinedMemberSignatureType] is `null`.
+  bool _isCombinedMemberSignatureTypeComputed = false;
+
+  /// Cache the computed combined member signature type.
+  ///
+  /// If the combined member signature type is undefined this is set to `null`.
+  DartType _combinedMemberSignatureType;
+
+  /// Creates a [CombinedMemberSignature] whose canonical member is already
+  /// defined.
+  CombinedMemberSignature.internal(this.hierarchy, this.classBuilder,
+      this._canonicalMemberIndex, this.members);
+
+  /// Creates a [CombinedMemberSignature] for [members] inherited into
+  /// [classBuilder].
+  ///
+  /// If [forSetter] is `true`, contravariance of the setter types is used to
+  /// compute the most specific member type. Otherwise covariance of the getter
+  /// types or function types is used.
+  CombinedMemberSignature(this.hierarchy, this.classBuilder, this.members,
+      {bool forSetter}) {
+    assert(forSetter != null);
+    ClassMember bestSoFar;
+    int bestSoFarIndex;
+    if (members.length == 1) {
+      bestSoFar = members.first;
+      bestSoFarIndex = 0;
+    } else {
+      bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
+
+      DartType bestTypeSoFar;
+      for (int candidateIndex = members.length - 1;
+          candidateIndex >= 0;
+          candidateIndex--) {
+        ClassMember candidate = members[candidateIndex];
+        DartType candidateType = getMemberType(candidateIndex);
+        if (bestSoFar == null) {
+          bestSoFar = candidate;
+          bestTypeSoFar = candidateType;
+          bestSoFarIndex = candidateIndex;
+        } else {
+          if (_isMoreSpecific(candidateType, bestTypeSoFar, forSetter)) {
+            if (isNonNullableByDefault &&
+                _isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
+              if (_mutualSubtypes == null) {
+                _mutualSubtypes = {
+                  bestTypeSoFar: bestSoFarIndex,
+                  candidateType: candidateIndex
+                };
+              } else {
+                _mutualSubtypes[candidateType] = candidateIndex;
+              }
+            } else {
+              _mutualSubtypes = null;
+            }
+            bestSoFarIndex = candidateIndex;
+            bestSoFar = candidate;
+            bestTypeSoFar = candidateType;
+          }
+        }
+      }
+      if (bestSoFar != null) {
+        for (int candidateIndex = 0;
+            candidateIndex < members.length;
+            candidateIndex++) {
+          DartType candidateType = getMemberType(candidateIndex);
+          if (!_isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
+            if (!shouldOverrideProblemBeOverlooked(classBuilder)) {
+              bestSoFar = null;
+              bestSoFarIndex = null;
+              bestTypeSoFar = null;
+              _mutualSubtypes = null;
+            }
+            break;
+          }
+        }
+      }
+    }
+
+    _canonicalMemberIndex = bestSoFarIndex;
+  }
+
+  /// The member within [members] type is the most specific among [members].
+  /// If `null`, the combined member signature is not defined for [members] in
+  /// [classBuilder].
+  ///
+  /// For the legacy computation, the type of this member defines the combined
+  /// member signature.
+  ///
+  /// For the nnbd computation, this is one of the members whose type define
+  /// the combined member signature, and the indices of the all members whose
+  /// type define the combined member signature are in [mutualSubtypeIndices].
+  ClassMember get canonicalClassMember =>
+      _canonicalMemberIndex != null ? members[_canonicalMemberIndex] : null;
+
+  /// The index within [members] for the member whose type is the most specific
+  /// among [members]. If `null`, the combined member signature is not defined
+  /// for [members] in [classBuilder].
+  ///
+  /// For the legacy computation, the type of this member defines the combined
+  /// member signature.
+  ///
+  /// For the nnbd computation, this is one of the members whose type define
+  /// the combined member signature, and the indices of the all members whose
+  /// type define the combined member signature are in [mutualSubtypeIndices].
+  int get classMemberIndex => _canonicalMemberIndex;
+
+  /// For the nnbd computation, the indices of the [members] with most specific
+  /// member type.
+  ///
+  /// If there is only one most specific member type, this is `null`.
+  Set<int> get mutualSubtypeIndices => _mutualSubtypes?.values?.toSet();
+
+  /// The this type of [classBuilder].
+  DartType get thisType {
+    return _thisType ??= hierarchy.coreTypes
+        .thisInterfaceType(classBuilder.cls, classBuilder.library.nonNullable);
+  }
+
+  /// Returns type of the [index]th member in [members] as inherited in
+  /// [classBuilder].
+  DartType getMemberType(int index) {
+    _memberTypes ??= new List<DartType>(members.length);
+    DartType candidateType = _memberTypes[index];
+    if (candidateType == null) {
+      ClassMember candidate = members[index];
+      Member target = candidate.getMember(hierarchy);
+      assert(target != null,
+          "No member computed for ${candidate} (${candidate.runtimeType})");
+      candidateType = _computeMemberType(thisType, target);
+      if (!classBuilder.library.isNonNullableByDefault) {
+        candidateType = legacyErasure(hierarchy.coreTypes, candidateType);
+      }
+      _memberTypes[index] = candidateType;
+    }
+    return candidateType;
+  }
+
+  /// Returns the type of the combined member signature, if defined.
+  DartType get combinedMemberSignatureType {
+    if (!_isCombinedMemberSignatureTypeComputed) {
+      _isCombinedMemberSignatureTypeComputed = true;
+      if (_canonicalMemberIndex == null) {
+        return null;
+      }
+      if (classBuilder.library.isNonNullableByDefault) {
+        _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
+        if (_mutualSubtypes != null) {
+          _combinedMemberSignatureType =
+              norm(hierarchy.coreTypes, _combinedMemberSignatureType);
+          for (int index in _mutualSubtypes.values) {
+            if (_canonicalMemberIndex != index) {
+              _combinedMemberSignatureType = nnbdTopMerge(
+                  hierarchy.coreTypes,
+                  _combinedMemberSignatureType,
+                  norm(hierarchy.coreTypes, getMemberType(index)));
+            }
+          }
+        }
+      } else {
+        _combinedMemberSignatureType = legacyErasure(
+            hierarchy.coreTypes, getMemberType(_canonicalMemberIndex));
+      }
+    }
+    return _combinedMemberSignatureType;
+  }
+
+  /// Returns the type of the combined member signature, if defined, with
+  /// all method type parameters substituted with [typeParameters].
+  ///
+  /// This is used for inferring types on a declared member from the type of the
+  /// combined member signature.
+  DartType getCombinedSignatureTypeInContext(
+      List<TypeParameter> typeParameters) {
+    DartType type = combinedMemberSignatureType;
+    if (type == null) {
+      return null;
+    }
+    int typeParameterCount = typeParameters.length;
+    if (type is FunctionType) {
+      List<TypeParameter> signatureTypeParameters = type.typeParameters;
+      if (typeParameterCount != signatureTypeParameters.length) {
+        return null;
+      }
+      if (typeParameterCount == 0) {
+        return type;
+      }
+      List<DartType> types = new List<DartType>(typeParameterCount);
+      for (int i = 0; i < typeParameterCount; i++) {
+        types[i] = new TypeParameterType.forAlphaRenaming(
+            signatureTypeParameters[i], typeParameters[i]);
+      }
+      Substitution substitution =
+          Substitution.fromPairs(signatureTypeParameters, types);
+      for (int i = 0; i < typeParameterCount; i++) {
+        DartType typeParameterBound = typeParameters[i].bound;
+        DartType signatureTypeParameterBound =
+            substitution.substituteType(signatureTypeParameters[i].bound);
+        if (!hierarchy.types
+            .performNullabilityAwareMutualSubtypesCheck(
+                typeParameterBound, signatureTypeParameterBound)
+            .isSubtypeWhenUsingNullabilities()) {
+          return null;
+        }
+      }
+      return substitution.substituteType(type.withoutTypeParameters);
+    } else if (typeParameterCount != 0) {
+      return null;
+    }
+    return type;
+  }
+
+  DartType _computeMemberType(DartType thisType, Member member) {
+    DartType type;
+    if (member is Procedure) {
+      if (member.isGetter) {
+        type = member.getterType;
+      } else if (member.isSetter) {
+        type = member.setterType;
+      } else {
+        type = member.function
+            .computeFunctionType(member.enclosingLibrary.nonNullable);
+      }
+    } else if (member is Field) {
+      type = member.type;
+    } else {
+      unhandled("${member.runtimeType}", "$member", classBuilder.charOffset,
+          classBuilder.fileUri);
+    }
+    InterfaceType instance = hierarchy.getTypeAsInstanceOf(
+        thisType,
+        member.enclosingClass,
+        classBuilder.library.library,
+        hierarchy.coreTypes);
+    assert(
+        instance != null,
+        "No instance of $thisType as ${member.enclosingClass} found for "
+        "$member.");
+    return Substitution.fromInterfaceType(instance).substituteType(type);
+  }
+
+  bool _isMoreSpecific(DartType a, DartType b, bool forSetter) {
+    if (forSetter) {
+      return hierarchy.types
+          .isSubtypeOf(b, a, SubtypeCheckMode.withNullabilities);
+    } else {
+      return hierarchy.types
+          .isSubtypeOf(a, b, SubtypeCheckMode.withNullabilities);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index 9daa3e6..08a6f34 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -50,33 +50,31 @@
 import 'class_hierarchy_builder.dart';
 
 class ForwardingNode {
-  final ClassHierarchyBuilder hierarchy;
+  ClassHierarchyBuilder get hierarchy => _combinedMemberSignature.hierarchy;
 
-  final SourceClassBuilder classBuilder;
+  SourceClassBuilder get classBuilder => _combinedMemberSignature.classBuilder;
 
-  final ClassMember combinedMemberSignatureResult;
+  // TODO(johnniwinther): Use [_combinedMemberSignature] more directly in
+  // the forwarding node computation.
+  final CombinedMemberSignature _combinedMemberSignature;
+
+  ClassMember get combinedMemberSignatureResult =>
+      _combinedMemberSignature.canonicalClassMember;
 
   /// The index of [combinedMemberSignatureResult] in [_candidates].
-  final int _combinedMemberIndex;
+  int get _combinedMemberIndex => _combinedMemberSignature.classMemberIndex;
 
   final ProcedureKind kind;
 
   /// A list containing the directly implemented and directly inherited
   /// procedures of the class in question.
-  final List<ClassMember> _candidates;
+  List<ClassMember> get _candidates => _combinedMemberSignature.members;
 
   /// The indices of the [_candidates] whose types need to be merged to compute
   /// the resulting member type.
-  final Set<int> _mergeIndices;
+  Set<int> get _mergeIndices => _combinedMemberSignature.mutualSubtypeIndices;
 
-  ForwardingNode(
-      this.hierarchy,
-      this.classBuilder,
-      this.combinedMemberSignatureResult,
-      this._combinedMemberIndex,
-      this._candidates,
-      this.kind,
-      this._mergeIndices);
+  ForwardingNode(this._combinedMemberSignature, this.kind);
 
   Name get name => combinedMemberSignatureResult.name;
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index c58a522..0899ab4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -492,61 +492,8 @@
   }
 
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
-    SourceLibraryBuilder libraryBuilder = this.library;
-    Library library = libraryBuilder.library;
-    final DartType bottomType = library.isNonNullableByDefault
-        ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
-
-    // Check in bounds of own type variables.
-    for (TypeParameter parameter in cls.typeParameters) {
-      Set<TypeArgumentIssue> issues = {};
-      issues.addAll(findTypeArgumentIssues(
-              library,
-              parameter.bound,
-              typeEnvironment,
-              SubtypeCheckMode.ignoringNullabilities,
-              bottomType,
-              allowSuperBounded: true) ??
-          const []);
-      if (library.isNonNullableByDefault) {
-        issues.addAll(findTypeArgumentIssues(library, parameter.bound,
-                typeEnvironment, SubtypeCheckMode.withNullabilities, bottomType,
-                allowSuperBounded: true) ??
-            const []);
-      }
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-        if (libraryBuilder.inferredTypes.contains(argument)) {
-          // Inference in type expressions in the supertypes boils down to
-          // instantiate-to-bound which shouldn't produce anything that breaks
-          // the bounds after the non-simplicity checks are done.  So, any
-          // violation here is the result of non-simple bounds, and the error
-          // is reported elsewhere.
-          continue;
-        }
-
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          libraryBuilder.reportTypeArgumentIssue(
-              messageGenericFunctionTypeUsedAsActualTypeArgument,
-              fileUri,
-              parameter.fileOffset,
-              null);
-        } else {
-          libraryBuilder.reportTypeArgumentIssue(
-              templateIncorrectTypeArgument.withArguments(
-                  argument,
-                  typeParameter.bound,
-                  typeParameter.name,
-                  getGenericTypeName(issue.enclosingType),
-                  library.isNonNullableByDefault),
-              fileUri,
-              parameter.fileOffset,
-              typeParameter);
-        }
-      }
-    }
+    library.checkBoundsInTypeParameters(
+        typeEnvironment, cls.typeParameters, fileUri);
 
     // Check in supers.
     if (cls.supertype != null) {
@@ -561,62 +508,37 @@
       }
     }
 
-    // Check in members.
-    for (Procedure procedure in cls.procedures) {
-      checkVarianceInFunction(procedure, typeEnvironment, cls.typeParameters);
-      libraryBuilder.checkBoundsInFunctionNode(
-          procedure.function, typeEnvironment, fileUri);
-    }
-    for (Constructor constructor in cls.constructors) {
-      libraryBuilder.checkBoundsInFunctionNode(
-          constructor.function, typeEnvironment, fileUri);
-    }
-    for (RedirectingFactoryConstructor redirecting
-        in cls.redirectingFactoryConstructors) {
-      libraryBuilder.checkBoundsInFunctionNodeParts(
-          typeEnvironment, fileUri, redirecting.fileOffset,
-          typeParameters: redirecting.typeParameters,
-          positionalParameters: redirecting.positionalParameters,
-          namedParameters: redirecting.namedParameters);
-    }
-
     forEach((String name, Builder builder) {
-      // Check fields.
       if (builder is SourceFieldBuilder) {
+        // Check fields.
         checkVarianceInField(builder, typeEnvironment, cls.typeParameters);
-        libraryBuilder.checkTypesInField(builder, typeEnvironment);
-      }
-
-      // Check initializers.
-      if (builder is FunctionBuilder &&
-          !(builder.isAbstract || builder.isExternal) &&
-          builder.formals != null) {
-        libraryBuilder.checkInitializersInFormals(
-            builder.formals, typeEnvironment);
+        library.checkTypesInField(builder, typeEnvironment);
+      } else if (builder is ProcedureBuilder) {
+        // Check procedures
+        checkVarianceInFunction(
+            builder.procedure, typeEnvironment, cls.typeParameters);
+        library.checkTypesInProcedureBuilder(builder, typeEnvironment);
+      } else {
+        assert(builder is DillMemberBuilder && builder.name == redirectingName,
+            "Unexpected member: $builder.");
       }
     });
 
-    constructors.local.forEach((String name, MemberBuilder builder) {
+    forEachConstructor((String name, MemberBuilder builder) {
       if (builder is ConstructorBuilder) {
-        if (!builder.isExternal && builder.formals != null) {
-          libraryBuilder.checkInitializersInFormals(
-              builder.formals, typeEnvironment);
-        }
+        library.checkTypesInConstructorBuilder(builder, typeEnvironment);
       } else if (builder is RedirectingFactoryBuilder) {
-        // Default values are not required on redirecting factory constructors.
+        library.checkTypesInRedirectingFactoryBuilder(builder, typeEnvironment);
       } else if (builder is ProcedureBuilder) {
         assert(builder.isFactory, "Unexpected constructor $builder.");
-        if (!builder.isExternal && builder.formals != null) {
-          libraryBuilder.checkInitializersInFormals(
-              builder.formals, typeEnvironment);
-        }
+        library.checkTypesInProcedureBuilder(builder, typeEnvironment);
       } else {
         assert(
             // This is a synthesized constructor.
             builder is DillMemberBuilder && builder.member is Constructor,
-            "Unexpected constructor $builder.");
+            "Unexpected constructor: $builder.");
       }
-    });
+    }, includeInjectedConstructors: true);
   }
 
   void addSyntheticConstructor(SyntheticConstructorBuilder constructorBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 6792c0d..b8d7b3d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -5,15 +5,18 @@
 import 'dart:core' hide MapEntry;
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/type_environment.dart';
 
 import '../../base/common.dart';
 
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/extension_builder.dart';
+import '../builder/field_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
+import '../builder/procedure_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
 
@@ -61,6 +64,9 @@
             typeParameters, onType);
 
   @override
+  SourceLibraryBuilder get library => super.library;
+
+  @override
   SourceExtensionBuilder get origin => _origin ?? this;
 
   Extension get extension => isPatch ? origin._extension : _extension;
@@ -231,4 +237,27 @@
     });
     return count;
   }
+
+  void checkTypesInOutline(TypeEnvironment typeEnvironment) {
+    library.checkBoundsInTypeParameters(
+        typeEnvironment, extension.typeParameters, fileUri);
+
+    // Check on clause.
+    if (_extension.onType != null) {
+      library.checkBoundsInType(_extension.onType, typeEnvironment,
+          onType.fileUri, onType.charOffset);
+    }
+
+    forEach((String name, Builder builder) {
+      if (builder is SourceFieldBuilder) {
+        // Check fields.
+        library.checkTypesInField(builder, typeEnvironment);
+      } else if (builder is ProcedureBuilder) {
+        // Check procedures
+        library.checkTypesInProcedureBuilder(builder, typeEnvironment);
+      } else {
+        assert(false, "Unexpected member: $builder.");
+      }
+    });
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index f7492b8..d142b10 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -3191,6 +3191,63 @@
     }
   }
 
+  void checkBoundsInTypeParameters(TypeEnvironment typeEnvironment,
+      List<TypeParameter> typeParameters, Uri fileUri) {
+    final DartType bottomType = library.isNonNullableByDefault
+        ? const NeverType(Nullability.nonNullable)
+        : typeEnvironment.nullType;
+
+    // Check in bounds of own type variables.
+    for (TypeParameter parameter in typeParameters) {
+      Set<TypeArgumentIssue> issues = {};
+      issues.addAll(findTypeArgumentIssues(
+              library,
+              parameter.bound,
+              typeEnvironment,
+              SubtypeCheckMode.ignoringNullabilities,
+              bottomType,
+              allowSuperBounded: true) ??
+          const []);
+      if (library.isNonNullableByDefault) {
+        issues.addAll(findTypeArgumentIssues(library, parameter.bound,
+                typeEnvironment, SubtypeCheckMode.withNullabilities, bottomType,
+                allowSuperBounded: true) ??
+            const []);
+      }
+      for (TypeArgumentIssue issue in issues) {
+        DartType argument = issue.argument;
+        TypeParameter typeParameter = issue.typeParameter;
+        if (inferredTypes.contains(argument)) {
+          // Inference in type expressions in the supertypes boils down to
+          // instantiate-to-bound which shouldn't produce anything that breaks
+          // the bounds after the non-simplicity checks are done.  So, any
+          // violation here is the result of non-simple bounds, and the error
+          // is reported elsewhere.
+          continue;
+        }
+
+        if (argument is FunctionType && argument.typeParameters.length > 0) {
+          reportTypeArgumentIssue(
+              messageGenericFunctionTypeUsedAsActualTypeArgument,
+              fileUri,
+              parameter.fileOffset,
+              null);
+        } else {
+          reportTypeArgumentIssue(
+              templateIncorrectTypeArgument.withArguments(
+                  argument,
+                  typeParameter.bound,
+                  typeParameter.name,
+                  getGenericTypeName(issue.enclosingType),
+                  library.isNonNullableByDefault),
+              fileUri,
+              parameter.fileOffset,
+              typeParameter);
+        }
+      }
+    }
+  }
+
   void checkBoundsInFunctionNodeParts(
       TypeEnvironment typeEnvironment, Uri fileUri, int fileOffset,
       {List<TypeParameter> typeParameters,
@@ -3265,6 +3322,34 @@
     }
   }
 
+  void checkTypesInProcedureBuilder(
+      ProcedureBuilder procedureBuilder, TypeEnvironment typeEnvironment) {
+    checkBoundsInFunctionNode(procedureBuilder.procedure.function,
+        typeEnvironment, procedureBuilder.fileUri);
+    if (procedureBuilder.formals != null &&
+        !(procedureBuilder.isAbstract || procedureBuilder.isExternal)) {
+      checkInitializersInFormals(procedureBuilder.formals, typeEnvironment);
+    }
+  }
+
+  void checkTypesInConstructorBuilder(
+      ConstructorBuilder constructorBuilder, TypeEnvironment typeEnvironment) {
+    checkBoundsInFunctionNode(
+        constructorBuilder.constructor.function, typeEnvironment, fileUri);
+    if (!constructorBuilder.isExternal && constructorBuilder.formals != null) {
+      checkInitializersInFormals(constructorBuilder.formals, typeEnvironment);
+    }
+  }
+
+  void checkTypesInRedirectingFactoryBuilder(
+      RedirectingFactoryBuilder redirectingFactoryBuilder,
+      TypeEnvironment typeEnvironment) {
+    checkBoundsInFunctionNode(redirectingFactoryBuilder.procedure.function,
+        typeEnvironment, redirectingFactoryBuilder.fileUri);
+    // Default values are not required on redirecting factory constructors so
+    // we don't call [checkInitializersInFormals].
+  }
+
   void checkBoundsInFunctionNode(
       FunctionNode function, TypeEnvironment typeEnvironment, Uri fileUri) {
     checkBoundsInFunctionNodeParts(
@@ -3493,13 +3578,13 @@
       if (declaration is FieldBuilder) {
         checkTypesInField(declaration, typeEnvironment);
       } else if (declaration is ProcedureBuilder) {
-        checkBoundsInFunctionNode(declaration.procedure.function,
-            typeEnvironment, declaration.fileUri);
-        if (declaration.formals != null) {
-          checkInitializersInFormals(declaration.formals, typeEnvironment);
-        }
+        checkTypesInProcedureBuilder(declaration, typeEnvironment);
       } else if (declaration is SourceClassBuilder) {
         declaration.checkTypesInOutline(typeEnvironment);
+      } else if (declaration is SourceExtensionBuilder) {
+        declaration.checkTypesInOutline(typeEnvironment);
+      } else {
+        //assert(false, "Unexpected declaration ${declaration.runtimeType}");
       }
     }
     inferredTypes.clear();
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 7412866..df50caa 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2139,8 +2139,8 @@
   template: "This is the inherited member."
   severity: CONTEXT
 
-DeclaredMemberConflictsWithInheritedMembersCause:
-  template: "This is one of the inherited members."
+DeclaredMemberConflictsWithOverriddenMembersCause:
+  template: "This is one of the overridden members."
   severity: CONTEXT
 
 InheritedMembersConflict:
@@ -3446,14 +3446,46 @@
     #num2%12.3 bytes/ms, and
     #num3%12.3 ms/libraries.
 
+CantInferTypeDueToNoCombinedSignature:
+  template: "Can't infer a type for '#name' as the overridden members don't have a combined signature."
+  tip: "Try adding an explicit type."
+  analyzerCode: COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE
+  configuration: nnbd-strong
+  script: |
+    class A {
+      void method(int a) {}
+    }
+    class B {
+      void method(String a) {}
+    }
+    class C implements A, B {
+      void method(a) {}
+    }
+
+CantInferReturnTypeDueToNoCombinedSignature:
+  template: "Can't infer a return type for '#name' as the overridden members don't have a combined signature."
+  tip: "Try adding an explicit type."
+  analyzerCode: COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE
+  configuration: nnbd-strong
+  script: |
+    abstract class A {
+      int get getter;
+    }
+    abstract class B {
+      String get getter;
+    }
+    abstract class C implements A, B {
+      get getter;
+    }
+
 CantInferTypeDueToInconsistentOverrides:
-  template: "Can't infer a type for '#name' as some of the inherited members have different types."
+  template: "Can't infer a type for '#name' as some of the overridden members have different types."
   tip: "Try adding an explicit type."
   analyzerCode: INVALID_METHOD_OVERRIDE
   external: testcases/inference/inconsistent_overrides.dart
 
 CantInferReturnTypeDueToInconsistentOverrides:
-  template: "Can't infer a return type for '#name' as some of the inherited members have different types."
+  template: "Can't infer a return type for '#name' as some of the overridden members have different types."
   tip: "Try adding an explicit type."
   analyzerCode: INVALID_METHOD_OVERRIDE
   external: testcases/inference/inconsistent_overrides.dart
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 1f0ca3c..4a2893b 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -529,6 +529,7 @@
 initializer's
 insertion
 inspect
+inspecting
 inspection
 inspector
 inspired
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 47cfd38..62f6492 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -273,6 +273,7 @@
 behaved
 behaves
 behavior
+behavioral
 behaviors
 behind
 being
@@ -844,6 +845,7 @@
 diet
 differ
 difference
+differences
 different
 differently
 dig
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index bef5e7f..b3c7774 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -71,6 +71,11 @@
 brand
 brave
 brown
+bt
+bt3a
+bt3b
+bt4a
+bt4b
 btw
 builddir
 bulk2
@@ -137,6 +142,10 @@
 coverages
 cp
 csi
+ct3a
+ct3b
+ct4a
+ct4b
 ctrl
 cumulative
 cursor
@@ -239,6 +248,15 @@
 favors
 fi
 fibonacci
+field1c
+field2a
+field2b
+field2c
+field3a
+field3b
+field3c
+field4a
+field4b
 filesystem
 filler
 fisk
@@ -280,6 +298,9 @@
 gave
 gc
 gcd
+getter1c
+getter1d
+getter1e
 goo
 google
 graphic
@@ -411,6 +432,7 @@
 matters
 mds
 measured
+method1d
 metric
 metrics
 mf
@@ -549,6 +571,11 @@
 selection
 sensitive
 services
+setter1a
+setter1b
+setter1c
+setter1d
+setter1e
 setups
 severe
 sheets
@@ -604,6 +631,10 @@
 supplement
 suspension
 symbolic
+t3a
+t3b
+t4a
+t4b
 t\b\f\u
 t\u0008\f\u
 tails
diff --git a/pkg/front_end/test/text_representation/data/types_opt_out.dart b/pkg/front_end/test/text_representation/data/types_opt_out.dart
index 5db349b..b302015 100644
--- a/pkg/front_end/test/text_representation/data/types_opt_out.dart
+++ b/pkg/front_end/test/text_representation/data/types_opt_out.dart
@@ -24,7 +24,7 @@
     String /*normal|limited.String**/ /*verbose.dart.core::String**/ o) {}
 voidType(void /*void*/ o) {}
 dynamicType(dynamic /*dynamic*/ o) {}
-neverType(Never /*Never**/ o) {}
+neverType(Never /*normal|limited.Null?*/ /*verbose.dart.core::Null?*/ o) {}
 objectType(
     Object /*normal|limited.Object**/ /*verbose.dart.core::Object**/ o) {}
 genericType1(
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
index 2bbb7e2..8c879e7 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
@@ -2,146 +2,146 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
 //   var field2 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
 //   var field2 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
 //   var field4 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
 //   var field4 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
 //   int field6;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
 //   String field6;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
 //   int field8;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
 //   String field8;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field11; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the overridden members.
 //   T field11;
 //     ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the overridden members.
 //   S field11;
 //     ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
 //   var field17 = 0;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
 //   String field17;
 //          ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
 //   int field18;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
 //   var field18 = '';
 //       ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
 //   var field2 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
 //   var field2 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
 //   var field4 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
 //   var field4 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
 //   int field6;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
 //   String field6;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
 //   int field8;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
 //   String field8;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
 //   var field17 = 0;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
 //   String field17;
 //          ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
 //   int field18;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
 //   var field18 = '';
 //       ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
index 73fdb87..0400159 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
@@ -2,146 +2,146 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
 //   var field2 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
 //   var field2 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
 //   var field4 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
 //   var field4 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
 //   int field6;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
 //   String field6;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
 //   int field8;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
 //   String field8;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field11; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the overridden members.
 //   T field11;
 //     ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the overridden members.
 //   S field11;
 //     ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
 //   var field17 = 0;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
 //   String field17;
 //          ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
 //   int field18;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
 //   var field18 = '';
 //       ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
 //   var field2 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
 //   var field2 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
 //   var field4 = 0;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
 //   var field4 = '';
 //       ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
 //   int field6;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
 //   String field6;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
 //   int field8;
 //       ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
 //   String field8;
 //          ^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
 //   var field17 = 0;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
 //   String field17;
 //          ^^^^^^^
 //
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
 //   int field18;
 //       ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
 //   var field18 = '';
 //       ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
index 9b896a7..ec8f574 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'C'.
 // abstract class C implements A, B {}
 //                ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
index 98445c0..35d40fb 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'C'.
 // abstract class C implements A, B {}
 //                ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
index 98445c0..35d40fb 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'C'.
 // abstract class C implements A, B {}
 //                ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
index b7df28f..e77f24e 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'B with C'.
 // mixin M on B, C {}
 //       ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
index 66fe78e..194538f 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'B with C'.
 // mixin M on B, C {}
 //       ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
index 66fe78e..194538f 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'B with C'.
 // mixin M on B, C {}
 //       ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart
index a943e3a..8035f1d 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart
@@ -51,10 +51,8 @@
 
   set setterFromSetter(value);
 
-  // TODO(johnniwinther): This should be an error.
   get getterFromSetter;
 
-  // TODO(johnniwinther): This should be an error.
   set setterFromGetter(value);
 
   get getterFromGetterWithSetterConflict;
@@ -81,10 +79,8 @@
 
   set setterFromSetter(value);
 
-  // TODO(johnniwinther): This should be an error.
   get getterFromSetter;
 
-  // TODO(johnniwinther): This should be an error.
   set setterFromGetter(value);
 
   get getterFromGetterWithSetterConflict;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
index 8bdc4d8..c4a5102 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
@@ -2,50 +2,94 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
 //   num get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
 //   int get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:54:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   get getterFromSetter;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+//   set getterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+//   set getterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
 //   set setterFromSetter(num value);
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
 //   set setterFromSetter(int value);
 //       ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:56:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   set setterFromGetter(value);
+//                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+//   num get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+//   int get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:78:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
 //   num get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
 //   int get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   get getterFromSetter;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+//   set getterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+//   set getterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
 //   set setterFromSetter(num value);
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
 //   set setterFromSetter(int value);
 //       ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:84:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   set setterFromGetter(value);
+//                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+//   num get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+//   int get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -106,8 +150,8 @@
     ;
   abstract get getterFromGetter() → invalid-type;
   abstract set setterFromSetter(invalid-type value) → void;
-  abstract get getterFromSetter() → core::num*;
-  abstract set setterFromGetter(core::num* value) → void;
+  abstract get getterFromSetter() → invalid-type;
+  abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
   abstract forwarding-stub get setterFromGetter() → core::int*;
@@ -138,8 +182,8 @@
     ;
   abstract get getterFromGetter() → invalid-type;
   abstract set setterFromSetter(invalid-type value) → void;
-  abstract get getterFromSetter() → dynamic;
-  abstract set setterFromGetter(dynamic value) → void;
+  abstract get getterFromSetter() → invalid-type;
+  abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
   abstract forwarding-stub get setterFromGetter() → core::int*;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
index 2e2d511..81942f2 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
@@ -2,50 +2,94 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
 //   num get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
 //   int get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:54:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   get getterFromSetter;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+//   set getterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+//   set getterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
 //   set setterFromSetter(num value);
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
 //   set setterFromSetter(int value);
 //       ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:56:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   set setterFromGetter(value);
+//                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+//   num get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+//   int get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:78:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
 //   num get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
 //   int get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   get getterFromSetter;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+//   set getterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+//   set getterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
 //   set setterFromSetter(num value);
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
 //   set setterFromSetter(int value);
 //       ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:84:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   set setterFromGetter(value);
+//                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+//   num get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+//   int get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -110,8 +154,8 @@
     ;
   abstract get getterFromGetter() → invalid-type;
   abstract set setterFromSetter(invalid-type value) → void;
-  abstract get getterFromSetter() → core::num*;
-  abstract set setterFromGetter(core::num* value) → void;
+  abstract get getterFromSetter() → invalid-type;
+  abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
   abstract forwarding-stub get setterFromGetter() → core::int*;
@@ -144,8 +188,8 @@
     ;
   abstract get getterFromGetter() → invalid-type;
   abstract set setterFromSetter(invalid-type value) → void;
-  abstract get getterFromSetter() → dynamic;
-  abstract set setterFromGetter(dynamic value) → void;
+  abstract get getterFromSetter() → invalid-type;
+  abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
   abstract forwarding-stub get setterFromGetter() → core::int*;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
index 2e2d511..81942f2 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
@@ -2,50 +2,94 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
 //   num get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
 //   int get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:54:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   get getterFromSetter;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+//   set getterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+//   set getterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
 //   set setterFromSetter(num value);
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
 //   set setterFromSetter(int value);
 //       ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:56:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   set setterFromGetter(value);
+//                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+//   num get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+//   int get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:78:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
 //   num get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
 //   int get getterFromGetter;
 //           ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   get getterFromSetter;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+//   set getterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+//   set getterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
 //   set setterFromSetter(num value);
 //       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
 //   set setterFromSetter(int value);
 //       ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:84:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+//   set setterFromGetter(value);
+//                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+//   num get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+//   int get setterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -110,8 +154,8 @@
     ;
   abstract get getterFromGetter() → invalid-type;
   abstract set setterFromSetter(invalid-type value) → void;
-  abstract get getterFromSetter() → core::num*;
-  abstract set setterFromGetter(core::num* value) → void;
+  abstract get getterFromSetter() → invalid-type;
+  abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
   abstract forwarding-stub get setterFromGetter() → core::int*;
@@ -144,8 +188,8 @@
     ;
   abstract get getterFromGetter() → invalid-type;
   abstract set setterFromSetter(invalid-type value) → void;
-  abstract get getterFromSetter() → dynamic;
-  abstract set setterFromGetter(dynamic value) → void;
+  abstract get getterFromSetter() → invalid-type;
+  abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
   abstract forwarding-stub get setterFromGetter() → core::int*;
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect
index 85c8784..bc603fc 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect
@@ -18,6 +18,46 @@
 // class A<X extends int> {}
 //         ^
 //
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//             ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> fieldOfE; // Error.
+//                 ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num> fooOfE() => null; // Error.
+//                ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
+//                      ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//               ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect
index 87bc7b9..fa633e1b 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect
@@ -18,6 +18,46 @@
 // class A<X extends int> {}
 //         ^
 //
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//             ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> fieldOfE; // Error.
+//                 ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num> fooOfE() => null; // Error.
+//                ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
+//                      ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//               ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect
index 87bc7b9..fa633e1b 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect
@@ -18,6 +18,46 @@
 // class A<X extends int> {}
 //         ^
 //
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//             ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> fieldOfE; // Error.
+//                 ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num> fooOfE() => null; // Error.
+//                ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
+//                      ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//               ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
index 2f1de22..39b351a 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get field1 => null;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
 //   dynamic field1;
 //           ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
 //   int field1;
 //       ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set field1(value) {}
 //              ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
 //   dynamic field1;
 //           ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
 //   int field1;
 //       ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get field2 => null;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
 //   int field2;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
 //   dynamic field2;
 //           ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set field2(value) {}
 //              ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
 //   int field2;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
 //   dynamic field2;
 //           ^^^^^^
 //
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
index 2d16975..537432c 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get field1 => null;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
 //   dynamic field1;
 //           ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
 //   int field1;
 //       ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set field1(value) {}
 //              ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
 //   dynamic field1;
 //           ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
 //   int field1;
 //       ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get field2 => null;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
 //   int field2;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
 //   dynamic field2;
 //           ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set field2(value) {}
 //              ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
 //   int field2;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
 //   dynamic field2;
 //           ^^^^^^
 //
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
index 2d16975..537432c 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get field1 => null;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
 //   dynamic field1;
 //           ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
 //   int field1;
 //       ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set field1(value) {}
 //              ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
 //   dynamic field1;
 //           ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
 //   int field1;
 //       ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get field2 => null;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
 //   int field2;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
 //   dynamic field2;
 //           ^^^^^^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   set field2(value) {}
 //              ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
 //   int field2;
 //       ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
 //   dynamic field2;
 //           ^^^^^^
 //
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
index e5c3a99..9a21f6c 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index f3a5049..28c663f 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
index f3a5049..28c663f 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
index ddd90c3..43ee8e9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 3214028..d3047a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
index 3214028..d3047a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
 //   final I1 a = null;
 //            ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
 //   final I2 a = null;
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
index 14cea21..b735a9b 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //   ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
 //   A g(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
 //   A g(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
 //   A g(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
 //   A g(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   h(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
 //   A h(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
 //   A h(A x, {I y}) {}
 //     ^
 //
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
index 3a01350..dedc39b 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //   ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
 //   A g(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
 //   A g(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
 //   A g(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
 //   A g(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   h(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
 //   A h(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
 //   A h(A x, {I y}) {}
 //     ^
 //
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
index 3a01350..dedc39b 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //   ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
 //   A f(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
 //   I f(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
 //   A g(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
 //   A g(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
 //   A g(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
 //   A g(I x, {I y}) {}
 //     ^
 //
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   h(x, {y}) {}
 //         ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
 //   A h(A x, {A y}) {}
 //     ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
 //   A h(A x, {I y}) {}
 //     ^
 //
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
index f6d6dda..28cd597 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
@@ -2,36 +2,36 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
 //   double get x;
 //              ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
 //   double get x;
 //              ^
 //
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index 5b91cfd..044f2fd 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -2,36 +2,36 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
 //   double get x;
 //              ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
 //   double get x;
 //              ^
 //
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
index 5b91cfd..044f2fd 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
@@ -2,36 +2,36 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
 //   double get x;
 //              ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
 //   double get x;
 //              ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
index 1385117..0ebb072 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
 //   void set x(double value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index c0bc8d0..8ae0ce1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
 //   void set x(double value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
index c0bc8d0..8ae0ce1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
 //   void set x(double value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
index bd38552..d9e8e4e 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
 //   A get x;
 //         ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
 //   void set x(B value);
 //            ^
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var y;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
 //   B get y;
 //         ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
 //   void set y(A value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
index 8fae470..3bfa8c0 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
 //   A get x;
 //         ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
 //   void set x(B value);
 //            ^
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var y;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
 //   B get y;
 //         ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
 //   void set y(A value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
index 8fae470..3bfa8c0 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
 //   A get x;
 //         ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
 //   void set x(B value);
 //            ^
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var y;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
 //   B get y;
 //         ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
 //   void set y(A value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
index e02792c..c38c16a 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
 //   void set x(num value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index c89eeb0..37df60c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
 //   void set x(num value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
index c89eeb0..37df60c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
 //   int get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
 //   void set x(num value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
index 25b44a1..0d41588 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
 //   void set x(int value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
index bd65763..ae57d36 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
 //   void set x(int value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
index bd65763..ae57d36 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
 //   num get x;
 //           ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
 //   void set x(int value);
 //            ^
 //
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart
index 3fd4ae8..b7305d8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart
@@ -23,17 +23,17 @@
 
   abstract late int lateInstanceField;
 
-  external abstract int externalInstanceField;
+  external abstract int externalInstanceField1;
 
-  external abstract final int externalFinalInstanceField;
+  external abstract final int externalFinalInstanceField1;
 
-  external abstract covariant num externalCovariantInstanceField;
+  external abstract covariant num externalCovariantInstanceField1;
 
-  abstract external int externalInstanceField;
+  abstract external int externalInstanceField2;
 
-  abstract external final int externalFinalInstanceField;
+  abstract external final int externalFinalInstanceField2;
 
-  abstract external covariant num externalCovariantInstanceField;
+  abstract external covariant num externalCovariantInstanceField2;
 
   external abstract late int externalLateInstanceField;
 }
@@ -54,8 +54,8 @@
 extension Extension on A {
   abstract int extensionInstanceField;
   abstract final int finalExtensionInstanceField;
-  abstract static int extensionStaticField;
-  abstract static final int finalExtensionStaticField;
+  abstract static int extensionStaticField = 0;
+  abstract static final int finalExtensionStaticField = 0;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
index 6bc5231..799f3a0 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
@@ -34,55 +34,34 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract int externalInstanceField;
+//   external abstract int externalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract final int externalFinalInstanceField;
+//   external abstract final int externalFinalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract covariant num externalCovariantInstanceField;
+//   external abstract covariant num externalCovariantInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external int externalInstanceField;
+//   abstract external int externalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-//   abstract external int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-//   external abstract int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external final int externalFinalInstanceField;
+//   abstract external final int externalFinalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-//   abstract external final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-//   external abstract final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external covariant num externalCovariantInstanceField;
+//   abstract external covariant num externalCovariantInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-//   abstract external covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-//   external abstract covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
 //   external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //                       ^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //                             ^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -193,11 +172,16 @@
   abstract set initializedField1(core::int #externalFieldValue) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #externalFieldValue) → void;
-  external get externalInstanceField() → core::int;
-  external set externalInstanceField(core::int #externalFieldValue) → void;
-  external get externalFinalInstanceField() → core::int;
-  external get externalCovariantInstanceField() → core::num;
-  external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField1() → core::int;
+  external set externalInstanceField1(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField1() → core::int;
+  external get externalCovariantInstanceField1() → core::num;
+  external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField2() → core::int;
+  external set externalInstanceField2(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField2() → core::int;
+  external get externalCovariantInstanceField2() → core::num;
+  external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #externalFieldValue) → void;
 }
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
@@ -34,55 +34,34 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract int externalInstanceField;
+//   external abstract int externalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract final int externalFinalInstanceField;
+//   external abstract final int externalFinalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract covariant num externalCovariantInstanceField;
+//   external abstract covariant num externalCovariantInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external int externalInstanceField;
+//   abstract external int externalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-//   abstract external int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-//   external abstract int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external final int externalFinalInstanceField;
+//   abstract external final int externalFinalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-//   abstract external final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-//   external abstract final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external covariant num externalCovariantInstanceField;
+//   abstract external covariant num externalCovariantInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-//   abstract external covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-//   external abstract covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
 //   external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //                       ^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //                             ^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
   abstract set initializedField1(core::int #externalFieldValue) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #externalFieldValue) → void;
-  external get externalInstanceField() → core::int;
-  external set externalInstanceField(core::int #externalFieldValue) → void;
-  external get externalFinalInstanceField() → core::int;
-  external get externalCovariantInstanceField() → core::num;
-  external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField1() → core::int;
+  external set externalInstanceField1(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField1() → core::int;
+  external get externalCovariantInstanceField1() → core::num;
+  external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField2() → core::int;
+  external set externalInstanceField2(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField2() → core::int;
+  external get externalCovariantInstanceField2() → core::num;
+  external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #externalFieldValue) → void;
 }
@@ -252,8 +236,8 @@
 static field core::int topLevelField;
 static final field core::int finalTopLevelField = 0;
 static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
 static abstract get Extension|extensionInstanceField() → core::int;
 static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
 static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
@@ -34,55 +34,34 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract int externalInstanceField;
+//   external abstract int externalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract final int externalFinalInstanceField;
+//   external abstract final int externalFinalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract covariant num externalCovariantInstanceField;
+//   external abstract covariant num externalCovariantInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external int externalInstanceField;
+//   abstract external int externalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-//   abstract external int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-//   external abstract int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external final int externalFinalInstanceField;
+//   abstract external final int externalFinalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-//   abstract external final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-//   external abstract final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external covariant num externalCovariantInstanceField;
+//   abstract external covariant num externalCovariantInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-//   abstract external covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-//   external abstract covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
 //   external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //                       ^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //                             ^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
   abstract set initializedField1(core::int #externalFieldValue) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #externalFieldValue) → void;
-  external get externalInstanceField() → core::int;
-  external set externalInstanceField(core::int #externalFieldValue) → void;
-  external get externalFinalInstanceField() → core::int;
-  external get externalCovariantInstanceField() → core::num;
-  external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField1() → core::int;
+  external set externalInstanceField1(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField1() → core::int;
+  external get externalCovariantInstanceField1() → core::num;
+  external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField2() → core::int;
+  external set externalInstanceField2(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField2() → core::int;
+  external get externalCovariantInstanceField2() → core::num;
+  external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #externalFieldValue) → void;
 }
@@ -252,8 +236,8 @@
 static field core::int topLevelField;
 static final field core::int finalTopLevelField = 0;
 static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
 static abstract get Extension|extensionInstanceField() → core::int;
 static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
 static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect
index 8ad6f00..69a99ab 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect
@@ -10,12 +10,12 @@
   abstract static final int finalStaticField;
   abstract late int ;
   lateInstanceField;
-  external abstract int externalInstanceField;
-  external abstract final int externalFinalInstanceField;
-  external abstract covariant num externalCovariantInstanceField;
-  abstract external int externalInstanceField;
-  abstract external final int externalFinalInstanceField;
-  abstract external covariant num externalCovariantInstanceField;
+  external abstract int externalInstanceField1;
+  external abstract final int externalFinalInstanceField1;
+  external abstract covariant num externalCovariantInstanceField1;
+  abstract external int externalInstanceField2;
+  abstract external final int externalFinalInstanceField2;
+  abstract external covariant num externalCovariantInstanceField2;
   external abstract late int ;
   externalLateInstanceField;
 }
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
@@ -34,55 +34,34 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract int externalInstanceField;
+//   external abstract int externalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract final int externalFinalInstanceField;
+//   external abstract final int externalFinalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract covariant num externalCovariantInstanceField;
+//   external abstract covariant num externalCovariantInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external int externalInstanceField;
+//   abstract external int externalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-//   abstract external int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-//   external abstract int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external final int externalFinalInstanceField;
+//   abstract external final int externalFinalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-//   abstract external final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-//   external abstract final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external covariant num externalCovariantInstanceField;
+//   abstract external covariant num externalCovariantInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-//   abstract external covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-//   external abstract covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
 //   external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //                       ^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //                             ^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
   abstract set initializedField1(core::int #externalFieldValue) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #externalFieldValue) → void;
-  external get externalInstanceField() → core::int;
-  external set externalInstanceField(core::int #externalFieldValue) → void;
-  external get externalFinalInstanceField() → core::int;
-  external get externalCovariantInstanceField() → core::num;
-  external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField1() → core::int;
+  external set externalInstanceField1(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField1() → core::int;
+  external get externalCovariantInstanceField1() → core::num;
+  external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField2() → core::int;
+  external set externalInstanceField2(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField2() → core::int;
+  external get externalCovariantInstanceField2() → core::num;
+  external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #externalFieldValue) → void;
 }
@@ -252,8 +236,8 @@
 static field core::int topLevelField;
 static final field core::int finalTopLevelField = 0;
 static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
 static abstract get Extension|extensionInstanceField() → core::int;
 static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
 static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
@@ -34,55 +34,34 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract int externalInstanceField;
+//   external abstract int externalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract final int externalFinalInstanceField;
+//   external abstract final int externalFinalInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   external abstract covariant num externalCovariantInstanceField;
+//   external abstract covariant num externalCovariantInstanceField1;
 //            ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external int externalInstanceField;
+//   abstract external int externalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-//   abstract external int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-//   external abstract int externalInstanceField;
-//                         ^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external final int externalFinalInstanceField;
+//   abstract external final int externalFinalInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-//   abstract external final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-//   external abstract final int externalFinalInstanceField;
-//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
-//   abstract external covariant num externalCovariantInstanceField;
+//   abstract external covariant num externalCovariantInstanceField2;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-//   abstract external covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-//   external abstract covariant num externalCovariantInstanceField;
-//                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
 // Try removing the 'abstract' or 'external' keyword.
 //   external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //                       ^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static int extensionStaticField;
+//   abstract static int extensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
 // Try removing the 'abstract' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //                             ^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
 // Try removing the 'abstract' or 'static' keyword.
-//   abstract static final int finalExtensionStaticField;
+//   abstract static final int finalExtensionStaticField = 0;
 //   ^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
   abstract set initializedField1(core::int #externalFieldValue) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #externalFieldValue) → void;
-  external get externalInstanceField() → core::int;
-  external set externalInstanceField(core::int #externalFieldValue) → void;
-  external get externalFinalInstanceField() → core::int;
-  external get externalCovariantInstanceField() → core::num;
-  external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField1() → core::int;
+  external set externalInstanceField1(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField1() → core::int;
+  external get externalCovariantInstanceField1() → core::num;
+  external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+  external get externalInstanceField2() → core::int;
+  external set externalInstanceField2(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField2() → core::int;
+  external get externalCovariantInstanceField2() → core::num;
+  external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #externalFieldValue) → void;
 }
@@ -252,8 +236,8 @@
 static field core::int topLevelField;
 static final field core::int finalTopLevelField = 0;
 static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
 static abstract get Extension|extensionInstanceField() → core::int;
 static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
 static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart b/pkg/front_end/testcases/nnbd/issue43211.dart
new file mode 100644
index 0000000..f04a817
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart
@@ -0,0 +1,54 @@
+// 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.
+
+class A<X extends A<X>?> {}
+
+class D<X extends num> {}
+
+extension Extension1<X extends A<X>?> on A<X> {
+  void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+    A<Y>? c;
+    A<A<Null>>? d;
+  }
+
+  void method2<Y extends String>(D<Y> a, D<String>? b) {
+    D<Y>? c;
+    D<String>? d;
+  }
+}
+
+extension ext2<X extends A<Null>?> on A<X> {}
+
+class B<X extends A<Null>?> implements A<X> {
+  void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+    A<Y>? c;
+    A<A<Null>>? d;
+  }
+
+  void method2<Y extends String>(D<Y> a, D<String>? b) {
+    D<Y>? c;
+    D<String>? d;
+  }
+}
+
+class C {
+  factory C.redirect(A<A<Null>>? a) = C.internal;
+
+  factory C.fact(A<A<Null>>? a) {
+    A<A<Null>>? b;
+    D<String>? c;
+    return new C.internal(a);
+  }
+
+  C.internal(_) {
+    A<A<Null>>? a;
+    D<String>? b;
+  }
+}
+
+test() {
+  var a = new A<Null>();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
new file mode 100644
index 0000000..f9ad8e5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
@@ -0,0 +1,151 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+//       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                         ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                                        ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.redirect(A<A<Null>>? a) = C.internal;
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.fact(A<A<Null>>? a) {
+//                              ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    ;
+  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+    ;
+  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void
+    ;
+}
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+  constructor internal(dynamic _) → self::C
+    ;
+  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+    let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+  static factory fact(self::A<self::A<core::Null?>>? a) → self::C
+    ;
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+  ;
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void
+  ;
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
new file mode 100644
index 0000000..127779c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+//       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                         ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                                        ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.redirect(A<A<Null>>? a) = C.internal;
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.fact(A<A<Null>>? a) {
+//                              ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? b;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? c;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? a;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? b;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    : super core::Object::•()
+    ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+    self::A<self::B::method1::Y%>? c;
+    self::A<self::A<core::Null?>>? d;
+  }
+  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+    self::D<self::B::method2::Y>? c;
+    self::D<core::String>? d;
+  }
+}
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+  constructor internal(dynamic _) → self::C
+    : super core::Object::•() {
+    self::A<self::A<core::Null?>>? a;
+    self::D<core::String>? b;
+  }
+  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+    let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+    self::A<self::A<core::Null?>>? b;
+    self::D<core::String>? c;
+    return new self::C::internal(a);
+  }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  self::A<self::Extension1|method1::Y%>? c;
+  self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+  self::D<self::Extension1|method2::Y>? c;
+  self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+  self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
new file mode 100644
index 0000000..10f7711
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+//       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                         ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                                        ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.redirect(A<A<Null>>? a) = C.internal;
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.fact(A<A<Null>>? a) {
+//                              ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? b;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? c;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? a;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? b;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    : super core::Object::•()
+    ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+    self::A<self::B::method1::Y%>? c;
+    self::A<self::A<core::Null?>>? d;
+  }
+  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+    self::D<self::B::method2::Y>? c;
+    self::D<core::String>? d;
+  }
+}
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+  constructor internal(dynamic _) → self::C
+    : super core::Object::•() {
+    self::A<self::A<core::Null?>>? a;
+    self::D<core::String>? b;
+  }
+  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+    let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
+  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+    self::A<self::A<core::Null?>>? b;
+    self::D<core::String>? c;
+    return new self::C::internal(a);
+  }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  self::A<self::Extension1|method1::Y%>? c;
+  self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+  self::D<self::Extension1|method2::Y>? c;
+  self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+  self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.textual_outline.expect
new file mode 100644
index 0000000..f38556f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+class A<X extends A<X>?> {}
+class D<X extends num> {}
+extension Extension1<X extends A<X>?> (){}
+on A<X> (){}
+extension ext2<X extends A<Null>?> (){}
+on A<X> (){}
+class B<X extends A<Null>?> implements A<X> {
+  void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {}
+  void method2<Y extends String>(D<Y> a, D<String>? b) {}
+}
+class C {
+  factory C.redirect(A<A<Null>>? a) = C.internal;
+  factory C.fact(A<A<Null>>? a) {}
+  C.internal(_) {}
+}
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
new file mode 100644
index 0000000..127779c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+//       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                         ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                                        ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.redirect(A<A<Null>>? a) = C.internal;
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.fact(A<A<Null>>? a) {
+//                              ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? b;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? c;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? a;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? b;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    : super core::Object::•()
+    ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+    self::A<self::B::method1::Y%>? c;
+    self::A<self::A<core::Null?>>? d;
+  }
+  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+    self::D<self::B::method2::Y>? c;
+    self::D<core::String>? d;
+  }
+}
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+  constructor internal(dynamic _) → self::C
+    : super core::Object::•() {
+    self::A<self::A<core::Null?>>? a;
+    self::D<core::String>? b;
+  }
+  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+    let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+    self::A<self::A<core::Null?>>? b;
+    self::D<core::String>? c;
+    return new self::C::internal(a);
+  }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  self::A<self::Extension1|method1::Y%>? c;
+  self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+  self::D<self::Extension1|method2::Y>? c;
+  self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+  self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
new file mode 100644
index 0000000..10f7711
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+//       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                         ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                                        ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.redirect(A<A<Null>>? a) = C.internal;
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.fact(A<A<Null>>? a) {
+//                              ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? b;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? c;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? a;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? b;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    : super core::Object::•()
+    ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+    self::A<self::B::method1::Y%>? c;
+    self::A<self::A<core::Null?>>? d;
+  }
+  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+    self::D<self::B::method2::Y>? c;
+    self::D<core::String>? d;
+  }
+}
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+  constructor internal(dynamic _) → self::C
+    : super core::Object::•() {
+    self::A<self::A<core::Null?>>? a;
+    self::D<core::String>? b;
+  }
+  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+    let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
+  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+    self::A<self::A<core::Null?>>? b;
+    self::D<core::String>? c;
+    return new self::C::internal(a);
+  }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  self::A<self::Extension1|method1::Y%>? c;
+  self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+  self::D<self::Extension1|method2::Y>? c;
+  self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+  self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
index 057a76f..296454f 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
@@ -14,6 +14,10 @@
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfE; // Error.
+//              ^^^^^^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
@@ -14,6 +14,10 @@
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfE; // Error.
+//              ^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
 //   A.foo();
 //   ^
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
@@ -14,6 +14,10 @@
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfE; // Error.
+//              ^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
 //   A.foo();
 //   ^
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
@@ -14,6 +14,10 @@
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfE; // Error.
+//              ^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
 //   A.foo();
 //   ^
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
@@ -14,6 +14,10 @@
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfE; // Error.
+//              ^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
 //   A.foo();
 //   ^
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart b/pkg/front_end/testcases/nnbd/override_inference.dart
new file mode 100644
index 0000000..c62bd15
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+abstract class A<AT> {
+  String method1a(Object x);
+  Object method1b(String x);
+  void method1c(int x);
+  String method1d();
+  void method2a(Object? x);
+  void method2b(dynamic x);
+  void method3a<AT3a>(AT3a x);
+  void method3b<AT3b>(AT3b x);
+  void method4a<AT4a>(AT4a x, AT y);
+  void method4b<AT4b>(AT4b x, AT y);
+  void method5a(int x, num y);
+  void method5b(int x, num y);
+  void method6a({int x, num y});
+  void method6b({num y, int x});
+  Object? method7a(Object? o, {Object? named}) {}
+
+  Object get getter1a;
+  String get getter1b;
+  String get getter1c;
+  set getter1d(String x);
+  int get getter1e;
+  set getter1e(int x);
+
+  void set setter1a(Object x);
+  void set setter1b(String x);
+  void set setter1c(String x);
+  String get setter1d;
+  int get setter1e;
+  set setter1e(int x);
+
+  int? get field1a;
+  num? get field1b;
+  int? get field1c;
+
+  void set field2a(int? value);
+  void set field2b(num? value);
+  void set field2c(int? value);
+
+  int? get field3a;
+  num? get field3b;
+  int? get field3c;
+
+  void set field3a(Object? value);
+  void set field3b(Object? value);
+  void set field3c(Object? value);
+
+  num? get field4a;
+  num? get field4b;
+  void set field4b(Object? value);
+}
+
+abstract class B<BT> {
+  Object method1a(String x);
+  String method1b(Object x);
+  void method1c(String x);
+  int method1d();
+  void method2a(dynamic x);
+  void method2b(Object? x);
+  void method3a<BT3a>(BT3a x);
+  void method3b<BT3b>(BT3b x);
+  void method4a<BT4a>(BT4a x, BT y);
+  void method4b<BT4b>(BT4b x, BT y);
+  void method5a(num x, int y);
+  void method5b(num x, int y);
+  void method6a({Object x, num y});
+  void method6b({int x, Object y});
+  FutureOr method7a(FutureOr o, {FutureOr named});
+
+  String get getter1a;
+  Object get getter1b;
+  int get getter1c;
+  set getter1d(Object x);
+  num get getter1e;
+  set getter1e(Object x);
+
+  void set setter1a(String x);
+  void set setter1b(Object x);
+  void set setter1c(int x);
+  Object get setter1d;
+  num get setter1e;
+  set setter1e(Object x);
+
+  num? get field1a;
+  int? get field1b;
+  double? get field1c;
+
+  void set field2a(num? value);
+  void set field2b(int? value);
+  void set field2c(double? value);
+
+  num? get field3a;
+  int? get field3b;
+  double? get field3c;
+
+  void set field3a(Object? value);
+  void set field3b(Object? value);
+  void set field3c(Object? value);
+
+  void set field4a(num? value);
+  num? get field4b;
+  void set field4b(Object? value);
+}
+
+abstract class C implements A<int>, B<num> {
+  method1a(x);
+  method1b(x);
+  void method1c(x); // error
+  method1d(); // error
+  void method2a(x);
+  void method2b(x);
+  void method3a<CT3a>(x);
+  void method3b<CT3b>(x, [y]);
+  void method4a<CT4a>(x, y);
+  void method4b<CT4b>(x, y, [z]);
+  void method5a(x, y); // error
+  void method5b(num x, num y, [z]); // error
+  void method6a({x, y});
+  void method6b({x, y, z});
+  method7a(o, {named});
+
+  get getter1a;
+  get getter1b;
+  get getter1c; // error
+  get getter1d;
+  get getter1e;
+
+  void set setter1a(x);
+  void set setter1b(x);
+  void set setter1c(x); // error
+  void set setter1d(x);
+  void set setter1e(x);
+
+  final field1a = null;
+  final field1b = null;
+  final field1c = null; // error
+
+  final field2a = null;
+  final field2b = null;
+  final field2c = null; // error
+
+  final field3a = null;
+  final field3b = null;
+  final field3c = null; // error
+
+  var field4a = null;
+  var field4b = null; // error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
new file mode 100644
index 0000000..5e9a2cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
@@ -0,0 +1,291 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method1c(x); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+//   void method1c(int x);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+//   void method1c(String x);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   method1d(); // error
+//   ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+//   String method1d();
+//          ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+//   int method1d();
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                    ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5b(num x, num y, [z]); // error
+//                                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+//   void method5b(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+//   void method5b(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get getter1c; // error
+//       ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+//   String get getter1c;
+//              ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+//   int get getter1c;
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field1c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+//   int? get field1c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+//   double? get field1c;
+//               ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field2c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field3c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+//   int? get field3c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+//   double? get field3c;
+//               ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4b = null; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void set setter1c(x); // error
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+//   void set setter1c(String x);
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+//   void set setter1c(int x);
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+//                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::AT%>
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::String x) → core::Object;
+  abstract method method1c(core::int x) → void;
+  abstract method method1d() → core::String;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(dynamic x) → void;
+  abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+  abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+  abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method5a(core::int x, core::num y) → void;
+  abstract method method5b(core::int x, core::num y) → void;
+  abstract method method6a({core::int x, core::num y}) → void;
+  abstract method method6b({core::num y, core::int x}) → void;
+  method method7a(core::Object? o, {core::Object? named}) → core::Object?
+    ;
+  abstract get getter1a() → core::Object;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → core::String;
+  abstract set getter1d(core::String x) → void;
+  abstract get getter1e() → core::int;
+  abstract set getter1e(core::int x) → void;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::String x) → void;
+  abstract set setter1c(core::String x) → void;
+  abstract get setter1d() → core::String;
+  abstract get setter1e() → core::int;
+  abstract set setter1e(core::int x) → void;
+  abstract get field1a() → core::int?;
+  abstract get field1b() → core::num?;
+  abstract get field1c() → core::int?;
+  abstract set field2a(core::int? value) → void;
+  abstract set field2b(core::num? value) → void;
+  abstract set field2c(core::int? value) → void;
+  abstract get field3a() → core::int?;
+  abstract get field3b() → core::num?;
+  abstract get field3c() → core::int?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract get field4a() → core::num?;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::BT%>
+    ;
+  abstract method method1a(core::String x) → core::Object;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(core::String x) → void;
+  abstract method method1d() → core::int;
+  abstract method method2a(dynamic x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+  abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+  abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method5a(core::num x, core::int y) → void;
+  abstract method method5b(core::num x, core::int y) → void;
+  abstract method method6a({core::Object x, core::num y}) → void;
+  abstract method method6b({core::int x, core::Object y}) → void;
+  abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named}) → FutureOr<dynamic>;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::Object;
+  abstract get getter1c() → core::int;
+  abstract set getter1d(core::Object x) → void;
+  abstract get getter1e() → core::num;
+  abstract set getter1e(core::Object x) → void;
+  abstract set setter1a(core::String x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(core::int x) → void;
+  abstract get setter1d() → core::Object;
+  abstract get setter1e() → core::num;
+  abstract set setter1e(core::Object x) → void;
+  abstract get field1a() → core::num?;
+  abstract get field1b() → core::int?;
+  abstract get field1c() → core::double?;
+  abstract set field2a(core::num? value) → void;
+  abstract set field2b(core::int? value) → void;
+  abstract set field2c(core::double? value) → void;
+  abstract get field3a() → core::num?;
+  abstract get field3b() → core::int?;
+  abstract get field3c() → core::double?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract set field4a(core::num? value) → void;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+  final field core::int? field1a;
+  final field core::int? field1b;
+  final field invalid-type field1c;
+  final field core::num? field2a;
+  final field core::num? field2b;
+  final field invalid-type field2c;
+  final field core::int? field3a;
+  final field core::int? field3b;
+  final field invalid-type field3c;
+  field core::num? field4a;
+  field invalid-type field4b;
+  synthetic constructor •() → self::C
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(invalid-type x) → void;
+  abstract method method1d() → invalid-type;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+  abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y]) → void;
+  abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+  abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z]) → void;
+  abstract method method5a(invalid-type x, invalid-type y) → void;
+  abstract method method5b(core::num x, core::num y, [invalid-type z]) → void;
+  abstract method method6a({core::Object x, core::num y}) → void;
+  abstract method method6b({core::int x, core::Object y, dynamic z}) → void;
+  abstract method method7a(core::Object? o, {core::Object? named}) → core::Object?;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → invalid-type;
+  abstract get getter1d() → core::Object;
+  abstract get getter1e() → core::int;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(invalid-type x) → void;
+  abstract set setter1d(core::String x) → void;
+  abstract set setter1e(core::Object x) → void;
+  abstract forwarding-stub set getter1d(core::Object x) → void;
+  abstract forwarding-stub set getter1e(core::Object x) → void;
+  abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method1c(x); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+//   void method1c(int x);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+//   void method1c(String x);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   method1d(); // error
+//   ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+//   String method1d();
+//          ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+//   int method1d();
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                    ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5b(num x, num y, [z]); // error
+//                                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+//   void method5b(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+//   void method5b(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get getter1c; // error
+//       ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+//   String get getter1c;
+//              ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+//   int get getter1c;
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field1c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+//   int? get field1c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+//   double? get field1c;
+//               ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field2c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field3c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+//   int? get field3c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+//   double? get field3c;
+//               ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4b = null; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void set setter1c(x); // error
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+//   void set setter1c(String x);
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+//   void set setter1c(int x);
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+//                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::AT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::String x) → core::Object;
+  abstract method method1c(core::int x) → void;
+  abstract method method1d() → core::String;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(dynamic x) → void;
+  abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+  abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+  abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method5a(core::int x, core::num y) → void;
+  abstract method method5b(core::int x, core::num y) → void;
+  abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+  method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+  abstract get getter1a() → core::Object;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → core::String;
+  abstract set getter1d(core::String x) → void;
+  abstract get getter1e() → core::int;
+  abstract set getter1e(core::int x) → void;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::String x) → void;
+  abstract set setter1c(core::String x) → void;
+  abstract get setter1d() → core::String;
+  abstract get setter1e() → core::int;
+  abstract set setter1e(core::int x) → void;
+  abstract get field1a() → core::int?;
+  abstract get field1b() → core::num?;
+  abstract get field1c() → core::int?;
+  abstract set field2a(core::int? value) → void;
+  abstract set field2b(core::num? value) → void;
+  abstract set field2c(core::int? value) → void;
+  abstract get field3a() → core::int?;
+  abstract get field3b() → core::num?;
+  abstract get field3c() → core::int?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract get field4a() → core::num?;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::BT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::String x) → core::Object;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(core::String x) → void;
+  abstract method method1d() → core::int;
+  abstract method method2a(dynamic x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+  abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+  abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method5a(core::num x, core::int y) → void;
+  abstract method method5b(core::num x, core::int y) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+  abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::Object;
+  abstract get getter1c() → core::int;
+  abstract set getter1d(core::Object x) → void;
+  abstract get getter1e() → core::num;
+  abstract set getter1e(core::Object x) → void;
+  abstract set setter1a(core::String x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(core::int x) → void;
+  abstract get setter1d() → core::Object;
+  abstract get setter1e() → core::num;
+  abstract set setter1e(core::Object x) → void;
+  abstract get field1a() → core::num?;
+  abstract get field1b() → core::int?;
+  abstract get field1c() → core::double?;
+  abstract set field2a(core::num? value) → void;
+  abstract set field2b(core::int? value) → void;
+  abstract set field2c(core::double? value) → void;
+  abstract get field3a() → core::num?;
+  abstract get field3b() → core::int?;
+  abstract get field3c() → core::double?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract set field4a(core::num? value) → void;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+  final field core::int? field1a = null;
+  final field core::int? field1b = null;
+  final field invalid-type field1c = null;
+  final field core::num? field2a = null;
+  final field core::num? field2b = null;
+  final field invalid-type field2c = null;
+  final field core::int? field3a = null;
+  final field core::int? field3b = null;
+  final field invalid-type field3c = null;
+  field core::num? field4a = null;
+  field invalid-type field4b = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(invalid-type x) → void;
+  abstract method method1d() → invalid-type;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+  abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+  abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+  abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+  abstract method method5a(invalid-type x, invalid-type y) → void;
+  abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+  abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → invalid-type;
+  abstract get getter1d() → core::Object;
+  abstract get getter1e() → core::int;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(invalid-type x) → void;
+  abstract set setter1d(core::String x) → void;
+  abstract set setter1e(core::Object x) → void;
+  abstract forwarding-stub set getter1d(core::Object x) → void;
+  abstract forwarding-stub set getter1e(core::Object x) → void;
+  abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method1c(x); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+//   void method1c(int x);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+//   void method1c(String x);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   method1d(); // error
+//   ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+//   String method1d();
+//          ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+//   int method1d();
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                    ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5b(num x, num y, [z]); // error
+//                                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+//   void method5b(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+//   void method5b(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get getter1c; // error
+//       ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+//   String get getter1c;
+//              ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+//   int get getter1c;
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field1c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+//   int? get field1c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+//   double? get field1c;
+//               ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field2c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field3c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+//   int? get field3c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+//   double? get field3c;
+//               ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4b = null; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void set setter1c(x); // error
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+//   void set setter1c(String x);
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+//   void set setter1c(int x);
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+//                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::AT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::String x) → core::Object;
+  abstract method method1c(core::int x) → void;
+  abstract method method1d() → core::String;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(dynamic x) → void;
+  abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+  abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+  abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method5a(core::int x, core::num y) → void;
+  abstract method method5b(core::int x, core::num y) → void;
+  abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+  method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+  abstract get getter1a() → core::Object;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → core::String;
+  abstract set getter1d(core::String x) → void;
+  abstract get getter1e() → core::int;
+  abstract set getter1e(core::int x) → void;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::String x) → void;
+  abstract set setter1c(core::String x) → void;
+  abstract get setter1d() → core::String;
+  abstract get setter1e() → core::int;
+  abstract set setter1e(core::int x) → void;
+  abstract get field1a() → core::int?;
+  abstract get field1b() → core::num?;
+  abstract get field1c() → core::int?;
+  abstract set field2a(core::int? value) → void;
+  abstract set field2b(core::num? value) → void;
+  abstract set field2c(core::int? value) → void;
+  abstract get field3a() → core::int?;
+  abstract get field3b() → core::num?;
+  abstract get field3c() → core::int?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract get field4a() → core::num?;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::BT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::String x) → core::Object;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(core::String x) → void;
+  abstract method method1d() → core::int;
+  abstract method method2a(dynamic x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+  abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+  abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method5a(core::num x, core::int y) → void;
+  abstract method method5b(core::num x, core::int y) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+  abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::Object;
+  abstract get getter1c() → core::int;
+  abstract set getter1d(core::Object x) → void;
+  abstract get getter1e() → core::num;
+  abstract set getter1e(core::Object x) → void;
+  abstract set setter1a(core::String x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(core::int x) → void;
+  abstract get setter1d() → core::Object;
+  abstract get setter1e() → core::num;
+  abstract set setter1e(core::Object x) → void;
+  abstract get field1a() → core::num?;
+  abstract get field1b() → core::int?;
+  abstract get field1c() → core::double?;
+  abstract set field2a(core::num? value) → void;
+  abstract set field2b(core::int? value) → void;
+  abstract set field2c(core::double? value) → void;
+  abstract get field3a() → core::num?;
+  abstract get field3b() → core::int?;
+  abstract get field3c() → core::double?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract set field4a(core::num? value) → void;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+  final field core::int? field1a = null;
+  final field core::int? field1b = null;
+  final field invalid-type field1c = null;
+  final field core::num? field2a = null;
+  final field core::num? field2b = null;
+  final field invalid-type field2c = null;
+  final field core::int? field3a = null;
+  final field core::int? field3b = null;
+  final field invalid-type field3c = null;
+  field core::num? field4a = null;
+  field invalid-type field4b = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(invalid-type x) → void;
+  abstract method method1d() → invalid-type;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+  abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+  abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+  abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+  abstract method method5a(invalid-type x, invalid-type y) → void;
+  abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+  abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → invalid-type;
+  abstract get getter1d() → core::Object;
+  abstract get getter1e() → core::int;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(invalid-type x) → void;
+  abstract set setter1d(core::String x) → void;
+  abstract set setter1e(core::Object x) → void;
+  abstract forwarding-stub set getter1d(core::Object x) → void;
+  abstract forwarding-stub set getter1e(core::Object x) → void;
+  abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline.expect
new file mode 100644
index 0000000..2a10caa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline.expect
@@ -0,0 +1,132 @@
+import 'dart:async';
+
+abstract class A<AT> {
+  String method1a(Object x);
+  Object method1b(String x);
+  void method1c(int x);
+  String method1d();
+  void method2a(Object? x);
+  void method2b(dynamic x);
+  void method3a<AT3a>(AT3a x);
+  void method3b<AT3b>(AT3b x);
+  void method4a<AT4a>(AT4a x, AT y);
+  void method4b<AT4b>(AT4b x, AT y);
+  void method5a(int x, num y);
+  void method5b(int x, num y);
+  void method6a({int x, num y});
+  void method6b({num y, int x});
+  Object? method7a(Object? o, {Object? named}) {}
+  Object get getter1a;
+  String get getter1b;
+  String get getter1c;
+  set getter1d(String x);
+  int get getter1e;
+  set getter1e(int x);
+  void set setter1a(Object x);
+  void set setter1b(String x);
+  void set setter1c(String x);
+  String get setter1d;
+  int get setter1e;
+  set setter1e(int x);
+  int? get field1a;
+  num? get field1b;
+  int? get field1c;
+  void set field2a(int? value);
+  void set field2b(num? value);
+  void set field2c(int? value);
+  int? get field3a;
+  num? get field3b;
+  int? get field3c;
+  void set field3a(Object? value);
+  void set field3b(Object? value);
+  void set field3c(Object? value);
+  num? get field4a;
+  num? get field4b;
+  void set field4b(Object? value);
+}
+
+abstract class B<BT> {
+  Object method1a(String x);
+  String method1b(Object x);
+  void method1c(String x);
+  int method1d();
+  void method2a(dynamic x);
+  void method2b(Object? x);
+  void method3a<BT3a>(BT3a x);
+  void method3b<BT3b>(BT3b x);
+  void method4a<BT4a>(BT4a x, BT y);
+  void method4b<BT4b>(BT4b x, BT y);
+  void method5a(num x, int y);
+  void method5b(num x, int y);
+  void method6a({Object x, num y});
+  void method6b({int x, Object y});
+  FutureOr method7a(FutureOr o, {FutureOr named});
+  String get getter1a;
+  Object get getter1b;
+  int get getter1c;
+  set getter1d(Object x);
+  num get getter1e;
+  set getter1e(Object x);
+  void set setter1a(String x);
+  void set setter1b(Object x);
+  void set setter1c(int x);
+  Object get setter1d;
+  num get setter1e;
+  set setter1e(Object x);
+  num? get field1a;
+  int? get field1b;
+  double? get field1c;
+  void set field2a(num? value);
+  void set field2b(int? value);
+  void set field2c(double? value);
+  num? get field3a;
+  int? get field3b;
+  double? get field3c;
+  void set field3a(Object? value);
+  void set field3b(Object? value);
+  void set field3c(Object? value);
+  void set field4a(num? value);
+  num? get field4b;
+  void set field4b(Object? value);
+}
+
+abstract class C implements A<int>, B<num> {
+  method1a(x);
+  method1b(x);
+  void method1c(x);
+  method1d();
+  void method2a(x);
+  void method2b(x);
+  void method3a<CT3a>(x);
+  void method3b<CT3b>(x, [y]);
+  void method4a<CT4a>(x, y);
+  void method4b<CT4b>(x, y, [z]);
+  void method5a(x, y);
+  void method5b(num x, num y, [z]);
+  void method6a({x, y});
+  void method6b({x, y, z});
+  method7a(o, {named});
+  get getter1a;
+  get getter1b;
+  get getter1c;
+  get getter1d;
+  get getter1e;
+  void set setter1a(x);
+  void set setter1b(x);
+  void set setter1c(x);
+  void set setter1d(x);
+  void set setter1e(x);
+  final field1a = null;
+  final field1b = null;
+  final field1c = null;
+  final field2a = null;
+  final field2b = null;
+  final field2c = null;
+  final field3a = null;
+  final field3b = null;
+  final field3c = null;
+  var field4a = null;
+  var field4b = null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ef0f7cf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline_modelled.expect
@@ -0,0 +1,132 @@
+import 'dart:async';
+
+abstract class A<AT> {
+  Object? method7a(Object? o, {Object? named}) {}
+  Object get getter1a;
+  Object method1b(String x);
+  String get getter1b;
+  String get getter1c;
+  String get setter1d;
+  String method1a(Object x);
+  String method1d();
+  int? get field1a;
+  int? get field1c;
+  int? get field3a;
+  int? get field3c;
+  int get getter1e;
+  int get setter1e;
+  num? get field1b;
+  num? get field3b;
+  num? get field4a;
+  num? get field4b;
+  set getter1d(String x);
+  set getter1e(int x);
+  set setter1e(int x);
+  void method1c(int x);
+  void method2a(Object? x);
+  void method2b(dynamic x);
+  void method3a<AT3a>(AT3a x);
+  void method3b<AT3b>(AT3b x);
+  void method4a<AT4a>(AT4a x, AT y);
+  void method4b<AT4b>(AT4b x, AT y);
+  void method5a(int x, num y);
+  void method5b(int x, num y);
+  void method6a({int x, num y});
+  void method6b({num y, int x});
+  void set field2a(int? value);
+  void set field2b(num? value);
+  void set field2c(int? value);
+  void set field3a(Object? value);
+  void set field3b(Object? value);
+  void set field3c(Object? value);
+  void set field4b(Object? value);
+  void set setter1a(Object x);
+  void set setter1b(String x);
+  void set setter1c(String x);
+}
+
+abstract class B<BT> {
+  FutureOr method7a(FutureOr o, {FutureOr named});
+  Object get getter1b;
+  Object get setter1d;
+  Object method1a(String x);
+  String get getter1a;
+  String method1b(Object x);
+  double? get field1c;
+  double? get field3c;
+  int? get field1b;
+  int? get field3b;
+  int get getter1c;
+  int method1d();
+  num? get field1a;
+  num? get field3a;
+  num? get field4b;
+  num get getter1e;
+  num get setter1e;
+  set getter1d(Object x);
+  set getter1e(Object x);
+  set setter1e(Object x);
+  void method1c(String x);
+  void method2a(dynamic x);
+  void method2b(Object? x);
+  void method3a<BT3a>(BT3a x);
+  void method3b<BT3b>(BT3b x);
+  void method4a<BT4a>(BT4a x, BT y);
+  void method4b<BT4b>(BT4b x, BT y);
+  void method5a(num x, int y);
+  void method5b(num x, int y);
+  void method6a({Object x, num y});
+  void method6b({int x, Object y});
+  void set field2a(num? value);
+  void set field2b(int? value);
+  void set field2c(double? value);
+  void set field3a(Object? value);
+  void set field3b(Object? value);
+  void set field3c(Object? value);
+  void set field4a(num? value);
+  void set field4b(Object? value);
+  void set setter1a(String x);
+  void set setter1b(Object x);
+  void set setter1c(int x);
+}
+
+abstract class C implements A<int>, B<num> {
+  final field1a = null;
+  final field1b = null;
+  final field1c = null;
+  final field2a = null;
+  final field2b = null;
+  final field2c = null;
+  final field3a = null;
+  final field3b = null;
+  final field3c = null;
+  get getter1a;
+  get getter1b;
+  get getter1c;
+  get getter1d;
+  get getter1e;
+  method1a(x);
+  method1b(x);
+  method1d();
+  method7a(o, {named});
+  var field4a = null;
+  var field4b = null;
+  void method1c(x);
+  void method2a(x);
+  void method2b(x);
+  void method3a<CT3a>(x);
+  void method3b<CT3b>(x, [y]);
+  void method4a<CT4a>(x, y);
+  void method4b<CT4b>(x, y, [z]);
+  void method5a(x, y);
+  void method5b(num x, num y, [z]);
+  void method6a({x, y});
+  void method6b({x, y, z});
+  void set setter1a(x);
+  void set setter1b(x);
+  void set setter1c(x);
+  void set setter1d(x);
+  void set setter1e(x);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method1c(x); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+//   void method1c(int x);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+//   void method1c(String x);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   method1d(); // error
+//   ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+//   String method1d();
+//          ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+//   int method1d();
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                    ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5b(num x, num y, [z]); // error
+//                                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+//   void method5b(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+//   void method5b(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get getter1c; // error
+//       ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+//   String get getter1c;
+//              ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+//   int get getter1c;
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field1c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+//   int? get field1c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+//   double? get field1c;
+//               ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field2c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field3c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+//   int? get field3c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+//   double? get field3c;
+//               ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4b = null; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void set setter1c(x); // error
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+//   void set setter1c(String x);
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+//   void set setter1c(int x);
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+//                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::AT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::String x) → core::Object;
+  abstract method method1c(core::int x) → void;
+  abstract method method1d() → core::String;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(dynamic x) → void;
+  abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+  abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+  abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method5a(core::int x, core::num y) → void;
+  abstract method method5b(core::int x, core::num y) → void;
+  abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+  method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+  abstract get getter1a() → core::Object;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → core::String;
+  abstract set getter1d(core::String x) → void;
+  abstract get getter1e() → core::int;
+  abstract set getter1e(core::int x) → void;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::String x) → void;
+  abstract set setter1c(core::String x) → void;
+  abstract get setter1d() → core::String;
+  abstract get setter1e() → core::int;
+  abstract set setter1e(core::int x) → void;
+  abstract get field1a() → core::int?;
+  abstract get field1b() → core::num?;
+  abstract get field1c() → core::int?;
+  abstract set field2a(core::int? value) → void;
+  abstract set field2b(core::num? value) → void;
+  abstract set field2c(core::int? value) → void;
+  abstract get field3a() → core::int?;
+  abstract get field3b() → core::num?;
+  abstract get field3c() → core::int?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract get field4a() → core::num?;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::BT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::String x) → core::Object;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(core::String x) → void;
+  abstract method method1d() → core::int;
+  abstract method method2a(dynamic x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+  abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+  abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method5a(core::num x, core::int y) → void;
+  abstract method method5b(core::num x, core::int y) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+  abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::Object;
+  abstract get getter1c() → core::int;
+  abstract set getter1d(core::Object x) → void;
+  abstract get getter1e() → core::num;
+  abstract set getter1e(core::Object x) → void;
+  abstract set setter1a(core::String x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(core::int x) → void;
+  abstract get setter1d() → core::Object;
+  abstract get setter1e() → core::num;
+  abstract set setter1e(core::Object x) → void;
+  abstract get field1a() → core::num?;
+  abstract get field1b() → core::int?;
+  abstract get field1c() → core::double?;
+  abstract set field2a(core::num? value) → void;
+  abstract set field2b(core::int? value) → void;
+  abstract set field2c(core::double? value) → void;
+  abstract get field3a() → core::num?;
+  abstract get field3b() → core::int?;
+  abstract get field3c() → core::double?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract set field4a(core::num? value) → void;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+  final field core::int? field1a = null;
+  final field core::int? field1b = null;
+  final field invalid-type field1c = null;
+  final field core::num? field2a = null;
+  final field core::num? field2b = null;
+  final field invalid-type field2c = null;
+  final field core::int? field3a = null;
+  final field core::int? field3b = null;
+  final field invalid-type field3c = null;
+  field core::num? field4a = null;
+  field invalid-type field4b = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(invalid-type x) → void;
+  abstract method method1d() → invalid-type;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+  abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+  abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+  abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+  abstract method method5a(invalid-type x, invalid-type y) → void;
+  abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+  abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → invalid-type;
+  abstract get getter1d() → core::Object;
+  abstract get getter1e() → core::int;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(invalid-type x) → void;
+  abstract set setter1d(core::String x) → void;
+  abstract set setter1e(core::Object x) → void;
+  abstract forwarding-stub set getter1d(core::Object x) → void;
+  abstract forwarding-stub set getter1e(core::Object x) → void;
+  abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method1c(x); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+//   void method1c(int x);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+//   void method1c(String x);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   method1d(); // error
+//   ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+//   String method1d();
+//          ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+//   int method1d();
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5a(x, y); // error
+//                    ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5b(num x, num y, [z]); // error
+//                                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+//   void method5b(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+//   void method5b(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get getter1c; // error
+//       ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+//   String get getter1c;
+//              ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+//   int get getter1c;
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field1c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+//   int? get field1c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+//   double? get field1c;
+//               ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field2c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field3c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+//   int? get field3c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+//   double? get field3c;
+//               ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4b = null; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void set setter1c(x); // error
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+//   void set setter1c(String x);
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+//   void set setter1c(int x);
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+//                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::AT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::String x) → core::Object;
+  abstract method method1c(core::int x) → void;
+  abstract method method1d() → core::String;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(dynamic x) → void;
+  abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+  abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+  abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+  abstract method method5a(core::int x, core::num y) → void;
+  abstract method method5b(core::int x, core::num y) → void;
+  abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+  method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+  abstract get getter1a() → core::Object;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → core::String;
+  abstract set getter1d(core::String x) → void;
+  abstract get getter1e() → core::int;
+  abstract set getter1e(core::int x) → void;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::String x) → void;
+  abstract set setter1c(core::String x) → void;
+  abstract get setter1d() → core::String;
+  abstract get setter1e() → core::int;
+  abstract set setter1e(core::int x) → void;
+  abstract get field1a() → core::int?;
+  abstract get field1b() → core::num?;
+  abstract get field1c() → core::int?;
+  abstract set field2a(core::int? value) → void;
+  abstract set field2b(core::num? value) → void;
+  abstract set field2c(core::int? value) → void;
+  abstract get field3a() → core::int?;
+  abstract get field3b() → core::num?;
+  abstract get field3c() → core::int?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract get field4a() → core::num?;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::BT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::String x) → core::Object;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(core::String x) → void;
+  abstract method method1d() → core::int;
+  abstract method method2a(dynamic x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+  abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+  abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+  abstract method method5a(core::num x, core::int y) → void;
+  abstract method method5b(core::num x, core::int y) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+  abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::Object;
+  abstract get getter1c() → core::int;
+  abstract set getter1d(core::Object x) → void;
+  abstract get getter1e() → core::num;
+  abstract set getter1e(core::Object x) → void;
+  abstract set setter1a(core::String x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(core::int x) → void;
+  abstract get setter1d() → core::Object;
+  abstract get setter1e() → core::num;
+  abstract set setter1e(core::Object x) → void;
+  abstract get field1a() → core::num?;
+  abstract get field1b() → core::int?;
+  abstract get field1c() → core::double?;
+  abstract set field2a(core::num? value) → void;
+  abstract set field2b(core::int? value) → void;
+  abstract set field2c(core::double? value) → void;
+  abstract get field3a() → core::num?;
+  abstract get field3b() → core::int?;
+  abstract get field3c() → core::double?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract set field4a(core::num? value) → void;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+  final field core::int? field1a = null;
+  final field core::int? field1b = null;
+  final field invalid-type field1c = null;
+  final field core::num? field2a = null;
+  final field core::num? field2b = null;
+  final field invalid-type field2c = null;
+  final field core::int? field3a = null;
+  final field core::int? field3b = null;
+  final field invalid-type field3c = null;
+  field core::num? field4a = null;
+  field invalid-type field4b = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(invalid-type x) → void;
+  abstract method method1d() → invalid-type;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+  abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+  abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+  abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+  abstract method method5a(invalid-type x, invalid-type y) → void;
+  abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+  abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → invalid-type;
+  abstract get getter1d() → core::Object;
+  abstract get getter1e() → core::int;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(invalid-type x) → void;
+  abstract set setter1d(core::String x) → void;
+  abstract set setter1e(core::Object x) → void;
+  abstract forwarding-stub set getter1d(core::Object x) → void;
+  abstract forwarding-stub set getter1e(core::Object x) → void;
+  abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
index 9036823..6a9e27e 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
@@ -34,10 +34,6 @@
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-//                                  ^
-//
 import self as self2;
 import "dart:_internal" as _in;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
@@ -36,10 +36,6 @@
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-//                                  ^
-//
 import self as test;
 import "dart:_internal" as _in;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
@@ -36,10 +36,6 @@
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-//                                  ^
-//
 import self as test;
 import "dart:_internal" as _in;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
@@ -36,10 +36,6 @@
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-//                                  ^
-//
 import self as test;
 import "dart:_internal" as _in;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
@@ -36,10 +36,6 @@
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-//                                  ^
-//
 import self as test;
 import "dart:_internal" as _in;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
index 48c54ae..c941a64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
@@ -12,7 +12,7 @@
   iss::takesNever(null);
   iss::takesNever(nil);
   iss::takesTakesNull(#C1);
-  iss::f = (Never* x) → core::Null? {};
+  iss::f = (core::Null? x) → core::Null? {};
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
index 48c54ae..c941a64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
   iss::takesNever(null);
   iss::takesNever(nil);
   iss::takesTakesNull(#C1);
-  iss::f = (Never* x) → core::Null? {};
+  iss::f = (core::Null? x) → core::Null? {};
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart
index 1d9981b..4f30ec5 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart
@@ -9,7 +9,17 @@
 Never optOutNever;
 var inferredOptOutNever = optInNever;
 
+genericMethod<T>() {}
+
+class GenericClass<T> {}
+
 main() {
+  optInNever = optOutNever;
+
+  Type typeNever = Never;
+  genericMethod<Never>();
+  new GenericClass<Never>();
+
   Never localNever = null;
   Null localNull = null;
   var inferredLocalNever = optInNever;
@@ -62,6 +72,15 @@
   throws(() => optInNever = throwing());
   throws(() => inferredOptOutNever = throwing());
   throws(() => inferredLocalNever = throwing());
+
+  var boundedGenericClass = new BoundedGenericClass();
+  throws(() {
+    var boundedGenericMethodResult1 = boundedGenericMethod1();
+  });
+  var boundedGenericMethodResult2 = boundedGenericMethod2();
+
+  dynamic dyn = null;
+  optInNever = dyn;
 }
 
 class B extends A {
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect
index 0630e92..fc4c4c0 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect
@@ -3,6 +3,10 @@
 
 Never optOutNever;
 var inferredOptOutNever = optInNever;
+genericMethod<T>() {}
+
+class GenericClass<T> {}
+
 main() {}
 
 class B extends A {
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect
index 26f5017..c9f7109 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect
@@ -25,6 +25,9 @@
   void set nullProperty(Never value) {}
 }
 
+class GenericClass<T> {}
+
+genericMethod<T>() {}
 main() {}
 throws(void Function() f) {}
 var inferredOptOutNever = optInNever;
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
index 1977f90..4852b17 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
@@ -1,10 +1,25 @@
 library;
 import self as self;
-import "never_opt_out_lib.dart" as nev;
 import "dart:core" as core;
+import "never_opt_out_lib.dart" as nev;
 
 import "org-dartlang-testcase:///never_opt_out_lib.dart";
 
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  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 B extends nev::A {
   field core::Null? neverField = null;
   field core::Null? nullField = null;
@@ -33,21 +48,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends nev::A {
-  field Never* neverField = null;
-  field Never* nullField = null;
+  field core::Null? neverField = null;
+  field core::Null? nullField = null;
   synthetic constructor •() → self::C*
     : super nev::A::•()
     ;
-  method neverMethod(Never* value) → Never*
+  method neverMethod(core::Null? value) → core::Null?
     return value;
-  get neverProperty() → Never*
+  get neverProperty() → core::Null?
     return null;
-  set neverProperty(Never* value) → void {}
-  method nullMethod(Never* value) → Never*
+  set neverProperty(core::Null? value) → void {}
+  method nullMethod(core::Null? value) → core::Null?
     return value;
-  get nullProperty() → Never*
+  get nullProperty() → core::Null?
     return null;
-  set nullProperty(Never* value) → void {}
+  set nullProperty(core::Null? value) → 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
@@ -59,10 +74,15 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field Never* optOutNever;
+static field core::Null? optOutNever;
 static field dynamic inferredOptOutNever = nev::optInNever;
+static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
 static method main() → dynamic {
-  Never* localNever = null;
+  nev::optInNever = self::optOutNever;
+  core::Type* typeNever = core::Null?;
+  self::genericMethod<core::Null?>();
+  new self::GenericClass::•<core::Null?>();
+  core::Null? localNever = null;
   core::Null? localNull = null;
   dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
@@ -89,14 +109,14 @@
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
-  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
-  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
   nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
   localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
   self::inferredOptOutNever = self::inferredOptOutNever;
   inferredLocalNever = self::inferredOptOutNever;
-  localNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
-  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
   nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
   localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
   self::inferredOptOutNever = inferredLocalNever;
@@ -107,6 +127,13 @@
   self::throws(() → core::Null? => nev::optInNever = nev::throwing());
   self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
   self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
+  self::throws(() → core::Null? {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+  });
+  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+  dynamic dyn = null;
+  nev::optInNever = dyn as{TypeError,ForDynamic} Never;
 }
 static method throws(() →* void f) → dynamic {
   try {
@@ -122,7 +149,6 @@
 import self as nev;
 import "dart:core" as core;
 import "dart:_internal" as _in;
-import "never_opt_out.dart" as self;
 
 import "org-dartlang-testcase:///never_opt_out.dart";
 
@@ -143,6 +169,15 @@
     return null;
   set nullProperty(core::Null? value) → void {}
 }
-static field Never optInNever = self::optOutNever;
+class BoundedGenericClass<T extends Never = Never> extends core::Object {
+  synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
+    : super core::Object::•()
+    ;
+}
+late static field Never optInNever;
 static method throwing() → Never
   return throw "Never!";
+static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+  return throw "Should never return";
+static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+  return <nev::boundedGenericMethod2::T>[];
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
index 1977f90..9428bc8 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
@@ -1,10 +1,25 @@
 library;
 import self as self;
-import "never_opt_out_lib.dart" as nev;
 import "dart:core" as core;
+import "never_opt_out_lib.dart" as nev;
 
 import "org-dartlang-testcase:///never_opt_out_lib.dart";
 
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  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 B extends nev::A {
   field core::Null? neverField = null;
   field core::Null? nullField = null;
@@ -33,21 +48,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends nev::A {
-  field Never* neverField = null;
-  field Never* nullField = null;
+  field core::Null? neverField = null;
+  field core::Null? nullField = null;
   synthetic constructor •() → self::C*
     : super nev::A::•()
     ;
-  method neverMethod(Never* value) → Never*
+  method neverMethod(core::Null? value) → core::Null?
     return value;
-  get neverProperty() → Never*
+  get neverProperty() → core::Null?
     return null;
-  set neverProperty(Never* value) → void {}
-  method nullMethod(Never* value) → Never*
+  set neverProperty(core::Null? value) → void {}
+  method nullMethod(core::Null? value) → core::Null?
     return value;
-  get nullProperty() → Never*
+  get nullProperty() → core::Null?
     return null;
-  set nullProperty(Never* value) → void {}
+  set nullProperty(core::Null? value) → 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
@@ -59,10 +74,15 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field Never* optOutNever;
+static field core::Null? optOutNever;
 static field dynamic inferredOptOutNever = nev::optInNever;
+static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
 static method main() → dynamic {
-  Never* localNever = null;
+  nev::optInNever = self::optOutNever;
+  core::Type* typeNever = core::Null?;
+  self::genericMethod<core::Null?>();
+  new self::GenericClass::•<core::Null?>();
+  core::Null? localNever = null;
   core::Null? localNull = null;
   dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
@@ -89,14 +109,14 @@
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
-  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
-  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
   nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
   localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
   self::inferredOptOutNever = self::inferredOptOutNever;
   inferredLocalNever = self::inferredOptOutNever;
-  localNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
-  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
   nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
   localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
   self::inferredOptOutNever = inferredLocalNever;
@@ -107,6 +127,13 @@
   self::throws(() → core::Null? => nev::optInNever = nev::throwing());
   self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
   self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
+  self::throws(() → core::Null? {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+  });
+  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+  dynamic dyn = null;
+  nev::optInNever = dyn as{TypeError,ForDynamic} Never;
 }
 static method throws(() →* void f) → dynamic {
   try {
@@ -122,7 +149,6 @@
 import self as nev;
 import "dart:core" as core;
 import "dart:_internal" as _in;
-import "never_opt_out.dart" as self;
 
 import "org-dartlang-testcase:///never_opt_out.dart";
 
@@ -143,6 +169,20 @@
     return null;
   set nullProperty(core::Null? value) → void {}
 }
-static field Never optInNever = self::optOutNever;
+class BoundedGenericClass<T extends Never = Never> extends core::Object {
+  synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
+    : super core::Object::•()
+    ;
+}
+late static field Never optInNever;
 static method throwing() → Never
   return throw "Never!";
+static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+  return throw "Should never return";
+static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+  return <nev::boundedGenericMethod2::T>[];
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///never_opt_out.dart:19:20 -> TypeLiteralConstant(Null?)
+Extra constant evaluation: evaluated: 136, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart b/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
index a519e50..b2f225b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
@@ -6,7 +6,7 @@
 
 Never throwing() => throw 'Never!';
 
-Never optInNever = optOutNever;
+late Never optInNever;
 
 class A {
   Never neverField = throw "Should not reach here";
@@ -19,3 +19,9 @@
   Null get nullProperty => null;
   void set nullProperty(Null value) {}
 }
+
+class BoundedGenericClass<T extends Never> {}
+
+T boundedGenericMethod1<T extends Never>() => throw "Should never return";
+
+List<T> boundedGenericMethod2<T extends Never>() => <T>[];
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index d26a0c2..b53cc5e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -178,6 +178,7 @@
 nnbd/issue41349: FormatterCrash
 nnbd/issue41597: FormatterCrash
 nnbd/issue42967: FormatterCrash
+nnbd/issue43211: FormatterCrash
 nnbd/issue43278: FormatterCrash
 nnbd/issue43354: FormatterCrash
 nnbd/late: FormatterCrash
diff --git a/tests/language/inference/inconsistent_inheritance_test.dart b/tests/language/inference/inconsistent_inheritance_test.dart
index 8ff26eb..beff18f 100644
--- a/tests/language/inference/inconsistent_inheritance_test.dart
+++ b/tests/language/inference/inconsistent_inheritance_test.dart
@@ -4,10 +4,14 @@
 
 class A {
   void f(Object x) {}
+
+  void g(Object x, String y) {}
 }
 
 class B {
   void f(String x) {}
+
+  void g(String x, Object y) {}
 }
 
 class C extends A implements B {
@@ -19,6 +23,16 @@
     // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'String'.
   }
+
+  // No combined signature.
+  void g(x, y) {
+    // ^
+    // [analyzer] COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE
+    //   ^
+    // [cfe] Can't infer a type for 'x' as the overridden members don't have a combined signature.
+    //      ^
+    // [cfe] Can't infer a type for 'y' as the overridden members don't have a combined signature.
+  }
 }
 
 void main() {}
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 7a18cec..a59bdd2 100644
--- a/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
+++ b/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
@@ -28,7 +28,7 @@
 
   static late String error;
 
-  get throwingGetter => throw error;
+  get throwingGetter => throw 'Null access';
 
   C(this.instanceField);
 }
@@ -36,20 +36,17 @@
 class D extends C {
   D(int field) : super(field);
 
-  void ifNullAssignSuper(int f()) {
-    super.instanceField ??= f(); // ignore: dead_null_aware_expression
-    // Should throw if `instanceField` returns null (rather than calling `f`).
+  int ifNullAssignSuper(int f()) {
+    return super.instanceField ??= f(); // ignore: dead_null_aware_expression
   }
 
-  void ifNullAssignSuper_nullableSetter(int f()) {
-    super.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
-    // Should throw if `instanceGetterSetter` returns null (rather than calling
-    // `f`).
+  int ifNullAssignSuper_nullableSetter(int f()) {
+    return super.instanceGetterSetter ??=
+        f(); // ignore: dead_null_aware_expression
   }
 
-  void ifNullAssignSuperIndex(int f()) {
-    super[0] ??= f(); // ignore: dead_null_aware_expression
-    // Should throw if `super[0]` returns null (rather than calling `f`).
+  int ifNullAssignSuperIndex(int f()) {
+    return super[0] ??= f(); // ignore: dead_null_aware_expression
   }
 }
 
@@ -86,241 +83,217 @@
 
 late Never topLevelNever;
 
-void neverParameter(Never n) {
-  // Should throw before getting here.
+int neverParameter(Never n) {
+  return 42;
 }
 
-void neverInitializingFormal(Never n) {
-  // Should throw before getting here.
+int neverInitializingFormal(Never n) {
+  return 42;
 }
 
-void isPromoteToNever(int i) {
-  if (i is int) return;
-  // Should throw if `i` is null.
+bool isPromoteToNever(int i) {
+  if (i is int) return true;
+  return false;
 }
 
-void isPromoteToNever_noIf(int i) {
-  i is int;
-  // Should throw if `i` is null.
+bool isPromoteToNever_noIf(int i) {
+  return i is int;
 }
 
-void isNotPromoteToNever(int i) {
+bool isNotPromoteToNever(int i) {
   if (i is! int) {
-    // Should throw if `i` is null.
+    return true;
   }
+  return false;
 }
 
-void isNotPromoteToNever_noIf(int i) {
-  i is! int;
+bool isNotPromoteToNever_noIf(int i) {
+  return i is! int;
 }
 
-void equalNullPromoteToNever(int f()) {
-  if (f() == null) { // ignore: unnecessary_null_comparison
-    // Should throw if `f` returns null.
+int equalNullPromoteToNever(int f()) {
+  if (f() == null) {
+    // ignore: unnecessary_null_comparison
+    return 42;
   }
+  return 0;
 }
 
-void equalNullPromoteToNever_noIf(int f()) {
+int equalNullPromoteToNever_noIf(int f()) {
   f() == null; // ignore: unnecessary_null_comparison
-  // Should throw if `f` returns null.
+  return 42;
 }
 
-void notEqualNullPromoteToNever(int f()) {
-  if (f() != null) return; // ignore: unnecessary_null_comparison
-  // Should throw if `f` returns null.
+int notEqualNullPromoteToNever(int f()) {
+  if (f() != null) return 0; // ignore: unnecessary_null_comparison
+  return 42;
 }
 
-void notEqualNullPromoteToNever_noIf(int f()) {
+int notEqualNullPromoteToNever_noIf(int f()) {
   f() != null; // ignore: unnecessary_null_comparison
-  // Should throw if `f` returns null.
+  return 42;
 }
 
-void nullEqualPromoteToNever(int f()) {
-  if (null == f()) { // ignore: unnecessary_null_comparison
-    // Should throw if `f` returns null.
+int nullEqualPromoteToNever(int f()) {
+  if (null == f()) {
+    // ignore: unnecessary_null_comparison
+    return 42;
   }
+  return 0;
 }
 
-void nullEqualPromoteToNever_noIf(int f()) {
+int nullEqualPromoteToNever_noIf(int f()) {
   null == f(); // ignore: unnecessary_null_comparison
-  // Should throw if `f` returns null.
+  return 42;
 }
 
-void nullNotEqualPromoteToNever(int f()) {
-  if (null != f()) return; // ignore: unnecessary_null_comparison
-  // Should throw if `f` returns null.
+int nullNotEqualPromoteToNever(int f()) {
+  if (null != f()) return 0; // ignore: unnecessary_null_comparison
+  return 42;
 }
 
-void nullNotEqualPromoteToNever_noIf(int f()) {
+int nullNotEqualPromoteToNever_noIf(int f()) {
   null != f(); // ignore: unnecessary_null_comparison
-  // Should throw if `f` returns null.
+  return 42;
 }
 
 int unnecessaryIfNull(int f(), int g()) {
   return f() ?? g(); // ignore: dead_null_aware_expression
-  // Should throw if `f` returns null (rather than calling `g`).
 }
 
-void ifNullAssignLocal(int local, int f()) {
-  local ??= f(); // ignore: dead_null_aware_expression
-  // Should throw if `local` returns null (rather than calling `f`).
+int ifNullAssignLocal(int local, int f()) {
+  return local ??= f(); // ignore: dead_null_aware_expression
 }
 
-void ifNullAssignStatic(int f()) {
-  C.staticField ??= f(); // ignore: dead_null_aware_expression
-  // Should throw if `staticField` returns null (rather than calling `f`).
+int ifNullAssignStatic(int f()) {
+  return C.staticField ??= f(); // ignore: dead_null_aware_expression
 }
 
-void ifNullAssignStaticGetter_nullableSetter(int f()) {
-  C.staticGetterSetter ??= f(); // ignore: dead_null_aware_expression
-  // Should throw if `staticGetterSetter` returns null (rather than calling
-  // `f`).
+int ifNullAssignStaticGetter_nullableSetter(int f()) {
+  return C.staticGetterSetter ??= f(); // ignore: dead_null_aware_expression
 }
 
-void ifNullAssignField(C c, int f()) {
-  c.instanceField ??= f(); // ignore: dead_null_aware_expression
-  // Should throw if `instanceField` returns null (rather than calling `f`).
+int ifNullAssignField(C c, int f()) {
+  return c.instanceField ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignGetter_nullableSetter(C c, int f()) {
+  return c.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignGetter_implicitExtension(E e, int f()) {
+  return e.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignGetter_explicitExtension(E e, int f()) {
+  return EExt(e).instanceGetterSetter ??=
+      f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignIndex(List<int> x, int f()) {
+  return x[0] ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int? ifNullAssignIndex_nullAware(List<int>? x, int f()) {
+  return x?[0] ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignIndex_nullableSetter(C x, int f()) {
+  return x[0] ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignIndex_implicitExtension(E x, int f()) {
+  return x[0] ??= f(); // ignore: dead_null_aware_expression
 }
 
-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`).
+int ifNullAssignIndex_explicitExtension(E x, int f()) {
+  return EExt(x)[0] ??= f(); // ignore: dead_null_aware_expression
 }
 
-void ifNullAssignSuper(D d, int f()) {
-  d.ifNullAssignSuper(f);
+int ifNullAssignSuper(D d, int f()) {
+  return d.ifNullAssignSuper(f);
 }
 
-void ifNullAssignSuper_nullableSetter(D d, int f()) {
-  d.ifNullAssignSuper_nullableSetter(f);
+int ifNullAssignSuper_nullableSetter(D d, int f()) {
+  return d.ifNullAssignSuper_nullableSetter(f);
 }
 
-void ifNullAssignSuperIndex(D d, int f()) {
-  d.ifNullAssignSuperIndex(f);
+int ifNullAssignSuperIndex(D d, int f()) {
+  return 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`).
 }
 
-void ifNullAssignNullAwareStatic(int f()) {
-  C?.staticField ??= f(); // ignore: dead_null_aware_expression
-  // Should throw if `staticField` returns null (rather than calling `f`).
+int ifNullAssignNullAwareStatic(int f()) {
+  return C?.staticField ??= f(); // ignore: dead_null_aware_expression
 }
 
-void unnecessaryNullAwareAccess(int f(), String error) {
-  f()?.gcd(throw error); // ignore: invalid_null_aware_operator
-  // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess(int f()) {
+  f()?.gcd(throw 'Null access'); // ignore: invalid_null_aware_operator
 }
 
-void unnecessaryNullAwareAccess_cascaded(int f(), String error) {
-  f()?..gcd(throw error); // ignore: invalid_null_aware_operator
-  // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_cascaded(int f()) {
+  f()?..gcd(throw 'Null access'); // ignore: invalid_null_aware_operator
 }
 
-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_methodOnObject(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?.toString().compareTo(throw 'Null access');
 }
 
-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_cascaded_methodOnObject(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?..toString().compareTo(throw 'Null access');
 }
 
-void unnecessaryNullAwareAccess_methodOnExtension(int f(), String error) {
-  f()?.extendedMethod(throw error); // ignore: invalid_null_aware_operator
-  // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_methodOnExtension(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?.extendedMethod(throw 'Null access');
 }
 
-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_cascaded_methodOnExtension(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?..extendedMethod(throw 'Null access');
 }
 
-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_methodOnExtension_explicit(int f()) {
+  // ignore: invalid_null_aware_operator
+  IntQExt(f())?.extendedMethod(throw 'Null access');
 }
 
-void unnecessaryNullAwareAccess_getter(C f(), String error) {
-  C.error = error;
+void unnecessaryNullAwareAccess_getter(C f()) {
   f()?.throwingGetter; // ignore: invalid_null_aware_operator
-  // Should throw if `f` returns null.
 }
 
-void unnecessaryNullAwareAccess_cascaded_getter(C f(), String error) {
-  C.error = error;
+void unnecessaryNullAwareAccess_cascaded_getter(C f()) {
   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_getterOnObject(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?.hashCode.remainder(throw 'Null access');
 }
 
-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_cascaded_getterOnObject(int f()) {
+// ignore: invalid_null_aware_operator
+  f()?..hashCode.remainder(throw 'Null access');
 }
 
-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_getterOnExtension(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?.extendedGetter.remainder(throw 'Null access');
 }
 
-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_cascaded_getterOnExtension(int f()) {
+  // ignore: invalid_null_aware_operator
+  f()?..extendedGetter.remainder(throw 'Null access');
 }
 
-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 unnecessaryNullAwareAccess_getterOnExtension_explicit(int f()) {
+  // ignore: invalid_null_aware_operator
+  IntQExt(f())?.extendedGetter.remainder(throw 'Null access');
 }
 
 void getterReturnsNever(A a) {
@@ -353,14 +326,14 @@
   // Should throw if `method` completes normally.
 }
 
-void switchOnBool(bool b) {
+int switchOnBool(bool b) {
   switch (b) {
     case true:
-      return;
+      return 0;
     case false:
-      return;
+      return 1;
   }
-  // Should throw if the implicit `default` branch is taken.
+  return 42;
 }
 
 void switchOnEnum(Hand hand) {
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 d3f2d71..810a435 100644
--- a/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
+++ b/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
@@ -22,221 +22,72 @@
 }
 
 main() {
-  Expect.throws(() {
-    neverParameter(null);
-  });
+  Expect.equals(42, neverParameter(null));
 
-  Expect.throws(() {
-    NeverField().n = null;
-  });
+  var neverField = NeverField.initializingFormal(null);
+  // Write.
+  Expect.equals(null, neverField.n = null);
+  // Read.
+  Expect.equals(null, neverField.n);
 
-  Expect.throws(() {
-    // Write.
-    topLevelNever = null;
-  });
+  // Write.
+  Expect.equals(null, topLevelNever = null);
+  // Read.
+  Expect.equals(null, topLevelNever);
 
-  Expect.throws(() {
-    // Read.
-    topLevelNever;
-  });
+  Expect.isFalse(isPromoteToNever(null));
+  Expect.isFalse(isPromoteToNever_noIf(null));
+  Expect.isTrue(isNotPromoteToNever(null));
+  Expect.isTrue(isNotPromoteToNever_noIf(null));
+  Expect.equals(42, equalNullPromoteToNever(() => null));
+  Expect.equals(42, equalNullPromoteToNever_noIf(() => null));
+  Expect.equals(42, notEqualNullPromoteToNever(() => null));
+  Expect.equals(42, notEqualNullPromoteToNever_noIf(() => null));
+  Expect.equals(42, nullEqualPromoteToNever(() => null));
+  Expect.equals(42, nullEqualPromoteToNever_noIf(() => null));
+  Expect.equals(42, nullNotEqualPromoteToNever(() => null));
+  Expect.equals(42, nullNotEqualPromoteToNever_noIf(() => null));
+  Expect.equals(42, unnecessaryIfNull(() => null, () => 42));
+  Expect.equals(42, ifNullAssignLocal(null, () => 42));
 
-  Expect.throws(() {
-    NeverField.initializingFormal(null);
-  });
+  // Write.
+  Expect.equals(null, C.staticField = null);
 
-  Expect.throws(() {
-    isPromoteToNever(null);
-  });
+  // Read.
+  Expect.equals(null, C.staticField);
 
-  Expect.throws(() {
-    isPromoteToNever_noIf(null);
-  });
+  Expect.equals(42, ifNullAssignStatic(() => 42));
+  Expect.equals(42, ifNullAssignStaticGetter_nullableSetter(() => 42));
+  Expect.equals(42, ifNullAssignField(C(null), () => 42));
+  Expect.equals(42, ifNullAssignGetter_nullableSetter(C(null), () => 42));
+  Expect.equals(42, ifNullAssignGetter_implicitExtension(E(null), () => 42));
+  Expect.equals(42, ifNullAssignGetter_explicitExtension(E(null), () => 42));
+  Expect.equals(42, ifNullAssignIndex(<int>[null], () => 42));
+  Expect.equals(42, ifNullAssignIndex_nullAware(<int>[null], () => 42));
+  Expect.equals(42, ifNullAssignIndex_nullableSetter(C(null), () => 42));
+  Expect.equals(42, ifNullAssignIndex_implicitExtension(E(null), () => 42));
+  Expect.equals(42, ifNullAssignIndex_explicitExtension(E(null), () => 42));
+  Expect.equals(42, ifNullAssignSuper(D(null), () => 42));
+  Expect.equals(42, ifNullAssignSuper_nullableSetter(D(null), () => 42));
+  Expect.equals(42, ifNullAssignSuperIndex(D(null), () => 42));
+  Expect.equals(42, ifNullAssignNullAwareField(C(null), () => 42));
+  Expect.equals(null, ifNullAssignNullAwareField(null, () => 42));
+  Expect.equals(42, ifNullAssignNullAwareStatic(() => 42));
 
-  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");
-
-  Expect.throws(() {
-    ifNullAssignLocal(null, () => throw "should not reach");
-  }, (error) => error != "should not reach");
-
-  C.staticField = null;
-  Expect.throws(() {
-    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");
-
-  Expect.equals(
-      ifNullAssignNullAwareField(null, () => throw "should not reach"), null);
-
-  C.staticField = null;
-  Expect.throws(() {
-    ifNullAssignNullAwareStatic(() => throw "should not reach");
-  }, (error) => error != "should not reach");
-
-  Expect.throws(() {
-    unnecessaryNullAwareAccess(() => null, "should not reach");
-  }, (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");
+  unnecessaryNullAwareAccess(() => null);
+  unnecessaryNullAwareAccess_methodOnObject(() => null);
+  unnecessaryNullAwareAccess_cascaded_methodOnObject(() => null);
+  unnecessaryNullAwareAccess_methodOnExtension(() => null);
+  unnecessaryNullAwareAccess_cascaded_methodOnExtension(() => null);
+  unnecessaryNullAwareAccess_methodOnExtension_explicit(() => null);
+  unnecessaryNullAwareAccess_getter(() => null);
+  unnecessaryNullAwareAccess_cascaded(() => null);
+  unnecessaryNullAwareAccess_cascaded_getter(() => null);
+  unnecessaryNullAwareAccess_getterOnObject(() => null);
+  unnecessaryNullAwareAccess_cascaded_getterOnObject(() => null);
+  unnecessaryNullAwareAccess_getterOnExtension(() => null);
+  unnecessaryNullAwareAccess_cascaded_getterOnExtension(() => null);
+  unnecessaryNullAwareAccess_getterOnExtension_explicit(() => null);
 
   Expect.throws(() {
     getterReturnsNever(AImpl());
@@ -262,11 +113,22 @@
     returnsNeverInVariable(AImpl());
   });
 
-  Expect.throws(() {
-    switchOnBool(null);
-  });
+  Expect.equals(42, switchOnBool(null));
 
   Expect.throws(() {
     switchOnEnum(null);
   });
 }
+
+bool isCalled;
+
+registerCallAndReturnNull() {
+  isCalled = true;
+  return null;
+}
+
+expectCall(void Function() f) {
+  isCalled = false;
+  f();
+  Expect.isTrue(isCalled);
+}
diff --git a/tests/language/null_aware/prefix_not_shortening_test.dart b/tests/language/null_aware/prefix_not_shortening_test.dart
new file mode 100644
index 0000000..20ef1af
--- /dev/null
+++ b/tests/language/null_aware/prefix_not_shortening_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+class C {
+  C e() => this;
+  C operator -() => this;
+  C operator ~() => this;
+}
+
+void main() {
+  final C? c = new C();
+  /**/ -c?.e();
+  //    ^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  //   ^
+  // [cfe] Operator 'unary-' cannot be called on 'C?' because it is potentially null.
+
+  /**/ ~c?.e();
+  //    ^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  //   ^
+  // [cfe] Operator '~' cannot be called on 'C?' because it is potentially null.
+}
diff --git a/tests/language/operator/invalid_operators_test.dart b/tests/language/operator/invalid_operators_test.dart
index 52eae80..badafb5 100644
--- a/tests/language/operator/invalid_operators_test.dart
+++ b/tests/language/operator/invalid_operators_test.dart
@@ -572,13 +572,15 @@
   operator ==<T>(a) => true;
   //       ^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
-  // [cfe] Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
+  // [cfe] Can't infer a return type for '==' as the overridden members don't have a combined signature.
   //       ^
-  // [cfe] The return type of the method 'Operators7.==' is 'dynamic', which does not match the return type, 'bool', of the overridden method, 'Object.=='.
+  // [cfe] Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
   //         ^^^
   // [analyzer] SYNTACTIC_ERROR.TYPE_PARAMETERS_ON_OPERATOR
   //          ^
   // [cfe] Types parameters aren't allowed when defining an operator.
+  //             ^
+  // [cfe] Can't infer a type for 'a' as the overridden members don't have a combined signature.
   operator ><T>(a) => true;
   //        ^^^
   // [analyzer] SYNTACTIC_ERROR.TYPE_PARAMETERS_ON_OPERATOR
@@ -675,7 +677,7 @@
   /*space*/ int operator []=(a, b) => 1;
   //        ^^^
   // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_OPERATOR
-  // [cfe] unspecified
+  // [cfe] The return type of the operator []= must be 'void'.
 }
 
 main() {}
diff --git a/tools/VERSION b/tools/VERSION
index 178e41b..b4ac9ab 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 201
+PRERELEASE 202
 PRERELEASE_PATCH 0
\ No newline at end of file