Version 2.11.0-260.0.dev

Merge commit '8f193a3e8675469f68f7f77cb853f74566ff00da' into 'dev'
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 9010a8c..e2648b5 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -184,7 +184,7 @@
   }
 }
 
-class DartdevRunner<int> extends CommandRunner {
+class DartdevRunner extends CommandRunner {
   @override
   final ArgParser argParser =
       ArgParser(usageLineLength: dartdevUsageLineLength);
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index 80ef119..e13413f 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -14,7 +14,7 @@
 import '../sdk.dart';
 import '../utils.dart';
 
-class AnalyzeCommand extends DartdevCommand<int> {
+class AnalyzeCommand extends DartdevCommand {
   static const String cmdName = 'analyze';
 
   /// The maximum length of any of the existing severity labels.
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 491d7ae..9e8f0fe 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -239,7 +239,7 @@
   }
 }
 
-abstract class CompileSubcommandCommand extends DartdevCommand<int> {
+abstract class CompileSubcommandCommand extends DartdevCommand {
   CompileSubcommandCommand(String name, String description,
       {bool hidden = false})
       : super(name, description, hidden: hidden);
@@ -252,7 +252,7 @@
       );
 }
 
-class CompileCommand extends DartdevCommand<int> {
+class CompileCommand extends DartdevCommand {
   static const String cmdName = 'compile';
 
   CompileCommand() : super(cmdName, 'Compile Dart to various formats.') {
diff --git a/pkg/dartdev/lib/src/commands/create.dart b/pkg/dartdev/lib/src/commands/create.dart
index 920de13..647e2f2 100644
--- a/pkg/dartdev/lib/src/commands/create.dart
+++ b/pkg/dartdev/lib/src/commands/create.dart
@@ -16,7 +16,7 @@
 import '../sdk.dart';
 
 /// A command to create a new project from a set of templates.
-class CreateCommand extends DartdevCommand<int> {
+class CreateCommand extends DartdevCommand {
   static const String cmdName = 'create';
 
   static String defaultTemplateId = 'console-simple';
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index 7fd3750..718c215 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -15,7 +15,7 @@
 import '../sdk.dart';
 import '../utils.dart';
 
-class FixCommand extends DartdevCommand<int> {
+class FixCommand extends DartdevCommand {
   static const String cmdName = 'fix';
 
   // This command is hidden as its currently experimental.
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index c30bc61..9d1da3f 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -13,7 +13,7 @@
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
 
-class PubCommand extends DartdevCommand<int> {
+class PubCommand extends DartdevCommand {
   static const String cmdName = 'pub';
 
   PubCommand() : super(cmdName, 'Work with packages.');
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index 03df87d..f7aa5d6 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -18,7 +18,7 @@
 import '../utils.dart';
 import '../vm_interop_handler.dart';
 
-class RunCommand extends DartdevCommand<int> {
+class RunCommand extends DartdevCommand {
   static const String cmdName = 'run';
 
   // kErrorExitCode, as defined in runtime/bin/error_exit.h
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index beba8c8..167a6dc 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -16,7 +16,7 @@
 /// Implement `dart test`.
 ///
 /// This command largely delegates to `pub run test`.
-class TestCommand extends DartdevCommand<int> {
+class TestCommand extends DartdevCommand {
   static const String cmdName = 'test';
 
   TestCommand() : super(cmdName, 'Run tests in this package.');
diff --git a/pkg/dartdev/lib/src/core.dart b/pkg/dartdev/lib/src/core.dart
index 5694415..4a98629 100644
--- a/pkg/dartdev/lib/src/core.dart
+++ b/pkg/dartdev/lib/src/core.dart
@@ -20,7 +20,7 @@
 Logger log;
 bool isDiagnostics = false;
 
-abstract class DartdevCommand<int> extends Command {
+abstract class DartdevCommand extends Command {
   final String _name;
   final String _description;
 
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 5584775..04790c5 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -18,6 +18,7 @@
 import '../kernel/class_hierarchy_builder.dart';
 import '../kernel/kernel_builder.dart' show ImplicitFieldType;
 import '../kernel/late_lowering.dart' as late_lowering;
+import '../kernel/member_covariance.dart';
 
 import '../modifier.dart' show covariantMask, hasInitializerMask, lateMask;
 
@@ -697,6 +698,8 @@
   @override
   final SourceFieldBuilder memberBuilder;
 
+  Covariance _covariance;
+
   @override
   final bool forSetter;
 
@@ -720,6 +723,13 @@
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??= forSetter
+        ? new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter)
+        : const Covariance.empty();
+  }
+
+  @override
   bool get isSourceDeclaration => true;
 
   @override
@@ -1325,6 +1335,8 @@
 
   final Member _member;
 
+  Covariance _covariance;
+
   @override
   final bool forSetter;
 
@@ -1341,6 +1353,12 @@
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??=
+        new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter);
+  }
+
+  @override
   void inferType(ClassHierarchyBuilder hierarchy) {
     fieldBuilder._ensureType(hierarchy);
   }
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index d31c661..2ac1790 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -251,9 +251,6 @@
   bool get isStatic => memberBuilder.isStatic;
 
   @override
-  Member getMember(ClassHierarchyBuilder hierarchy) => memberBuilder.member;
-
-  @override
   bool isObjectMember(ClassBuilder objectClass) {
     return classBuilder == objectClass;
   }
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 654aef2..1b81273 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -13,6 +13,7 @@
 import '../kernel/class_hierarchy_builder.dart';
 import '../kernel/forest.dart';
 import '../kernel/internal_ast.dart';
+import '../kernel/member_covariance.dart';
 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
 
 import '../loader.dart' show Loader;
@@ -593,6 +594,8 @@
   @override
   final SourceProcedureBuilder memberBuilder;
 
+  Covariance _covariance;
+
   SourceProcedureMember(this.memberBuilder);
 
   @override
@@ -615,6 +618,12 @@
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??=
+        new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter);
+  }
+
+  @override
   bool get forSetter => isSetter;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index c22b13b..700d6a9 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -13,6 +13,7 @@
 
 import '../kernel/class_hierarchy_builder.dart'
     show ClassHierarchyBuilder, ClassMember;
+import '../kernel/member_covariance.dart';
 import '../kernel/kernel_builder.dart'
     show isRedirectingGenerativeConstructorImplementation;
 
@@ -223,6 +224,8 @@
   @override
   final DillMemberBuilder memberBuilder;
 
+  Covariance _covariance;
+
   @override
   final bool forSetter;
 
@@ -253,6 +256,15 @@
   }
 
   @override
+  Member getMember(ClassHierarchyBuilder hierarchy) => memberBuilder.member;
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??=
+        new Covariance.fromMember(memberBuilder.member, forSetter: forSetter);
+  }
+
+  @override
   bool get isFunction => !isProperty;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 73e6525..ff35840 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2070,11 +2070,8 @@
       Name n = new Name(name, libraryBuilder.nameOrigin);
       if (!isQualified && isDeclarationInstanceContext) {
         assert(declaration == null);
-        if (inLateFieldInitializer) {
-          // Implicit access on 'this' is allowed in a late field initializer.
-          return new ThisPropertyAccessGenerator(this, token, n);
-        }
-        if (constantContext != ConstantContext.none || member.isField) {
+        if (constantContext != ConstantContext.none ||
+            (inFieldInitializer && !inLateFieldInitializer) && !inInitializer) {
           return new UnresolvedNameGenerator(this, token, n);
         }
         if (extensionThis != null) {
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 88124b4..ef7586e 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
@@ -81,6 +81,8 @@
 
 import 'combined_member_signature.dart';
 
+import 'member_covariance.dart';
+
 import 'forwarding_node.dart' show ForwardingNode;
 
 import 'kernel_builder.dart' show ImplicitFieldType;
@@ -233,6 +235,10 @@
   /// Returns `true` if this member is a field, getter or setter.
   bool get isProperty;
   Member getMember(ClassHierarchyBuilder hierarchy);
+
+  /// Returns the member [Covariance] for this class member.
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy);
+
   bool get isDuplicate;
   String get fullName;
   String get fullNameForErrors;
@@ -978,84 +984,10 @@
     assert(!declaredMember.isGetter && !declaredMember.isSetter);
     // Trigger computation of method type.
     Procedure declaredProcedure = declaredMember.getMember(hierarchy);
-    FunctionNode declaredFunction = declaredProcedure.function;
-    List<TypeParameter> declaredTypeParameters =
-        declaredFunction.typeParameters;
-    List<VariableDeclaration> declaredPositional =
-        declaredFunction.positionalParameters;
-    List<VariableDeclaration> declaredNamed = declaredFunction.namedParameters;
     for (ClassMember overriddenMember
         in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Member bMember = overriddenMember.getMember(hierarchy);
-      if (bMember is! Procedure) {
-        debug?.log("Giving up 1");
-        continue;
-      }
-      Procedure bProcedure = bMember;
-      FunctionNode bFunction = bProcedure.function;
-
-      List<TypeParameter> bTypeParameters = bFunction.typeParameters;
-      int typeParameterCount = declaredTypeParameters.length;
-      if (typeParameterCount != bTypeParameters.length) {
-        debug?.log("Giving up 2");
-        continue;
-      }
-      if (typeParameterCount != 0) {
-        for (int i = 0; i < typeParameterCount; i++) {
-          copyTypeParameterCovariance(declaredMember.classBuilder,
-              declaredTypeParameters[i], bTypeParameters[i]);
-        }
-      }
-
-      if (declaredFunction.requiredParameterCount >
-          bFunction.requiredParameterCount) {
-        debug?.log("Giving up 4");
-        continue;
-      }
-      List<VariableDeclaration> bPositional = bFunction.positionalParameters;
-      if (declaredPositional.length < bPositional.length) {
-        debug?.log("Giving up 5");
-        continue;
-      }
-
-      for (int i = 0; i < bPositional.length; i++) {
-        VariableDeclaration aParameter = declaredPositional[i];
-        VariableDeclaration bParameter = bPositional[i];
-        copyParameterCovariance(
-            declaredMember.classBuilder, aParameter, bParameter);
-      }
-
-      List<VariableDeclaration> bNamed = bFunction.namedParameters;
-      named:
-      if (declaredNamed.isNotEmpty || bNamed.isNotEmpty) {
-        if (declaredPositional.length != bPositional.length) {
-          debug?.log("Giving up 9");
-          break named;
-        }
-        if (declaredFunction.requiredParameterCount !=
-            bFunction.requiredParameterCount) {
-          debug?.log("Giving up 10");
-          break named;
-        }
-
-        declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
-        bNamed = bNamed.toList()..sort(compareNamedParameters);
-        int aCount = 0;
-        for (int bCount = 0; bCount < bNamed.length; bCount++) {
-          String name = bNamed[bCount].name;
-          for (; aCount < declaredNamed.length; aCount++) {
-            if (declaredNamed[aCount].name == name) break;
-          }
-          if (aCount == declaredNamed.length) {
-            debug?.log("Giving up 11");
-            break named;
-          }
-          VariableDeclaration aParameter = declaredNamed[aCount];
-          VariableDeclaration bParameter = bNamed[bCount];
-          copyParameterCovariance(
-              declaredMember.classBuilder, aParameter, bParameter);
-        }
-      }
+      Covariance covariance = overriddenMember.getCovariance(hierarchy);
+      covariance.applyCovariance(declaredProcedure);
     }
   }
 
@@ -1072,30 +1004,10 @@
     assert(declaredMember.isSetter);
     // Trigger computation of the getter type.
     Procedure declaredSetter = declaredMember.getMember(hierarchy);
-    VariableDeclaration setterParameter =
-        declaredSetter.function.positionalParameters.single;
     for (ClassMember overriddenMember
         in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Member bTarget = overriddenMember.getMember(hierarchy);
-      if (bTarget is Field) {
-        copyParameterCovarianceFromField(
-            declaredMember.classBuilder, setterParameter, bTarget);
-      } else if (bTarget is Procedure) {
-        if (overriddenMember.isSetter) {
-          VariableDeclaration bParameter =
-              bTarget.function.positionalParameters.single;
-          copyParameterCovariance(
-              declaredMember.classBuilder, setterParameter, bParameter);
-        } else if (overriddenMember.isGetter) {
-          // No variance to copy from getter.
-        } else {
-          debug?.log("Giving up (not accessor: ${bTarget.kind})");
-          continue;
-        }
-      } else {
-        debug?.log("Giving up (not field/procedure: ${bTarget.runtimeType})");
-        return;
-      }
+      Covariance covariance = overriddenMember.getCovariance(hierarchy);
+      covariance.applyCovariance(declaredSetter);
     }
   }
 
@@ -1546,74 +1458,8 @@
     Field declaredField = declaredMember.getMember(hierarchy);
     for (ClassMember overriddenMember
         in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Member bTarget = overriddenMember.getMember(hierarchy);
-      if (bTarget is Procedure) {
-        if (bTarget.isSetter) {
-          VariableDeclaration parameter =
-              bTarget.function.positionalParameters.single;
-          copyFieldCovarianceFromParameter(
-              declaredMember.classBuilder, declaredField, parameter);
-        }
-      } else if (bTarget is Field) {
-        copyFieldCovariance(
-            declaredMember.classBuilder, declaredField, bTarget);
-      }
-    }
-  }
-
-  void copyParameterCovariance(Builder parent, VariableDeclaration aParameter,
-      VariableDeclaration bParameter) {
-    if (parent == classBuilder) {
-      if (bParameter.isCovariant) {
-        aParameter.isCovariant = true;
-      }
-      if (bParameter.isGenericCovariantImpl) {
-        aParameter.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyParameterCovarianceFromField(
-      Builder parent, VariableDeclaration aParameter, Field bField) {
-    if (parent == classBuilder) {
-      if (bField.isCovariant) {
-        aParameter.isCovariant = true;
-      }
-      if (bField.isGenericCovariantImpl) {
-        aParameter.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyFieldCovariance(Builder parent, Field aField, Field bField) {
-    if (parent == classBuilder) {
-      if (bField.isCovariant) {
-        aField.isCovariant = true;
-      }
-      if (bField.isGenericCovariantImpl) {
-        aField.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyFieldCovarianceFromParameter(
-      Builder parent, Field aField, VariableDeclaration bParameter) {
-    if (parent == classBuilder) {
-      if (bParameter.isCovariant) {
-        aField.isCovariant = true;
-      }
-      if (bParameter.isGenericCovariantImpl) {
-        aField.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyTypeParameterCovariance(
-      Builder parent, TypeParameter aParameter, TypeParameter bParameter) {
-    if (parent == classBuilder) {
-      if (bParameter.isGenericCovariantImpl) {
-        aParameter.isGenericCovariantImpl = true;
-      }
+      Covariance covariance = overriddenMember.getCovariance(hierarchy);
+      covariance.applyCovariance(declaredField);
     }
   }
 
@@ -3146,7 +2992,8 @@
 /// has conflicts with methods inherited from an interface. The concrete
 /// implementation is the first element of [declarations].
 class InheritedImplementationInterfaceConflict extends DelayedMember {
-  Member combinedMemberSignatureResult;
+  Member _member;
+  Covariance _covariance;
   final ClassMember concreteMember;
 
   @override
@@ -3193,25 +3040,36 @@
         isInheritableConflict == other.isInheritableConflict;
   }
 
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    if (combinedMemberSignatureResult != null) {
-      return combinedMemberSignatureResult;
-    }
-    if (!classBuilder.isAbstract) {
-      if (classBuilder is SourceClassBuilder) {
-        for (int i = 0; i < declarations.length; i++) {
-          if (concreteMember != declarations[i]) {
-            new DelayedOverrideCheck(
-                    classBuilder, concreteMember, declarations[i])
-                .check(hierarchy);
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+    if (_member == null) {
+      if (!classBuilder.isAbstract) {
+        if (classBuilder is SourceClassBuilder) {
+          for (int i = 0; i < declarations.length; i++) {
+            if (concreteMember != declarations[i]) {
+              new DelayedOverrideCheck(
+                      classBuilder, concreteMember, declarations[i])
+                  .check(hierarchy);
+            }
           }
         }
       }
+      InterfaceConflict interfaceConflict = new InterfaceConflict(classBuilder,
+          declarations, isProperty, isSetter, modifyKernel, isAbstract, name);
+      _member = interfaceConflict.getMember(hierarchy);
+      _covariance = interfaceConflict.getCovariance(hierarchy);
     }
-    return combinedMemberSignatureResult = new InterfaceConflict(classBuilder,
-            declarations, isProperty, isSetter, modifyKernel, isAbstract, name)
-        .getMember(hierarchy);
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _member;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _covariance;
   }
 
   @override
@@ -3288,7 +3146,8 @@
   @override
   bool get isAbstract => isExplicitlyAbstract || isImplicitlyAbstract;
 
-  Member combinedMemberSignatureResult;
+  Member _member;
+  Covariance _covariance;
 
   @override
   String toString() {
@@ -3314,14 +3173,14 @@
         isImplicitlyAbstract == other.isImplicitlyAbstract;
   }
 
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    if (combinedMemberSignatureResult != null) {
-      return combinedMemberSignatureResult;
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+    if (_member != null) {
+      return;
     }
     if (classBuilder.library is! SourceLibraryBuilder) {
-      return combinedMemberSignatureResult =
-          declarations.first.getMember(hierarchy);
+      _member = declarations.first.getMember(hierarchy);
+      _covariance = declarations.first.getCovariance(hierarchy);
+      return;
     }
 
     CombinedClassMemberSignature combinedMemberSignature =
@@ -3345,8 +3204,9 @@
           context: context);
       // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
       // cascading errors.
-      return combinedMemberSignatureResult =
-          declarations.first.getMember(hierarchy);
+      _member = declarations.first.getMember(hierarchy);
+      _covariance = declarations.first.getCovariance(hierarchy);
+      return;
     }
     debug?.log("Combined Member Signature of ${fullNameForErrors}: "
         "${combinedMemberSignature.canonicalMember.fullName}");
@@ -3368,7 +3228,7 @@
           "$declarations, $kind)");
       Member stub =
           new ForwardingNode(combinedMemberSignature, kind).finalize();
-      if (classBuilder.cls == stub.enclosingClass) {
+      if (stub != null && classBuilder.cls == stub.enclosingClass) {
         classBuilder.cls.addMember(stub);
         SourceLibraryBuilder library = classBuilder.library;
         Member bestMemberSoFar =
@@ -3378,14 +3238,34 @@
         }
         debug?.log("Combined Member Signature of ${fullNameForErrors}: "
             "added stub $stub");
-        return combinedMemberSignatureResult = stub;
+        _member = stub;
+        _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+        assert(
+            _covariance ==
+                new Covariance.fromMember(_member, forSetter: forSetter),
+            "Unexpected covariance for combined members signature "
+            "$_member. Found $_covariance, expected "
+            "${new Covariance.fromMember(_member, forSetter: forSetter)}.");
+        return;
       }
     }
 
     debug?.log(
         "Combined Member Signature of ${fullNameForErrors}: picked bestSoFar");
-    return combinedMemberSignatureResult =
-        combinedMemberSignature.canonicalMember.getMember(hierarchy);
+    _member = combinedMemberSignature.canonicalMember.getMember(hierarchy);
+    _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _member;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _covariance;
   }
 
   @override
@@ -3464,8 +3344,7 @@
 
   bool _isChecked = false;
 
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
     if (!_isChecked) {
       _isChecked = true;
       if (!classBuilder.isAbstract &&
@@ -3492,10 +3371,21 @@
             .finalize();
       }
     }
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
     return abstractMember.getMember(hierarchy);
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return abstractMember.getCovariance(hierarchy);
+  }
+
+  @override
   DelayedMember withParent(ClassBuilder parent) {
     return parent == this.classBuilder
         ? this
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 54f0dbd..5bc4ffe 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -2,8 +2,6 @@
 // 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.
 
-library fasta.class_hierarchy_builder;
-
 import 'package:kernel/ast.dart' hide MapEntry;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchyBase;
@@ -23,6 +21,7 @@
 import '../source/source_class_builder.dart';
 
 import 'class_hierarchy_builder.dart';
+import 'member_covariance.dart';
 
 /// Class used for computing and inspecting the combined member signature for
 /// a set of overridden/inherited members.
@@ -66,6 +65,8 @@
   /// Cache for the types of [members] as inherited into [classBuilder].
   List<DartType> _memberTypes;
 
+  List<Covariance> _memberCovariances;
+
   /// Cache for the this type of [classBuilder].
   DartType _thisType;
 
@@ -80,9 +81,19 @@
   /// If the combined member signature type is undefined this is set to `null`.
   DartType _combinedMemberSignatureType;
 
-  /// Accumulated result for [neededLegacyErasure]. This is fully computed when
-  /// [combinedMemberSignatureType] has been computed.
-  bool _neededLegacyErasure = false;
+  /// The indices for the members whose type needed legacy erasure.
+  ///
+  /// This is fully computed when [combinedMemberSignatureType] has been
+  /// computed.
+  Set<int> _neededLegacyErasureIndices;
+
+  bool _neededNnbdTopMerge = false;
+
+  bool _needsCovarianceMerging = false;
+
+  bool _isCombinedMemberSignatureCovarianceComputed = false;
+
+  Covariance _combinedMemberSignatureCovariance;
 
   /// Creates a [CombinedClassMemberSignature] whose canonical member is already
   /// defined.
@@ -201,7 +212,25 @@
   /// different type.
   bool get neededLegacyErasure {
     _ensureCombinedMemberSignatureType();
-    return _neededLegacyErasure;
+    return _neededLegacyErasureIndices?.contains(canonicalMemberIndex) ?? false;
+  }
+
+  /// Returns `true` if nnbd top merge and normalization was needed to compute
+  /// the combined member signature type.
+  bool get neededNnbdTopMerge {
+    _ensureCombinedMemberSignatureType();
+    return _neededNnbdTopMerge;
+  }
+
+  /// Returns `true` if the covariance of the combined member signature is
+  /// different from the covariance of the overridden member in the superclass.
+  ///
+  /// If `true` a concrete forwarding stub that checks the covariance must
+  /// be generated.
+  // TODO(johnniwinther): This is imprecise. It assumes that the 0th member is
+  // from the superclass which might not be the case.
+  bool get needsSuperImpl {
+    return _getMemberCovariance(0) != combinedMemberSignatureCovariance;
   }
 
   /// The this type of [classBuilder].
@@ -210,6 +239,18 @@
         classBuilder.cls, classBuilder.library.nonNullable);
   }
 
+  /// Returns `true` if the canonical member is declared in [classBuilder].
+  bool get isCanonicalMemberDeclared {
+    return _canonicalMemberIndex != null &&
+        _getMember(_canonicalMemberIndex).enclosingClass == classBuilder.cls;
+  }
+
+  /// Returns `true` if the canonical member is the 0th.
+  // TODO(johnniwinther): This is currently used under the assumption that the
+  // 0th member is either from the superclass or the one found if looked up
+  // the class hierarchy. This is a very brittle assumption.
+  bool get isCanonicalMemberFirst => _canonicalMemberIndex == 0;
+
   /// Returns type of the [index]th member in [members] as inherited in
   /// [classBuilder].
   DartType getMemberType(int index) {
@@ -223,7 +264,8 @@
       if (!classBuilder.library.isNonNullableByDefault) {
         DartType legacyErasure = rawLegacyErasure(_coreTypes, candidateType);
         if (legacyErasure != null) {
-          _neededLegacyErasure = true;
+          _neededLegacyErasureIndices ??= {};
+          _neededLegacyErasureIndices.add(index);
           candidateType = legacyErasure;
         }
       }
@@ -239,7 +281,8 @@
         return null;
       }
       if (classBuilder.library.isNonNullableByDefault) {
-        _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
+        DartType canonicalMemberType =
+            _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
         if (_mutualSubtypes != null) {
           _combinedMemberSignatureType =
               norm(_coreTypes, _combinedMemberSignatureType);
@@ -251,6 +294,8 @@
                   norm(_coreTypes, getMemberType(index)));
             }
           }
+          _neededNnbdTopMerge =
+              canonicalMemberType != _combinedMemberSignatureType;
         }
       } else {
         _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
@@ -264,6 +309,47 @@
     return _combinedMemberSignatureType;
   }
 
+  Covariance _getMemberCovariance(int index);
+
+  void _ensureCombinedMemberSignatureCovariance() {
+    if (!_isCombinedMemberSignatureCovarianceComputed) {
+      _isCombinedMemberSignatureCovarianceComputed = true;
+      if (canonicalMemberIndex == null) {
+        return;
+      }
+      Covariance canonicalMemberCovariance =
+          _combinedMemberSignatureCovariance =
+              _getMemberCovariance(canonicalMemberIndex);
+      if (members.length == 1) {
+        return;
+      }
+      for (int index = 0; index < members.length; index++) {
+        if (index != canonicalMemberIndex) {
+          _combinedMemberSignatureCovariance =
+              _combinedMemberSignatureCovariance
+                  .merge(_getMemberCovariance(index));
+        }
+      }
+      _needsCovarianceMerging =
+          canonicalMemberCovariance != _combinedMemberSignatureCovariance;
+    }
+  }
+
+  // Returns `true` if the covariance of [members] needs to be merged into
+  // the combined member signature.
+  bool get needsCovarianceMerging {
+    if (members.length != 1) {
+      _ensureCombinedMemberSignatureCovariance();
+    }
+    return _needsCovarianceMerging;
+  }
+
+  /// Returns [Covariance] for the combined member signature.
+  Covariance get combinedMemberSignatureCovariance {
+    _ensureCombinedMemberSignatureCovariance();
+    return _combinedMemberSignatureCovariance;
+  }
+
   /// Returns the type of the combined member signature, if defined, with
   /// all method type parameters substituted with [typeParameters].
   ///
@@ -316,25 +402,30 @@
       return null;
     }
     Member member = _getMember(canonicalMemberIndex);
+    Procedure combinedMemberSignature;
     if (member is Procedure) {
       switch (member.kind) {
         case ProcedureKind.Getter:
-          return _createGetterMemberSignature(
+          combinedMemberSignature = _createGetterMemberSignature(
               member, combinedMemberSignatureType,
               copyLocation: copyLocation);
+          break;
         case ProcedureKind.Setter:
           VariableDeclaration parameter =
               member.function.positionalParameters.first;
-          return _createSetterMemberSignature(
+          combinedMemberSignature = _createSetterMemberSignature(
               member, combinedMemberSignatureType,
               isGenericCovariantImpl: parameter.isGenericCovariantImpl,
               isCovariant: parameter.isCovariant,
               parameterName: parameter.name,
               copyLocation: copyLocation);
+          break;
         case ProcedureKind.Method:
         case ProcedureKind.Operator:
-          return _createMethodSignature(member, combinedMemberSignatureType,
+          combinedMemberSignature = _createMethodSignature(
+              member, combinedMemberSignatureType,
               copyLocation: copyLocation);
+          break;
         case ProcedureKind.Factory:
         default:
           throw new UnsupportedError(
@@ -342,18 +433,22 @@
       }
     } else if (member is Field) {
       if (forSetter) {
-        return _createSetterMemberSignature(member, combinedMemberSignatureType,
+        combinedMemberSignature = _createSetterMemberSignature(
+            member, combinedMemberSignatureType,
             isGenericCovariantImpl: member.isGenericCovariantImpl,
             isCovariant: member.isCovariant,
             copyLocation: copyLocation);
       } else {
-        return _createGetterMemberSignature(member, combinedMemberSignatureType,
+        combinedMemberSignature = _createGetterMemberSignature(
+            member, combinedMemberSignatureType,
             copyLocation: copyLocation);
       }
     } else {
       throw new UnsupportedError(
           'Unexpected canonical member $member (${member.runtimeType})');
     }
+    combinedMemberSignatureCovariance.applyCovariance(combinedMemberSignature);
+    return combinedMemberSignature;
   }
 
   /// Creates a getter member signature for [member] with the given
@@ -377,17 +472,22 @@
       fileOffset = member.fileOffset;
     } else {
       fileUri = enclosingClass.fileUri;
-      startFileOffset = fileOffset = enclosingClass.fileOffset;
+      fileOffset = startFileOffset = enclosingClass.fileOffset;
     }
-    return new Procedure(member.name, ProcedureKind.Getter,
-        new FunctionNode(null, returnType: type),
-        isAbstract: true,
-        isMemberSignature: true,
-        fileUri: fileUri,
-        memberSignatureOrigin: member.memberSignatureOrigin ?? member,
-        reference: referenceFrom?.reference)
+    return new Procedure(
+      member.name,
+      ProcedureKind.Getter,
+      new FunctionNode(null, returnType: type),
+      isAbstract: true,
+      isMemberSignature: true,
+      fileUri: fileUri,
+      memberSignatureOrigin: member.memberSignatureOrigin ?? member,
+      reference: referenceFrom?.reference,
+    )
       ..startFileOffset = startFileOffset
       ..fileOffset = fileOffset
+      ..isNonNullableByDefault =
+          enclosingClass.enclosingLibrary.isNonNullableByDefault
       ..parent = enclosingClass;
   }
 
@@ -418,7 +518,7 @@
       fileOffset = member.fileOffset;
     } else {
       fileUri = enclosingClass.fileUri;
-      startFileOffset = fileOffset = enclosingClass.fileOffset;
+      fileOffset = startFileOffset = enclosingClass.fileOffset;
     }
     return new Procedure(
         member.name,
@@ -437,6 +537,8 @@
         reference: referenceFrom?.reference)
       ..startFileOffset = startFileOffset
       ..fileOffset = fileOffset
+      ..isNonNullableByDefault =
+          enclosingClass.enclosingLibrary.isNonNullableByDefault
       ..parent = enclosingClass;
   }
 
@@ -458,7 +560,7 @@
       fileOffset = procedure.fileOffset;
     } else {
       fileUri = enclosingClass.fileUri;
-      startFileOffset = fileOffset = enclosingClass.fileOffset;
+      fileOffset = startFileOffset = enclosingClass.fileOffset;
     }
     FunctionNode function = procedure.function;
     List<VariableDeclaration> positionalParameters = [];
@@ -511,6 +613,8 @@
         reference: referenceFrom?.reference)
       ..startFileOffset = startFileOffset
       ..fileOffset = fileOffset
+      ..isNonNullableByDefault =
+          enclosingClass.enclosingLibrary.isNonNullableByDefault
       ..parent = enclosingClass;
   }
 
@@ -592,6 +696,15 @@
         "No member computed for ${candidate} (${candidate.runtimeType})");
     return target;
   }
+
+  @override
+  Covariance _getMemberCovariance(int index) {
+    ClassMember candidate = members[index];
+    Covariance covariance = candidate.getCovariance(hierarchy);
+    assert(covariance != null,
+        "No covariance computed for ${candidate} (${candidate.runtimeType})");
+    return covariance;
+  }
 }
 
 /// Class used for computing and inspecting the combined member signature for
@@ -615,4 +728,15 @@
 
   @override
   Member _getMember(int index) => members[index];
+
+  @override
+  Covariance _getMemberCovariance(int index) {
+    _memberCovariances ??= new List<Covariance>(members.length);
+    Covariance covariance = _memberCovariances[index];
+    if (covariance == null) {
+      _memberCovariances[index] = covariance =
+          new Covariance.fromMember(members[index], forSetter: forSetter);
+    }
+    return covariance;
+  }
 }
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 3538b3b..53f6b2d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -7,9 +7,7 @@
         Arguments,
         Class,
         DartType,
-        DynamicType,
         Expression,
-        Field,
         FunctionNode,
         Member,
         Name,
@@ -20,64 +18,25 @@
         SuperMethodInvocation,
         SuperPropertyGet,
         SuperPropertySet,
-        TypeParameter,
         TypeParameterType,
-        VariableDeclaration,
-        VariableGet,
-        Variance,
-        VoidType;
+        VariableGet;
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
 
-import "package:kernel/type_algebra.dart" show Substitution;
-
-import "package:kernel/src/legacy_erasure.dart";
-import "package:kernel/src/nnbd_top_merge.dart";
-import "package:kernel/src/norm.dart";
-
 import "../source/source_class_builder.dart";
 
 import "../problems.dart" show unhandled;
 
-import "../type_inference/type_inference_engine.dart"
-    show IncludesTypeParametersNonCovariantly;
-
-import "../type_inference/type_inferrer.dart" show getNamedFormal;
-
 import 'class_hierarchy_builder.dart';
 import 'combined_member_signature.dart';
 
 class ForwardingNode {
-  ClassHierarchyBuilder get hierarchy => _combinedMemberSignature.hierarchy;
-
-  SourceClassBuilder get classBuilder => _combinedMemberSignature.classBuilder;
-
-  // TODO(johnniwinther): Use [_combinedMemberSignature] more directly in
-  // the forwarding node computation.
   final CombinedClassMemberSignature _combinedMemberSignature;
 
-  ClassMember get combinedMemberSignatureResult =>
-      _combinedMemberSignature.canonicalMember;
-
-  /// The index of [combinedMemberSignatureResult] in [_candidates].
-  int get _combinedMemberIndex => _combinedMemberSignature.canonicalMemberIndex;
-
   final ProcedureKind kind;
 
-  /// A list containing the directly implemented and directly inherited
-  /// procedures of the class in question.
-  List<ClassMember> get _candidates => _combinedMemberSignature.members;
-
-  /// The indices of the [_candidates] whose types need to be merged to compute
-  /// the resulting member type.
-  Set<int> get _mergeIndices => _combinedMemberSignature.mutualSubtypeIndices;
-
   ForwardingNode(this._combinedMemberSignature, this.kind);
 
-  Name get name => combinedMemberSignatureResult.name;
-
-  Class get enclosingClass => classBuilder.cls;
-
   /// Finishes handling of this node by propagating covariance and creating
   /// forwarding stubs if necessary.
   Member finalize() => _computeCovarianceFixes();
@@ -93,8 +52,12 @@
   /// they would not be checked in an inherited implementation, a forwarding
   /// stub is introduced as a place to put the checks.
   Member _computeCovarianceFixes() {
-    Member interfaceMember = combinedMemberSignatureResult.getMember(hierarchy);
-    if (_candidates.length == 1) {
+    SourceClassBuilder classBuilder = _combinedMemberSignature.classBuilder;
+    ClassMember canonicalMember = _combinedMemberSignature.canonicalMember;
+    Member interfaceMember =
+        canonicalMember.getMember(_combinedMemberSignature.hierarchy);
+
+    if (_combinedMemberSignature.members.length == 1) {
       // Covariance can only come from [interfaceMember] so we never need a
       // forwarding stub.
       if (_combinedMemberSignature.neededLegacyErasure) {
@@ -108,360 +71,54 @@
       }
     }
 
-    List<TypeParameter> interfaceMemberTypeParameters =
-        interfaceMember.function?.typeParameters ?? [];
-
-    List<TypeParameter> stubTypeParameters;
-    if (interfaceMember.enclosingClass != enclosingClass &&
-        interfaceMemberTypeParameters.isNotEmpty) {
-      // Create type parameters for the stub up front. These are needed to
-      // ensure the [substitutions] are alpha renamed to the same type
-      // parameters.
-      stubTypeParameters = new List<TypeParameter>.filled(
-          interfaceMemberTypeParameters.length, null);
-      for (int i = 0; i < interfaceMemberTypeParameters.length; i++) {
-        TypeParameter targetTypeParameter = interfaceMemberTypeParameters[i];
-        TypeParameter typeParameter = new TypeParameter(
-            targetTypeParameter.name, null)
-          ..isGenericCovariantImpl = targetTypeParameter.isGenericCovariantImpl;
-        stubTypeParameters[i] = typeParameter;
-      }
-    }
-
-    List<Substitution> substitutions =
-        new List<Substitution>(_candidates.length);
-    Substitution substitution;
-    for (int j = 0; j < _candidates.length; j++) {
-      Member otherMember = getCandidateAt(j);
-      substitutions[j] =
-          _substitutionFor(stubTypeParameters, otherMember, enclosingClass);
-      if (otherMember == interfaceMember) {
-        substitution = substitutions[j];
-      }
-    }
-    // We always create a forwarding stub when we've inherited a member from an
-    // interface other than the first override candidate.  This is to work
-    // around a bug in the Kernel type checker where it chooses the first
-    // override candidate.
-    //
-    // TODO(kmillikin): Fix the Kernel type checker and stop creating these
-    // extra stubs.
-    Member stub = interfaceMember.enclosingClass == enclosingClass ||
-            interfaceMember == getCandidateAt(0)
-        ? interfaceMember
-        : _createForwardingStub(
-            stubTypeParameters, substitution, interfaceMember);
-
-    FunctionNode interfaceFunction = interfaceMember.function;
-    List<VariableDeclaration> interfacePositionalParameters =
-        getPositionalParameters(interfaceMember);
-    List<VariableDeclaration> interfaceNamedParameters =
-        interfaceFunction?.namedParameters ?? [];
-    List<TypeParameter> interfaceTypeParameters =
-        interfaceFunction?.typeParameters ?? [];
-
-    void createStubIfNeeded({bool forMemberSignature: false}) {
-      if (stub != interfaceMember) {
-        Procedure procedure = stub;
-        if (forMemberSignature) {
-          procedure.isMemberSignature = true;
-          procedure.memberSignatureOrigin =
+    bool cannotReuseExistingMember =
+        !(_combinedMemberSignature.isCanonicalMemberFirst ||
+            _combinedMemberSignature.isCanonicalMemberDeclared);
+    bool needsTypeOrCovarianceUpdate =
+        _combinedMemberSignature.neededNnbdTopMerge ||
+            _combinedMemberSignature.neededLegacyErasure ||
+            _combinedMemberSignature.needsCovarianceMerging;
+    bool stubNeeded = cannotReuseExistingMember ||
+        (canonicalMember.classBuilder != classBuilder &&
+            needsTypeOrCovarianceUpdate);
+    if (stubNeeded) {
+      Procedure stub = _combinedMemberSignature.createMemberFromSignature(
+          copyLocation: false);
+      if (_combinedMemberSignature.needsCovarianceMerging ||
+          _combinedMemberSignature.needsSuperImpl) {
+        // This is a forward stub.
+        Member finalTarget;
+        if (interfaceMember is Procedure && interfaceMember.isForwardingStub) {
+          finalTarget = interfaceMember.forwardingStubInterfaceTarget;
+        } else {
+          finalTarget =
               interfaceMember.memberSignatureOrigin ?? interfaceMember;
-        } else {
-          procedure.isForwardingStub = true;
         }
-        return;
+        stub.isMemberSignature = false;
+        stub.memberSignatureOrigin = null;
+        stub.isForwardingStub = true;
+        stub.forwardingStubInterfaceTarget = finalTarget;
+        if (_combinedMemberSignature.needsSuperImpl) {
+          _createForwardingImplIfNeeded(
+              stub.function, stub.name, classBuilder.cls);
+        }
       }
-      if (interfaceMember.enclosingClass == enclosingClass) return;
-      stub = _createForwardingStub(
-          stubTypeParameters, substitution, interfaceMember,
-          memberSignatureTarget: forMemberSignature
-              ? interfaceMember.memberSignatureOrigin ?? interfaceMember
-              : null);
+      return stub;
+    } else {
+      if (_combinedMemberSignature.needsCovarianceMerging) {
+        _combinedMemberSignature.combinedMemberSignatureCovariance
+            .applyCovariance(interfaceMember);
+      }
+      if (_combinedMemberSignature.needsSuperImpl) {
+        _createForwardingImplIfNeeded(
+            interfaceMember.function, interfaceMember.name, classBuilder.cls);
+      }
+      return interfaceMember;
     }
-
-    bool isImplCreated = false;
-    void createImplIfNeeded() {
-      if (isImplCreated) return;
-      createStubIfNeeded();
-      _createForwardingImplIfNeeded(stub.function);
-      isImplCreated = true;
-    }
-
-    IncludesTypeParametersNonCovariantly needsCheckVisitor =
-        enclosingClass.typeParameters.isEmpty
-            ? null
-            // TODO(ahe): It may be necessary to cache this object.
-            : new IncludesTypeParametersNonCovariantly(
-                enclosingClass.typeParameters,
-                // We are checking the parameter types and these are in a
-                // contravariant position.
-                initialVariance: Variance.contravariant);
-    bool needsCheck(DartType type) => needsCheckVisitor == null
-        ? false
-        : substitution.substituteType(type).accept(needsCheckVisitor);
-    bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
-
-    DartType initialType(int candidateIndex, DartType a) {
-      if (isNonNullableByDefault) {
-        if (_mergeIndices != null && _mergeIndices.contains(candidateIndex)) {
-          return norm(hierarchy.coreTypes, a);
-        } else {
-          return a;
-        }
-      } else {
-        return legacyErasure(hierarchy.coreTypes, a);
-      }
-    }
-
-    DartType mergeTypes(int index, DartType a, DartType b) {
-      if (a == null) return null;
-      if (isNonNullableByDefault &&
-          _mergeIndices != null &&
-          _mergeIndices.contains(index)) {
-        return nnbdTopMerge(
-            hierarchy.coreTypes, a, norm(hierarchy.coreTypes, b));
-      } else {
-        return a;
-      }
-    }
-
-    for (int parameterIndex = 0;
-        parameterIndex < interfacePositionalParameters.length;
-        parameterIndex++) {
-      VariableDeclaration parameter =
-          interfacePositionalParameters[parameterIndex];
-      DartType parameterType = substitution.substituteType(parameter.type);
-      DartType type = initialType(_combinedMemberIndex, parameterType);
-      if (parameterIndex == 0 &&
-          hierarchy
-              .coreTypes.objectClass.enclosingLibrary.isNonNullableByDefault &&
-          !classBuilder.library.isNonNullableByDefault &&
-          interfaceMember == hierarchy.coreTypes.objectEquals) {
-        // In legacy code we special case `Object.==` to infer `dynamic`
-        // instead `Object!`.
-        type = const DynamicType();
-      }
-      bool isGenericCovariantImpl =
-          parameter.isGenericCovariantImpl || needsCheck(parameter.type);
-      bool isCovariant = parameter.isCovariant;
-      VariableDeclaration superParameter = parameter;
-      for (int candidateIndex = 0;
-          candidateIndex < _candidates.length;
-          candidateIndex++) {
-        Member otherMember = getCandidateAt(candidateIndex);
-        List<VariableDeclaration> otherPositionalParameters =
-            getPositionalParameters(otherMember);
-        if (otherPositionalParameters.length <= parameterIndex) continue;
-        VariableDeclaration otherParameter =
-            otherPositionalParameters[parameterIndex];
-        if (candidateIndex == 0) superParameter = otherParameter;
-        if (identical(otherMember, interfaceMember)) continue;
-        if (otherParameter.isGenericCovariantImpl) {
-          isGenericCovariantImpl = true;
-        }
-        if (otherParameter.isCovariant) {
-          isCovariant = true;
-        }
-        DartType candidateType =
-            substitutions[candidateIndex].substituteType(otherParameter.type);
-        if (parameterIndex == 0 &&
-            hierarchy.coreTypes.objectClass.enclosingLibrary
-                .isNonNullableByDefault &&
-            !classBuilder.library.isNonNullableByDefault &&
-            otherMember == hierarchy.coreTypes.objectEquals) {
-          // In legacy code we special case `Object.==` to infer `dynamic`
-          // instead `Object!`.
-          candidateType = const DynamicType();
-        }
-
-        type = mergeTypes(candidateIndex, type, candidateType);
-      }
-      if (isGenericCovariantImpl) {
-        if (!superParameter.isGenericCovariantImpl) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isGenericCovariantImpl) {
-          createStubIfNeeded();
-          stub.function.positionalParameters[parameterIndex]
-              .isGenericCovariantImpl = true;
-        }
-      }
-      if (isCovariant) {
-        if (!superParameter.isCovariant) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isCovariant) {
-          createStubIfNeeded();
-          stub.function.positionalParameters[parameterIndex].isCovariant = true;
-        }
-      }
-      if (type != null && type != parameterType) {
-        // TODO(johnniwinther): Report an error when [type] is null; this
-        // means that nnbd-top-merge was not defined.
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.positionalParameters[parameterIndex].type = type;
-      }
-    }
-    for (int parameterIndex = 0;
-        parameterIndex < interfaceNamedParameters.length;
-        parameterIndex++) {
-      VariableDeclaration parameter = interfaceNamedParameters[parameterIndex];
-      DartType parameterType = substitution.substituteType(parameter.type);
-      DartType type = initialType(_combinedMemberIndex, parameterType);
-      bool isGenericCovariantImpl =
-          parameter.isGenericCovariantImpl || needsCheck(parameter.type);
-      bool isCovariant = parameter.isCovariant;
-      VariableDeclaration superParameter = parameter;
-      for (int candidateIndex = 0;
-          candidateIndex < _candidates.length;
-          candidateIndex++) {
-        Member otherMember = getCandidateAt(candidateIndex);
-        if (otherMember is ForwardingNode) continue;
-        VariableDeclaration otherParameter =
-            getNamedFormal(otherMember.function, parameter.name);
-        if (otherParameter == null) continue;
-        if (candidateIndex == 0) superParameter = otherParameter;
-        if (identical(otherMember, interfaceMember)) continue;
-        if (otherParameter.isGenericCovariantImpl) {
-          isGenericCovariantImpl = true;
-        }
-        if (otherParameter.isCovariant) {
-          isCovariant = true;
-        }
-        type = mergeTypes(candidateIndex, type,
-            substitutions[candidateIndex].substituteType(otherParameter.type));
-      }
-      if (isGenericCovariantImpl) {
-        if (!superParameter.isGenericCovariantImpl) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isGenericCovariantImpl) {
-          createStubIfNeeded();
-          stub.function.namedParameters[parameterIndex].isGenericCovariantImpl =
-              true;
-        }
-      }
-      if (isCovariant) {
-        if (!superParameter.isCovariant) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isCovariant) {
-          createStubIfNeeded();
-          stub.function.namedParameters[parameterIndex].isCovariant = true;
-        }
-      }
-      if (type != null && type != parameterType) {
-        // TODO(johnniwinther): Report an error when [type] is null; this
-        // means that nnbd-top-merge was not defined.
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.namedParameters[parameterIndex].type = type;
-      }
-    }
-    for (int parameterIndex = 0;
-        parameterIndex < interfaceTypeParameters.length;
-        parameterIndex++) {
-      TypeParameter typeParameter = interfaceTypeParameters[parameterIndex];
-      DartType parameterBound =
-          substitution.substituteType(typeParameter.bound);
-      DartType bound = initialType(_combinedMemberIndex, parameterBound);
-      DartType parameterDefaultType =
-          substitution.substituteType(typeParameter.defaultType);
-      DartType defaultType =
-          initialType(_combinedMemberIndex, parameterDefaultType);
-      bool isGenericCovariantImpl =
-          typeParameter.isGenericCovariantImpl || needsCheck(parameterBound);
-      TypeParameter superTypeParameter = typeParameter;
-      for (int candidateIndex = 0;
-          candidateIndex < _candidates.length;
-          candidateIndex++) {
-        Member otherMember = getCandidateAt(candidateIndex);
-        if (otherMember is ForwardingNode) continue;
-        List<TypeParameter> otherTypeParameters =
-            otherMember.function.typeParameters;
-        if (otherTypeParameters.length <= parameterIndex) continue;
-        TypeParameter otherTypeParameter = otherTypeParameters[parameterIndex];
-        if (candidateIndex == 0) superTypeParameter = otherTypeParameter;
-        if (identical(otherMember, interfaceMember)) continue;
-        if (otherTypeParameter.isGenericCovariantImpl) {
-          isGenericCovariantImpl = true;
-        }
-      }
-      if (isGenericCovariantImpl) {
-        if (!superTypeParameter.isGenericCovariantImpl) {
-          createImplIfNeeded();
-        }
-        if (!typeParameter.isGenericCovariantImpl) {
-          createStubIfNeeded();
-          stub.function.typeParameters[parameterIndex].isGenericCovariantImpl =
-              true;
-        }
-      }
-      if (bound != null && bound != parameterBound) {
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.typeParameters[parameterIndex].bound = bound;
-      }
-      if (defaultType != null && defaultType != parameterDefaultType) {
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.typeParameters[parameterIndex].defaultType = defaultType;
-      }
-    }
-    DartType returnType =
-        substitution.substituteType(getReturnType(interfaceMember));
-    DartType type = initialType(_combinedMemberIndex, returnType);
-    for (int candidateIndex = 0;
-        candidateIndex < _candidates.length;
-        candidateIndex++) {
-      Member otherMember = getCandidateAt(candidateIndex);
-      type = mergeTypes(
-          candidateIndex,
-          type,
-          substitutions[candidateIndex]
-              .substituteType(getReturnType(otherMember)));
-    }
-    if (type != null && type != returnType) {
-      // TODO(johnniwinther): Report an error when [type] is null; this
-      // means that nnbd-top-merge was not defined.
-      createStubIfNeeded(forMemberSignature: true);
-      stub.function.returnType = type;
-    }
-    assert(
-        !(stub is Procedure &&
-            (stub as Procedure).isMemberSignature &&
-            stub.memberSignatureOrigin == null),
-        "No member signature origin for member signature $stub.");
-    if (stub != interfaceMember && stub is Procedure) {
-      Procedure procedure = stub;
-      if (procedure.isForwardingStub || procedure.isForwardingSemiStub) {
-        procedure.isMemberSignature = false;
-        procedure.memberSignatureOrigin = null;
-      } else {
-        procedure.forwardingStubInterfaceTarget = null;
-        procedure.forwardingStubSuperTarget = null;
-      }
-      assert(
-          !(procedure.isMemberSignature && procedure.isForwardingStub),
-          "Procedure is both member signature and forwarding stub: "
-          "$procedure.");
-      assert(
-          !(procedure.isMemberSignature && procedure.isForwardingSemiStub),
-          "Procedure is both member signature and forwarding semi stub: "
-          "$procedure.");
-      assert(
-          !(procedure.forwardingStubInterfaceTarget is Procedure &&
-              (procedure.forwardingStubInterfaceTarget as Procedure)
-                  .isMemberSignature),
-          "Forwarding stub interface target is member signature: $procedure.");
-      assert(
-          !(procedure.forwardingStubSuperTarget is Procedure &&
-              (procedure.forwardingStubSuperTarget as Procedure)
-                  .isMemberSignature),
-          "Forwarding stub super target is member signature: $procedure.");
-    }
-    return stub;
   }
 
-  void _createForwardingImplIfNeeded(FunctionNode function) {
+  void _createForwardingImplIfNeeded(
+      FunctionNode function, Name name, Class enclosingClass) {
     if (function.body != null) {
       // There is already an implementation; nothing further needs to be done.
       return;
@@ -472,8 +129,9 @@
     Class superclass = enclosingClass.superclass;
     if (superclass == null) return;
     Procedure procedure = function.parent;
-    Member superTarget = hierarchy.getDispatchTargetKernel(
-        superclass, procedure.name, kind == ProcedureKind.Setter);
+    Member superTarget = _combinedMemberSignature.hierarchy
+        .getDispatchTargetKernel(
+            superclass, procedure.name, kind == ProcedureKind.Setter);
     if (superTarget == null) return;
     if (superTarget is Procedure && superTarget.isForwardingStub) {
       Procedure superProcedure = superTarget;
@@ -524,144 +182,4 @@
     procedure.transformerFlags |= TransformerFlag.superCalls;
     procedure.forwardingStubSuperTarget = superTarget;
   }
-
-  /// Creates a forwarding stub based on the given [target].
-  Procedure _createForwardingStub(List<TypeParameter> typeParameters,
-      Substitution substitution, Member target,
-      {Member memberSignatureTarget}) {
-    VariableDeclaration copyParameter(VariableDeclaration parameter) {
-      return new VariableDeclaration(parameter.name,
-          type: substitution.substituteType(parameter.type),
-          isCovariant: parameter.isCovariant)
-        ..isGenericCovariantImpl = parameter.isGenericCovariantImpl;
-    }
-
-    List<TypeParameter> targetTypeParameters =
-        target.function?.typeParameters ?? [];
-    if (typeParameters != null) {
-      Map<TypeParameter, DartType> additionalSubstitution =
-          <TypeParameter, DartType>{};
-      for (int i = 0; i < targetTypeParameters.length; i++) {
-        TypeParameter targetTypeParameter = targetTypeParameters[i];
-        additionalSubstitution[targetTypeParameter] =
-            new TypeParameterType.forAlphaRenaming(
-                targetTypeParameter, typeParameters[i]);
-      }
-      substitution = Substitution.combine(
-          substitution, Substitution.fromMap(additionalSubstitution));
-      for (int i = 0; i < typeParameters.length; i++) {
-        typeParameters[i].bound =
-            substitution.substituteType(targetTypeParameters[i].bound);
-        typeParameters[i].defaultType =
-            substitution.substituteType(targetTypeParameters[i].defaultType);
-      }
-    }
-    List<VariableDeclaration> positionalParameters =
-        getPositionalParameters(target).map(copyParameter).toList();
-    List<VariableDeclaration> namedParameters =
-        target.function?.namedParameters?.map(copyParameter)?.toList() ?? [];
-    FunctionNode function = new FunctionNode(null,
-        positionalParameters: positionalParameters,
-        namedParameters: namedParameters,
-        typeParameters: typeParameters,
-        requiredParameterCount: getRequiredParameterCount(target),
-        returnType: substitution.substituteType(getReturnType(target)));
-    Member finalTarget;
-    if (target is Procedure && target.isForwardingStub) {
-      finalTarget = target.forwardingStubInterfaceTarget;
-    } else {
-      finalTarget = target.memberSignatureOrigin ?? target;
-    }
-    Procedure referenceFrom;
-    if (classBuilder.referencesFromIndexed != null) {
-      if (kind == ProcedureKind.Setter) {
-        referenceFrom =
-            classBuilder.referencesFromIndexed.lookupProcedureSetter(name.text);
-      } else {
-        referenceFrom = classBuilder.referencesFromIndexed
-            .lookupProcedureNotSetter(name.text);
-      }
-    }
-    return new Procedure(name, kind, function,
-        isAbstract: true,
-        isForwardingStub: memberSignatureTarget == null,
-        isMemberSignature: memberSignatureTarget != null,
-        fileUri: enclosingClass.fileUri,
-        forwardingStubInterfaceTarget: finalTarget,
-        reference: referenceFrom?.reference,
-        memberSignatureOrigin: memberSignatureTarget)
-      ..startFileOffset = enclosingClass.fileOffset
-      ..fileOffset = enclosingClass.fileOffset
-      ..parent = enclosingClass
-      ..isNonNullableByDefault =
-          enclosingClass.enclosingLibrary.isNonNullableByDefault;
-  }
-
-  /// Returns the [i]th element of [_candidates], finalizing it if necessary.
-  Member getCandidateAt(int i) {
-    ClassMember candidate = _candidates[i];
-    return candidate.getMember(hierarchy);
-  }
-
-  Substitution _substitutionFor(
-      List<TypeParameter> stubTypeParameters, Member candidate, Class class_) {
-    Substitution substitution = Substitution.fromInterfaceType(
-        hierarchy.getTypeAsInstanceOf(
-            hierarchy.coreTypes
-                .thisInterfaceType(class_, class_.enclosingLibrary.nonNullable),
-            candidate.enclosingClass,
-            class_.enclosingLibrary,
-            hierarchy.coreTypes));
-    if (stubTypeParameters != null) {
-      // If the stub is generic ensure that type parameters are alpha renamed
-      // to the [stubTypeParameters].
-      Map<TypeParameter, TypeParameterType> map = {};
-      for (int i = 0; i < stubTypeParameters.length; i++) {
-        TypeParameter typeParameter = candidate.function.typeParameters[i];
-        map[typeParameter] = new TypeParameterType.forAlphaRenaming(
-            typeParameter, stubTypeParameters[i]);
-      }
-      substitution =
-          Substitution.combine(substitution, Substitution.fromMap(map));
-    }
-    return substitution;
-  }
-
-  List<VariableDeclaration> getPositionalParameters(Member member) {
-    if (member is Field) {
-      if (kind == ProcedureKind.Setter) {
-        return <VariableDeclaration>[
-          new VariableDeclaration("_",
-              type: member.type, isCovariant: member.isCovariant)
-            ..isGenericCovariantImpl = member.isGenericCovariantImpl
-        ];
-      } else {
-        return <VariableDeclaration>[];
-      }
-    } else {
-      return member.function.positionalParameters;
-    }
-  }
-
-  int getRequiredParameterCount(Member member) {
-    switch (kind) {
-      case ProcedureKind.Getter:
-        return 0;
-      case ProcedureKind.Setter:
-        return 1;
-      default:
-        return member.function.requiredParameterCount;
-    }
-  }
-
-  DartType getReturnType(Member member) {
-    switch (kind) {
-      case ProcedureKind.Getter:
-        return member is Field ? member.type : member.function.returnType;
-      case ProcedureKind.Setter:
-        return const VoidType();
-      default:
-        return member.function.returnType;
-    }
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
new file mode 100644
index 0000000..956f0fd
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
@@ -0,0 +1,357 @@
+// Copyright (c) 2018, 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:math';
+
+import 'package:kernel/ast.dart' hide MapEntry;
+
+/// Class that holds the covariant and generic-covariant-impl information for
+/// a member.
+// TODO(johnniwinther): Cache this in ClassMember.
+// TODO(johnniwinther): Maybe compact initial positional masks into a single
+//  int.
+class Covariance {
+  static const int GenericCovariantImpl = 1;
+  static const int Covariant = 2;
+
+  /// Returns the covariance mask for [parameter].
+  static int covarianceFromParameter(VariableDeclaration parameter) =>
+      (parameter.isCovariant ? Covariant : 0) |
+      (parameter.isGenericCovariantImpl ? GenericCovariantImpl : 0);
+
+  /// Returns the covariance mask for [field].
+  static int covarianceFromField(Field field) =>
+      (field.isCovariant ? Covariant : 0) |
+      (field.isGenericCovariantImpl ? GenericCovariantImpl : 0);
+
+  /// Applies the [covariance] mask to [parameter].
+  static void covarianceToParameter(
+      int covariance, VariableDeclaration parameter) {
+    if ((covariance & Covariant) != 0) {
+      parameter.isCovariant = true;
+    }
+    if ((covariance & GenericCovariantImpl) != 0) {
+      parameter.isGenericCovariantImpl = true;
+    }
+  }
+
+  /// Applies the [covariance] mask to parameter.
+  static void covarianceToField(int covariance, Field field) {
+    if ((covariance & Covariant) != 0) {
+      field.isCovariant = true;
+    }
+    if ((covariance & GenericCovariantImpl) != 0) {
+      field.isGenericCovariantImpl = true;
+    }
+  }
+
+  /// The covariance mask for the positional parameters.
+  ///
+  /// If no positional parameters have covariance, this is `null`.
+  final List<int> _positionalParameters;
+
+  /// The covariance mask for the named parameters with name covariance.
+  ///
+  /// If no named parameters have covariance, this is `null`.
+  final Map<String, int> _namedParameters;
+
+  /// The generic-covariant-impl state for the type parameters.
+  ///
+  /// If no type parameters are generic-covariant-impl, this is `null`.
+  final List<bool> _typeParameters;
+
+  const Covariance.internal(
+      this._positionalParameters, this._namedParameters, this._typeParameters);
+
+  /// The empty covariance.
+  ///
+  /// This is used for all members that do not use any covariance, regardless
+  /// of parameter structure.
+  const Covariance.empty() : this.internal(null, null, null);
+
+  /// Computes the covariance for the setter aspect of [field].
+  ///
+  /// The getter aspect of a field never uses covariance.
+  factory Covariance.fromField(Field field) {
+    int covariance = covarianceFromField(field);
+    if (covariance == 0) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(<int>[covariance], null, null);
+  }
+
+  /// Computes the covariance for the [setter].
+  factory Covariance.fromSetter(Procedure setter) {
+    int covariance =
+        covarianceFromParameter(setter.function.positionalParameters.first);
+    if (covariance == 0) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(<int>[covariance], null, null);
+  }
+
+  /// Computes the covariance for the [procedure].
+  factory Covariance.fromMethod(Procedure procedure) {
+    FunctionNode function = procedure.function;
+    List<int> positionalParameters;
+    if (function.positionalParameters.isNotEmpty) {
+      for (int index = 0;
+          index < function.positionalParameters.length;
+          index++) {
+        int covariance =
+            covarianceFromParameter(function.positionalParameters[index]);
+        if (covariance != 0) {
+          positionalParameters ??=
+              new List<int>.filled(function.positionalParameters.length, 0);
+          positionalParameters[index] = covariance;
+        }
+      }
+    }
+    Map<String, int> namedParameters;
+    if (function.namedParameters.isNotEmpty) {
+      for (int index = 0; index < function.namedParameters.length; index++) {
+        VariableDeclaration parameter = function.namedParameters[index];
+        int covariance = covarianceFromParameter(parameter);
+        if (covariance != 0) {
+          namedParameters ??= {};
+          namedParameters[parameter.name] = covariance;
+        }
+      }
+    }
+    List<bool> typeParameters;
+    if (function.typeParameters.isNotEmpty) {
+      for (int index = 0; index < function.typeParameters.length; index++) {
+        if (function.typeParameters[index].isGenericCovariantImpl) {
+          typeParameters ??=
+              new List<bool>.filled(function.typeParameters.length, false);
+          typeParameters[index] = true;
+        }
+      }
+    }
+    if (positionalParameters == null &&
+        namedParameters == null &&
+        typeParameters == null) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(
+        positionalParameters, namedParameters, typeParameters);
+  }
+
+  /// Computes the covariance for [member].
+  ///
+  /// If [forSetter] is `true`, the covariance is computed for the setter
+  /// aspect of [member]. Otherwise, the covariance for the getter/method aspect
+  /// of [member] is computed.
+  factory Covariance.fromMember(Member member, {bool forSetter}) {
+    assert(forSetter != null);
+    if (member is Procedure) {
+      if (member.kind == ProcedureKind.Getter) {
+        return const Covariance.empty();
+      } else if (member.kind == ProcedureKind.Setter) {
+        return new Covariance.fromSetter(member);
+      } else {
+        return new Covariance.fromMethod(member);
+      }
+    } else if (member is Field) {
+      if (forSetter) {
+        return new Covariance.fromField(member);
+      } else {
+        return const Covariance.empty();
+      }
+    } else {
+      throw new UnsupportedError(
+          "Unexpected member $member (${member.runtimeType})");
+    }
+  }
+
+  /// Returns `true` if this is the empty covariance.
+  bool get isEmpty =>
+      _positionalParameters == null &&
+      _namedParameters == null &&
+      _typeParameters == null;
+
+  /// Returns the covariance mask for the [index]th positional parameter.
+  int getPositionalVariance(int index) =>
+      _positionalParameters != null && index < _positionalParameters.length
+          ? _positionalParameters[index]
+          : 0;
+
+  /// Returns the covariance mask for the named parameter with the [name].
+  int getNamedVariance(String name) =>
+      _namedParameters != null ? (_namedParameters[name] ?? 0) : 0;
+
+  /// Returns `true` if the [index]th type parameter is generic-covariant-impl.
+  bool isTypeParameterGenericCovariantImpl(int index) =>
+      _typeParameters != null && index < _typeParameters.length
+          ? _typeParameters[index]
+          : false;
+
+  /// Returns the merge of this covariance with [other] in which parameters are
+  /// covariant if they are covariant in either [this] or [other].
+  Covariance merge(Covariance other) {
+    if (identical(this, other)) return this;
+    List<int> positionalParameters;
+    if (_positionalParameters == null) {
+      positionalParameters = other._positionalParameters;
+    } else if (other._positionalParameters == null) {
+      positionalParameters = _positionalParameters;
+    } else {
+      positionalParameters = new List<int>(max(
+          _positionalParameters.length, other._positionalParameters.length));
+      for (int index = 0; index < positionalParameters.length; index++) {
+        positionalParameters[index] =
+            getPositionalVariance(index) | other.getPositionalVariance(index);
+      }
+    }
+    Map<String, int> namedParameters;
+    if (_namedParameters == null) {
+      namedParameters = other._namedParameters;
+    } else if (other._namedParameters == null) {
+      namedParameters = _namedParameters;
+    } else {
+      namedParameters = {};
+      Set<String> names = {
+        ..._namedParameters.keys,
+        ...other._namedParameters.keys
+      };
+      for (String name in names) {
+        namedParameters[name] =
+            getNamedVariance(name) | other.getNamedVariance(name);
+      }
+    }
+    List<bool> typeParameters;
+    if (_typeParameters == null) {
+      typeParameters = other._typeParameters;
+    } else if (other._typeParameters == null) {
+      typeParameters = _typeParameters;
+    } else {
+      typeParameters = new List<bool>(
+          max(_typeParameters.length, other._typeParameters.length));
+      for (int index = 0; index < typeParameters.length; index++) {
+        typeParameters[index] = isTypeParameterGenericCovariantImpl(index) ||
+            other.isTypeParameterGenericCovariantImpl(index);
+      }
+    }
+    if (positionalParameters == null &&
+        namedParameters == null &&
+        typeParameters == null) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(
+        positionalParameters, namedParameters, typeParameters);
+  }
+
+  /// Update [member] to have the covariant flags set with the covariance in
+  /// [this].
+  ///
+  /// No covariance bits are removed from [member] during this process.
+  void applyCovariance(Member member) {
+    if (isEmpty) return;
+    if (member is Procedure) {
+      FunctionNode function = member.function;
+      if (_positionalParameters != null) {
+        for (int index = 0; index < _positionalParameters.length; index++) {
+          if (index < function.positionalParameters.length) {
+            covarianceToParameter(_positionalParameters[index],
+                function.positionalParameters[index]);
+          }
+        }
+      }
+      if (_namedParameters != null) {
+        for (VariableDeclaration parameter in function.namedParameters) {
+          covarianceToParameter(getNamedVariance(parameter.name), parameter);
+        }
+      }
+      if (_typeParameters != null) {
+        for (int index = 0; index < _typeParameters.length; index++) {
+          if (index < function.typeParameters.length) {
+            if (_typeParameters[index]) {
+              function.typeParameters[index].isGenericCovariantImpl = true;
+            }
+          }
+        }
+      }
+    } else if (member is Field) {
+      if (_positionalParameters != null) {
+        covarianceToField(getPositionalVariance(0), member);
+      }
+    } else {
+      throw new UnsupportedError(
+          "Unexpected member $member (${member.runtimeType})");
+    }
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    if (_positionalParameters != null) {
+      for (int covariance in _positionalParameters) {
+        hash = hash * 13 + covariance.hashCode * 17;
+      }
+    }
+    if (_namedParameters != null) {
+      for (String name in _namedParameters.keys) {
+        hash += name.hashCode * 19 + _namedParameters[name].hashCode * 23;
+      }
+    }
+    if (_typeParameters != null) {
+      for (bool covariance in _typeParameters) {
+        hash = hash * 29 + covariance.hashCode * 31;
+      }
+    }
+    return hash;
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) return true;
+    if (other is Covariance) {
+      if (_positionalParameters != other._positionalParameters) {
+        if (_positionalParameters == null ||
+            other._positionalParameters == null) {
+          return false;
+        }
+        if (_positionalParameters.length !=
+            other._positionalParameters.length) {
+          return false;
+        }
+        for (int i = 0; i < _positionalParameters.length; i++) {
+          if (_positionalParameters[i] != other._positionalParameters[i]) {
+            return false;
+          }
+        }
+      }
+      if (_namedParameters != other._namedParameters) {
+        if (_namedParameters == null || other._namedParameters == null) {
+          return false;
+        }
+        if (_namedParameters.length != other._namedParameters.length) {
+          return false;
+        }
+        for (String name in _namedParameters.keys) {
+          int covariance = _namedParameters[name];
+          int otherCovariance = other._namedParameters[name];
+          if (covariance != otherCovariance) {
+            return false;
+          }
+        }
+      }
+      if (_typeParameters != other._typeParameters) {
+        if (_typeParameters == null || other._typeParameters == null) {
+          return false;
+        }
+        if (_typeParameters.length != other._typeParameters.length) {
+          return false;
+        }
+        for (int i = 0; i < _typeParameters.length; i++) {
+          if (_typeParameters[i] != other._typeParameters[i]) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+}
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 badb39d..de76fc2 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
@@ -674,6 +674,8 @@
                 clsHasUserDefinedNoSuchMethod, member, cls, concreteMembers,
                 isPatch: member.fileUri != member.enclosingClass.fileUri) &&
             !existingForwarders.contains(member)) {
+          assert(!combinedMemberSignature.needsCovarianceMerging,
+              "Needed covariant merging for ${members}");
           if (ClassHierarchy.findMemberByName(declaredMembers, member.name) !=
               null) {
             _transformProcedureToNoSuchMethodForwarder(
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index a0d5c8c..2acc197 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -241,6 +241,7 @@
 corrections
 cosmetic
 counters
+covariances
 cr
 creator
 criterion
@@ -515,6 +516,7 @@
 imply
 implying
 importantly
+imprecise
 inapplicable
 inc
 incomparable
@@ -635,6 +637,7 @@
 manipulation
 markdown
 masking
+masks
 master
 mb
 mc
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
index 8352c73..2f6b693 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
@@ -78,12 +78,12 @@
 class D extends self::A implements self::I {
   synthetic constructor •() → self::D*
     ;
-  abstract forwarding-stub method foo([dynamic a]) → void;
+  abstract member-signature method foo([dynamic a]) → void; -> self::I::foo
 }
 abstract class E extends self::A implements self::I {
   synthetic constructor •() → self::E*
     ;
-  abstract forwarding-stub method foo([dynamic a]) → void;
+  abstract member-signature method foo([dynamic a]) → void; -> self::I::foo
 }
 class F extends self::E {
   synthetic constructor •() → self::F*
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
index 50a2d15..0529482 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
@@ -82,13 +82,13 @@
   synthetic constructor •() → self::D*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 abstract class E extends self::A implements self::I {
   synthetic constructor •() → self::E*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 class F extends self::E {
   synthetic constructor •() → self::F*
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
index 50a2d15..0529482 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
@@ -82,13 +82,13 @@
   synthetic constructor •() → self::D*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 abstract class E extends self::A implements self::I {
   synthetic constructor •() → self::E*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 class F extends self::E {
   synthetic constructor •() → self::F*
diff --git a/pkg/front_end/testcases/general/assert_super.dart.strong.expect b/pkg/front_end/testcases/general/assert_super.dart.strong.expect
deleted file mode 100644
index 59fd8cc..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  synthetic constructor •() → self::Super*
-    : super core::Object::•()
-    ;
-  get property() → core::bool*
-    return true;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class Class extends self::Super {
-  constructor •() → self::Class*
-    : assert(this.{self::Super::property}), super self::Super::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.strong.transformed.expect b/pkg/front_end/testcases/general/assert_super.dart.strong.transformed.expect
deleted file mode 100644
index 59fd8cc..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  synthetic constructor •() → self::Super*
-    : super core::Object::•()
-    ;
-  get property() → core::bool*
-    return true;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class Class extends self::Super {
-  constructor •() → self::Class*
-    : assert(this.{self::Super::property}), super self::Super::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.textual_outline.expect b/pkg/front_end/testcases/general/assert_super.dart.textual_outline.expect
deleted file mode 100644
index c320010..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.textual_outline.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-class Super {
-  bool get property => true;
-}
-
-class Class extends Super {
-  Class() : assert(property);
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/assert_super.dart.textual_outline_modelled.expect
deleted file mode 100644
index aa85ac3..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.textual_outline_modelled.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-class Class extends Super {
-  Class() : assert(property);
-}
-
-class Super {
-  bool get property => true;
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart b/pkg/front_end/testcases/general/covariant_field_override.dart
similarity index 68%
rename from pkg/front_end/testcases/general/assert_super.dart
rename to pkg/front_end/testcases/general/covariant_field_override.dart
index 93a32ef..120fd23 100644
--- a/pkg/front_end/testcases/general/assert_super.dart
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart
@@ -2,12 +2,16 @@
 // 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 Super {
-  bool get property => true;
+class A {
+  num field;
 }
 
-class Class extends Super {
-  Class() : assert(property);
+class B {
+  covariant num field;
+}
+
+class C extends A implements B {
+  num field;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.outline.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.outline.expect
new file mode 100644
index 0000000..d5cf801
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field;
+  synthetic constructor •() → self::A*
+    ;
+  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 core::Object {
+  covariant field core::num* field;
+  synthetic constructor •() → self::B*
+    ;
+  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 C extends self::A implements self::B {
+  covariant field core::num* field;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.strong.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.expect
new file mode 100644
index 0000000..22e490c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field = null;
+  synthetic constructor •() → self::A*
+    : 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 core::Object {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::B*
+    : 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 C extends self::A implements self::B {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.transformed.expect
new file mode 100644
index 0000000..22e490c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field = null;
+  synthetic constructor •() → self::A*
+    : 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 core::Object {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::B*
+    : 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 C extends self::A implements self::B {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline.expect
new file mode 100644
index 0000000..d01b911
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+class A {
+  num field;
+}
+
+class B {
+  covariant num field;
+}
+
+class C extends A implements B {
+  num field;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d01b911
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+class A {
+  num field;
+}
+
+class B {
+  covariant num field;
+}
+
+class C extends A implements B {
+  num field;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart b/pkg/front_end/testcases/general/covariant_type_parameter.dart
new file mode 100644
index 0000000..07f2186
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart
@@ -0,0 +1,19 @@
+// 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<S> {
+  void method<T extends S>(S s) {}
+}
+
+class B<S> {
+  void method<T extends S>(covariant S s) {}
+}
+
+class C<S> extends A<S> implements B<S> {
+  void method<T extends S>(S s);
+}
+
+class D<S> extends A<S> implements B<S> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.outline.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.outline.expect
new file mode 100644
index 0000000..7b6fa81
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.outline.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    ;
+  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    ;
+  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    ;
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    ;
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.expect
new file mode 100644
index 0000000..02336a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..02336a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline.expect
new file mode 100644
index 0000000..c11d77c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class A<S> {
+  void method<T extends S>(S s) {}
+}
+
+class B<S> {
+  void method<T extends S>(covariant S s) {}
+}
+
+class C<S> extends A<S> implements B<S> {
+  void method<T extends S>(S s);
+}
+
+class D<S> extends A<S> implements B<S> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c11d77c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class A<S> {
+  void method<T extends S>(S s) {}
+}
+
+class B<S> {
+  void method<T extends S>(covariant S s) {}
+}
+
+class C<S> extends A<S> implements B<S> {
+  void method<T extends S>(S s);
+}
+
+class D<S> extends A<S> implements B<S> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
index ff689d2..f56ad37 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
@@ -93,12 +93,12 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::A::method
 }
 abstract class D extends core::Object implements self::Interface, self::Interface2 {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
index 85cb4c7..024bfb0 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
@@ -96,13 +96,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::A::method
 }
 abstract class D extends core::Object implements self::Interface, self::Interface2 {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
index 10de15c..ac3f13c 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
@@ -27,12 +27,12 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> iss::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> iss::A::method
 }
 abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
@@ -48,7 +48,7 @@
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(covariant core::num* i, {core::String* s}) → core::String*; -> self::_E&Object&A&D::method
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
index 1bf6467..daad075 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
@@ -27,13 +27,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
@@ -50,7 +50,7 @@
   synthetic constructor •() → self::E*
     : super self::_E&Object&A&D::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E&Object&A&D::method
 }
 static method main() → dynamic {
   core::print(new self::C::•().{self::C::method}(0));
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
index bb83e39..7ea8f01 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -203,7 +203,7 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -214,7 +214,7 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -230,13 +230,13 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -252,7 +252,7 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -273,7 +273,7 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -284,7 +284,7 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -299,7 +299,7 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -319,7 +319,7 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -329,7 +329,7 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -349,7 +349,7 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -374,7 +374,7 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
index f7fe382..5279085 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
@@ -206,7 +206,7 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -217,7 +217,7 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -233,13 +233,13 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -255,7 +255,7 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -276,7 +276,7 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -287,7 +287,7 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -303,7 +303,7 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -324,7 +324,7 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -335,7 +335,7 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -356,7 +356,7 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -382,7 +382,7 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart b/pkg/front_end/testcases/general/nsm_covariance.dart
new file mode 100644
index 0000000..3ee3063
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart
@@ -0,0 +1,21 @@
+// 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 'nsm_covariance_lib.dart';
+
+abstract class D1 implements A<int>, B {}
+
+abstract class D2 implements B, A<int> {}
+
+class D3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class D4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.outline.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.outline.expect
new file mode 100644
index 0000000..b434cfe
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.outline.expect
@@ -0,0 +1,298 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    ;
+  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
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    ;
+  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
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    ;
+  abstract method _method1(core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d) → void;
+  abstract method _method2({core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d}) → void;
+  abstract method _method3(core::int* a, generic-covariant-impl nsm::A::T* b) → void;
+  abstract method _method4({core::int* a, generic-covariant-impl nsm::A::T* b}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    ;
+  abstract method _method1(core::int* x, covariant core::int* y, core::int* z, covariant core::int* w) → void;
+  abstract method _method2({core::int* a, covariant core::int* b, core::int* c, covariant core::int* d}) → void;
+  abstract method _method3(covariant core::int* x, core::int* y) → void;
+  abstract method _method4({covariant core::int* a, core::int* b}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    ;
+  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
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    ;
+  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
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance.dart:12:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#b)
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance.dart:17:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#b)
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance_lib.dart:24:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#b)
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance_lib.dart:29:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#b)
+Extra constant evaluation: evaluated: 212, effectively constant: 76
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.strong.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.expect
new file mode 100644
index 0000000..ee2b26a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.expect
@@ -0,0 +1,247 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    : 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
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    : 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
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+static method main() → dynamic {}
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d) → void;
+  abstract method _method2({core::int* a = #C1, core::int* b = #C1, generic-covariant-impl nsm::A::T* c = #C1, generic-covariant-impl nsm::A::T* d = #C1}) → void;
+  abstract method _method3(core::int* a, generic-covariant-impl nsm::A::T* b) → void;
+  abstract method _method4({core::int* a = #C1, generic-covariant-impl nsm::A::T* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* x, covariant core::int* y, core::int* z, covariant core::int* w) → void;
+  abstract method _method2({core::int* a = #C1, covariant core::int* b = #C1, core::int* c = #C1, covariant core::int* d = #C1}) → void;
+  abstract method _method3(covariant core::int* x, core::int* y) → void;
+  abstract method _method4({covariant core::int* a = #C1, core::int* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    : 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
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    : 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
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+
+constants  {
+  #C1 = null
+  #C2 = core::_Override {}
+  #C3 = #org-dartlang-testcase:///nsm_covariance.dart::_method1
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+  #C7 = #org-dartlang-testcase:///nsm_covariance.dart::_method2
+  #C8 = #a
+  #C9 = #b
+  #C10 = #c
+  #C11 = #d
+  #C12 = #org-dartlang-testcase:///nsm_covariance.dart::_method3
+  #C13 = #org-dartlang-testcase:///nsm_covariance.dart::_method4
+  #C14 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method1
+  #C15 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method2
+  #C16 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method3
+  #C17 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method4
+}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.strong.transformed.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.transformed.expect
new file mode 100644
index 0000000..ee2b26a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.transformed.expect
@@ -0,0 +1,247 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    : 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
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    : 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
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+static method main() → dynamic {}
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d) → void;
+  abstract method _method2({core::int* a = #C1, core::int* b = #C1, generic-covariant-impl nsm::A::T* c = #C1, generic-covariant-impl nsm::A::T* d = #C1}) → void;
+  abstract method _method3(core::int* a, generic-covariant-impl nsm::A::T* b) → void;
+  abstract method _method4({core::int* a = #C1, generic-covariant-impl nsm::A::T* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* x, covariant core::int* y, core::int* z, covariant core::int* w) → void;
+  abstract method _method2({core::int* a = #C1, covariant core::int* b = #C1, core::int* c = #C1, covariant core::int* d = #C1}) → void;
+  abstract method _method3(covariant core::int* x, core::int* y) → void;
+  abstract method _method4({covariant core::int* a = #C1, core::int* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    : 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
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    : 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
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  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 get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+
+constants  {
+  #C1 = null
+  #C2 = core::_Override {}
+  #C3 = #org-dartlang-testcase:///nsm_covariance.dart::_method1
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+  #C7 = #org-dartlang-testcase:///nsm_covariance.dart::_method2
+  #C8 = #a
+  #C9 = #b
+  #C10 = #c
+  #C11 = #d
+  #C12 = #org-dartlang-testcase:///nsm_covariance.dart::_method3
+  #C13 = #org-dartlang-testcase:///nsm_covariance.dart::_method4
+  #C14 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method1
+  #C15 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method2
+  #C16 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method3
+  #C17 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method4
+}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline.expect
new file mode 100644
index 0000000..9419fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+import 'nsm_covariance_lib.dart';
+
+abstract class D1 implements A<int>, B {}
+
+abstract class D2 implements B, A<int> {}
+
+class D3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class D4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9419fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline_modelled.expect
@@ -0,0 +1,17 @@
+import 'nsm_covariance_lib.dart';
+
+abstract class D1 implements A<int>, B {}
+
+abstract class D2 implements B, A<int> {}
+
+class D3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class D4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nsm_covariance_lib.dart b/pkg/front_end/testcases/general/nsm_covariance_lib.dart
new file mode 100644
index 0000000..1afd545
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance_lib.dart
@@ -0,0 +1,31 @@
+// 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.
+
+abstract class A<T> {
+  void _method1(int a, int b, T c, T d);
+  void _method2({int a, int b, T c, T d});
+  void _method3(int a, T b);
+  void _method4({int a, T b});
+}
+
+abstract class B {
+  void _method1(int x, covariant int y, int z, covariant int w);
+  void _method2({int a, covariant int b, int c, covariant int d});
+  void _method3(covariant int x, int y);
+  void _method4({covariant int a, int b});
+}
+
+abstract class C1 implements A<int>, B {}
+
+abstract class C2 implements B, A<int> {}
+
+class C3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class C4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
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 c4a5102..b870822 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
@@ -154,8 +154,8 @@
   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*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
 }
 abstract class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -186,8 +186,8 @@
   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*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
   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
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 81942f2..1eaabf2 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
@@ -158,8 +158,8 @@
   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*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
 }
 abstract class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -192,8 +192,8 @@
   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*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
   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
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 81942f2..1eaabf2 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
@@ -158,8 +158,8 @@
   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*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
 }
 abstract class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -192,8 +192,8 @@
   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*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
   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
diff --git a/pkg/front_end/testcases/general/assert_super.dart b/pkg/front_end/testcases/general/super_access_in_initializer.dart
similarity index 63%
copy from pkg/front_end/testcases/general/assert_super.dart
copy to pkg/front_end/testcases/general/super_access_in_initializer.dart
index 93a32ef..2bab9f4 100644
--- a/pkg/front_end/testcases/general/assert_super.dart
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart
@@ -4,10 +4,19 @@
 
 class Super {
   bool get property => true;
+
+  Super(bool value);
 }
 
 class Class extends Super {
-  Class() : assert(property);
+  bool field;
+
+  Class(bool value)
+      : assert(property),
+        this.field = property,
+        super(property);
+
+  Class.redirect() : this(property);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.outline.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.outline.expect
similarity index 87%
rename from pkg/front_end/testcases/general/assert_super.dart.outline.expect
rename to pkg/front_end/testcases/general/super_access_in_initializer.dart.outline.expect
index 309b5d0..3b22099 100644
--- a/pkg/front_end/testcases/general/assert_super.dart.outline.expect
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Super extends core::Object {
-  synthetic constructor •() → self::Super*
+  constructor •(core::bool* value) → self::Super*
     ;
   get property() → core::bool*
     ;
@@ -19,7 +19,10 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class extends self::Super {
-  constructor •() → self::Class*
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    ;
+  constructor redirect() → self::Class*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.expect
new file mode 100644
index 0000000..690c624
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+//       : assert(property),
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+//         this.field = property,
+//                      ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+//         super(property);
+//               ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+//   Class.redirect() : this(property);
+//                           ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor •(core::bool* value) → self::Super*
+    : super core::Object::•()
+    ;
+  get property() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::Super {
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    : assert(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+      : assert(property),
+               ^^^^^^^^" as{TypeError,ForDynamic} core::bool*), self::Class::field = invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+        this.field = property,
+                     ^^^^^^^^" as{TypeError,ForDynamic} core::bool*, super self::Super::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+        super(property);
+              ^^^^^^^^" as{TypeError,ForDynamic} core::bool*)
+    ;
+  constructor redirect() → self::Class*
+    : this self::Class::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+  Class.redirect() : this(property);
+                          ^^^^^^^^" as{TypeError,ForDynamic} core::bool*)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..57f7ead
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+//       : assert(property),
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+//         this.field = property,
+//                      ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+//         super(property);
+//               ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+//   Class.redirect() : this(property);
+//                           ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor •(core::bool* value) → self::Super*
+    : super core::Object::•()
+    ;
+  get property() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::Super {
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    : assert(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+      : assert(property),
+               ^^^^^^^^"), self::Class::field = invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+        this.field = property,
+                     ^^^^^^^^", super self::Super::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+        super(property);
+              ^^^^^^^^")
+    ;
+  constructor redirect() → self::Class*
+    : this self::Class::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+  Class.redirect() : this(property);
+                          ^^^^^^^^")
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline.expect
new file mode 100644
index 0000000..5548e99
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class Super {
+  bool get property => true;
+  Super(bool value);
+}
+
+class Class extends Super {
+  bool field;
+  Class(bool value)
+      : assert(property),
+        this.field = property,
+        super(property);
+  Class.redirect() : this(property);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b009d58
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class Class extends Super {
+  Class(bool value)
+      : assert(property),
+        this.field = property,
+        super(property);
+  Class.redirect() : this(property);
+  bool field;
+}
+
+class Super {
+  Super(bool value);
+  bool get property => true;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect
index b83e3527..c556a30 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect
@@ -47,7 +47,7 @@
 abstract class Foo extends stu::Baz implements stu::Qux {
   synthetic constructor •() → stu::Foo*
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect
index b83e3527..c556a30 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect
@@ -47,7 +47,7 @@
 abstract class Foo extends stu::Baz implements stu::Qux {
   synthetic constructor •() → stu::Foo*
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
index 6895d48..04687de 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -65,7 +65,7 @@
       : super fra::State::•()
       ;
     abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
-    abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* _) → void; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> fra::State::_widget
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
index 0f97f6e..2c5d2fd 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
@@ -65,7 +65,7 @@
     synthetic constructor •() → lib::_Quux&Qux&MyMixin*
       : super lib::Qux::•()
       ;
-    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+    abstract member-signature method hello(covariant lib::FooEntry* entry) → void; -> lib::Baz::hello
   }
   class Quux extends lib::_Quux&Qux&MyMixin {
     synthetic constructor •() → lib::Quux*
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
index 8e8e3ac2..ecde5ba 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
@@ -65,7 +65,7 @@
     synthetic constructor •() → lib::_Quux&Qux&MyMixin*
       : super lib::Qux::•()
       ;
-    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+    abstract member-signature method hello(covariant lib::FooEntry* entry) → void; -> lib::Baz::hello
   }
   class Quux extends lib::_Quux&Qux&MyMixin {
     synthetic constructor •() → lib::Quux*
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
index e5919b6..f0b94c5 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
@@ -35,7 +35,7 @@
 abstract class C extends core::Object implements self::I1, self::I2 {
   synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method f(core::Object* o) → void;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
   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
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
index 1bba772..fa1ffe6 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object* o) → void;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
   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
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
index 1bba772..fa1ffe6 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object* o) → void;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
   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
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
index 9eb5b34..b2a5eac 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
@@ -72,7 +72,7 @@
 abstract class G extends core::Object implements self::D, self::E, self::F {
   synthetic constructor •() → self::G*
     ;
-  abstract forwarding-stub method foo() → self::B*;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
   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
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
index 9b6fa53..8be3350 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
@@ -79,7 +79,7 @@
   synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B*;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
   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
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
index 9b6fa53..8be3350 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
@@ -79,7 +79,7 @@
   synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B*;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
   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
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
index 13c5cf9..b7a7d1d 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
@@ -8,9 +8,9 @@
 class C extends iss::B {
   synthetic constructor •() → self::C
     ;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_#A#x, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_#A#x=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect
index 0a12b0f..05bf5e3 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect
@@ -9,9 +9,9 @@
   synthetic constructor •() → self::C
     : super iss::B::•()
     ;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect
index 0a12b0f..05bf5e3 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect
@@ -9,9 +9,9 @@
   synthetic constructor •() → self::C
     : super iss::B::•()
     ;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect
index 7e60e14..432f8c1 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect
@@ -9,13 +9,13 @@
   synthetic constructor •() → self::C
     : super iss::B::•()
     ;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet() → core::bool
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet() → core::bool
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet(core::bool value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet(core::bool value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect
index 7e60e14..432f8c1 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect
@@ -9,13 +9,13 @@
   synthetic constructor •() → self::C
     : super iss::B::•()
     ;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet() → core::bool
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet() → core::bool
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
-  no-such-method-forwarder get /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet(core::bool value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet(core::bool value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
-  no-such-method-forwarder set /*isNullableByDefault, from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect
index 27f6cc7..9504dc6 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect
@@ -34,7 +34,7 @@
 abstract class D4 extends core::Object implements self::C, self::B {
   synthetic constructor •() → self::D4
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect
index fa99f33..37ff6de 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect
@@ -40,7 +40,7 @@
 abstract class H extends core::Object implements self::D, self::E, self::F, self::C {
   synthetic constructor •() → self::H
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -55,7 +55,7 @@
 abstract class K extends core::Object implements self::I, self::E, self::G {
   synthetic constructor •() → self::K
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
index 7a7cf1a..de61651 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
@@ -10,15 +10,15 @@
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     ;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError}) → asy::Future<self::Divergent::then::R%>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError}) → asy::Future<self::Divergent::then::R%>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#then, 0, core::List::unmodifiable<core::Type*>(<core::Type*>[self::Divergent::then::R%]), core::List::unmodifiable<dynamic>(<dynamic>[onValue]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onError: onError}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent::then::R%>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>;
 }
 static method test() → dynamic async 
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.strong.expect
index 6a41594..e5372a7 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.strong.expect
@@ -26,15 +26,15 @@
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return super.{core::Object::noSuchMethod}(invocation);
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::Divergent::then::R%>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::Divergent::then::R%>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, core::List::unmodifiable<core::Type*>(<core::Type*>[self::Divergent::then::R%]), core::List::unmodifiable<dynamic>(<dynamic>[onValue]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C11: onError}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent::then::R%>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>;
 }
 static method test() → dynamic async {
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.expect
index 6a41594..e5372a7 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.expect
@@ -26,15 +26,15 @@
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return super.{core::Object::noSuchMethod}(invocation);
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::Divergent::then::R%>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::Divergent::then::R%>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, core::List::unmodifiable<core::Type*>(<core::Type*>[self::Divergent::then::R%]), core::List::unmodifiable<dynamic>(<dynamic>[onValue]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C11: onError}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent::then::R%>;
-  no-such-method-forwarder method /*isNullableByDefault, from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>;
 }
 static method test() → dynamic async {
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
index 5e9a2cc..eca66dc 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
@@ -283,9 +283,9 @@
   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;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 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
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
@@ -285,9 +285,9 @@
   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;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
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
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
@@ -285,9 +285,9 @@
   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;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
@@ -285,9 +285,9 @@
   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;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
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
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
@@ -285,9 +285,9 @@
   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;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
index b2ebdd8..2c462af 100644
--- a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
@@ -16,7 +16,7 @@
   synthetic constructor •() → self::_F&B&D
     : super flu::B::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class F extends self::_F&B&D {
   synthetic constructor •() → self::F
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect
index 5a93c679..9ed16b6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect
@@ -34,13 +34,13 @@
   synthetic constructor •() → self::Class4b
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
   synthetic constructor •() → self::Class4c
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
   synthetic constructor •() → self::Class4d
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect
index 0421e5b..0bc6430 100644
--- a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect
@@ -34,13 +34,13 @@
   synthetic constructor •() → self::Class4b
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
   synthetic constructor •() → self::Class4c
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
   synthetic constructor •() → self::Class4d
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
index 0b53eb7..ad3788d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
@@ -14,13 +14,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
 }
 static method main() → void {
   core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect
index a8728ca..0a99e51 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect
@@ -25,7 +25,7 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
   abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -40,7 +40,7 @@
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
 }
 static method main() → void {
   core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
index 51f1ffe..bbc1cb2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
@@ -14,13 +14,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 static method main() → dynamic {
   core::print(new self::C::•().{self::C::method}());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect
index 9306da9..ee21372 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect
@@ -26,7 +26,7 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
   abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -42,7 +42,7 @@
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 static method main() → dynamic {
   core::print(new self::C::•().{self::C::method}());
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect
index 44dc597..9e000b7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect
@@ -44,17 +44,17 @@
     return 0;
   set property4(core::int* value) → void {}
   abstract member-signature get field1() → core::int*; -> mem::Class::field1
-  abstract member-signature set field1(core::int* _) → void; -> mem::Class::field1
+  abstract member-signature set field1(core::int* value) → void; -> mem::Class::field1
   abstract member-signature get field2() → core::int*; -> mem::Class::field2
-  abstract member-signature set field2(core::int* _) → void; -> mem::Class::field2
+  abstract member-signature set field2(core::int* value) → void; -> mem::Class::field2
   abstract member-signature get property1() → core::int*; -> mem::Class::property1
   abstract member-signature set property1(core::int* value) → void; -> mem::Class::property1
   abstract member-signature get property2() → core::int*; -> mem::Class::property2
   abstract member-signature set property2(core::int* value) → void; -> mem::Class::property2
   abstract member-signature get property5() → core::int*; -> mem::Class::property5
-  abstract member-signature set property5(core::int* _) → void; -> mem::Class::property5
+  abstract member-signature set property5(core::int* value) → void; -> mem::Class::property5
   abstract member-signature get property6() → core::int*; -> mem::Class::property6
-  abstract member-signature set property6(core::int* _) → void; -> mem::Class::property6
+  abstract member-signature set property6(core::int* value) → void; -> mem::Class::property6
   abstract member-signature method method1() → core::int*; -> mem::Class::method1
   abstract member-signature method method2() → core::int*; -> mem::Class::method2
   abstract member-signature method method5a(core::int* a, core::int* b) → core::int*; -> mem::Class::method5a
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect
index 44dc597..9e000b7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect
@@ -44,17 +44,17 @@
     return 0;
   set property4(core::int* value) → void {}
   abstract member-signature get field1() → core::int*; -> mem::Class::field1
-  abstract member-signature set field1(core::int* _) → void; -> mem::Class::field1
+  abstract member-signature set field1(core::int* value) → void; -> mem::Class::field1
   abstract member-signature get field2() → core::int*; -> mem::Class::field2
-  abstract member-signature set field2(core::int* _) → void; -> mem::Class::field2
+  abstract member-signature set field2(core::int* value) → void; -> mem::Class::field2
   abstract member-signature get property1() → core::int*; -> mem::Class::property1
   abstract member-signature set property1(core::int* value) → void; -> mem::Class::property1
   abstract member-signature get property2() → core::int*; -> mem::Class::property2
   abstract member-signature set property2(core::int* value) → void; -> mem::Class::property2
   abstract member-signature get property5() → core::int*; -> mem::Class::property5
-  abstract member-signature set property5(core::int* _) → void; -> mem::Class::property5
+  abstract member-signature set property5(core::int* value) → void; -> mem::Class::property5
   abstract member-signature get property6() → core::int*; -> mem::Class::property6
-  abstract member-signature set property6(core::int* _) → void; -> mem::Class::property6
+  abstract member-signature set property6(core::int* value) → void; -> mem::Class::property6
   abstract member-signature method method1() → core::int*; -> mem::Class::method1
   abstract member-signature method method2() → core::int*; -> mem::Class::method2
   abstract member-signature method method5a(core::int* a, core::int* b) → core::int*; -> mem::Class::method5a
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
index 973cfd4..fc797ac 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
@@ -50,13 +50,13 @@
     : super opt::LegacyClass::•()
     ;
   abstract member-signature get field1() → core::int; -> opt::LegacyClass::field1
-  abstract member-signature set field1(core::int _) → void; -> opt::LegacyClass::field1
+  abstract member-signature set field1(core::int value) → void; -> opt::LegacyClass::field1
   abstract member-signature get field2() → core::int?; -> opt::LegacyClass::field2
-  abstract member-signature set field2(core::int? _) → void; -> opt::LegacyClass::field2
+  abstract member-signature set field2(core::int? value) → void; -> opt::LegacyClass::field2
   abstract member-signature get field3() → core::int; -> opt::LegacyClass::field3
-  abstract member-signature set field3(core::int _) → void; -> opt::LegacyClass::field3
+  abstract member-signature set field3(core::int value) → void; -> opt::LegacyClass::field3
   abstract member-signature get field4() → core::int?; -> opt::LegacyClass::field4
-  abstract member-signature set field4(core::int? _) → void; -> opt::LegacyClass::field4
+  abstract member-signature set field4(core::int? value) → void; -> opt::LegacyClass::field4
   abstract member-signature get property1() → core::int; -> opt::LegacyClass::property1
   abstract member-signature set property1(core::int value) → void; -> opt::LegacyClass::property1
   abstract member-signature get property2() → core::int?; -> opt::LegacyClass::property2
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
index 973cfd4..fc797ac 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
@@ -50,13 +50,13 @@
     : super opt::LegacyClass::•()
     ;
   abstract member-signature get field1() → core::int; -> opt::LegacyClass::field1
-  abstract member-signature set field1(core::int _) → void; -> opt::LegacyClass::field1
+  abstract member-signature set field1(core::int value) → void; -> opt::LegacyClass::field1
   abstract member-signature get field2() → core::int?; -> opt::LegacyClass::field2
-  abstract member-signature set field2(core::int? _) → void; -> opt::LegacyClass::field2
+  abstract member-signature set field2(core::int? value) → void; -> opt::LegacyClass::field2
   abstract member-signature get field3() → core::int; -> opt::LegacyClass::field3
-  abstract member-signature set field3(core::int _) → void; -> opt::LegacyClass::field3
+  abstract member-signature set field3(core::int value) → void; -> opt::LegacyClass::field3
   abstract member-signature get field4() → core::int?; -> opt::LegacyClass::field4
-  abstract member-signature set field4(core::int? _) → void; -> opt::LegacyClass::field4
+  abstract member-signature set field4(core::int? value) → void; -> opt::LegacyClass::field4
   abstract member-signature get property1() → core::int; -> opt::LegacyClass::property1
   abstract member-signature set property1(core::int value) → void; -> opt::LegacyClass::property1
   abstract member-signature get property2() → core::int?; -> opt::LegacyClass::property2
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect
index 731c106..bd160a8 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect
@@ -9,7 +9,7 @@
   const synthetic constructor •() → self::_Class&Object&Mixin
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class extends self::_Class&Object&Mixin {
   synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
index 52e8458..561c9cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
@@ -35,7 +35,7 @@
   method noSuchMethod(core::Invocation* invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int* i, {dynamic optional = #C2}) → core::int*;
+  abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
   abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
   abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
@@ -95,7 +95,7 @@
   method noSuchMethod(core::Invocation invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int? i, {dynamic optional = #C2}) → core::int;
+  abstract member-signature method method(core::int? i, {dynamic optional = #C2}) → core::int; -> nsm::C1::method
 }
 abstract class C1 extends core::Object {
   synthetic constructor •() → nsm::C1
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
index 52e8458..561c9cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
   method noSuchMethod(core::Invocation* invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int* i, {dynamic optional = #C2}) → core::int*;
+  abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
   abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
   abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
@@ -95,7 +95,7 @@
   method noSuchMethod(core::Invocation invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int? i, {dynamic optional = #C2}) → core::int;
+  abstract member-signature method method(core::int? i, {dynamic optional = #C2}) → core::int; -> nsm::C1::method
 }
 abstract class C1 extends core::Object {
   synthetic constructor •() → nsm::C1
diff --git a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect
index a7d11cd..e2f0b61 100644
--- a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect
@@ -36,7 +36,7 @@
   method test_default({required core::int? i = #C1}) → void {}
   method test_nondefault({required core::int? i = #C1}) → void {}
   method test_legacy({required core::int? i = #C1}) → void {}
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 static method main() → dynamic {
   new self::A::•().{self::A::test_default}(i: 1);
diff --git a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect
index a7d11cd..e2f0b61 100644
--- a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect
@@ -36,7 +36,7 @@
   method test_default({required core::int? i = #C1}) → void {}
   method test_nondefault({required core::int? i = #C1}) → void {}
   method test_legacy({required core::int? i = #C1}) → void {}
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 static method main() → dynamic {
   new self::A::•().{self::A::test_default}(i: 1);
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
index fd10993..e157b1f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
@@ -26,7 +26,7 @@
   synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
     : super self::_Class&Object&Mixin1::•()
     ;
-  abstract member-signature set field((dynamic) →* core::Type* _) → void; -> mai::Mixin2::field
+  abstract member-signature set field((dynamic) →* core::Type* value) → void; -> mai::Mixin2::field
   abstract member-signature get field() → (dynamic) →* core::Type*; -> mai::Mixin2::field
   abstract member-signature method method1() → (dynamic) →* core::Type*; -> mai::Mixin2::method1
   abstract member-signature method method2((dynamic) →* core::Type* t) → void; -> mai::Mixin2::method2
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
index fd10993..e157b1f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
@@ -26,7 +26,7 @@
   synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
     : super self::_Class&Object&Mixin1::•()
     ;
-  abstract member-signature set field((dynamic) →* core::Type* _) → void; -> mai::Mixin2::field
+  abstract member-signature set field((dynamic) →* core::Type* value) → void; -> mai::Mixin2::field
   abstract member-signature get field() → (dynamic) →* core::Type*; -> mai::Mixin2::field
   abstract member-signature method method1() → (dynamic) →* core::Type*; -> mai::Mixin2::method1
   abstract member-signature method method2((dynamic) →* core::Type* t) → void; -> mai::Mixin2::method2
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
index 290665e..ad6b170 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -62,7 +62,7 @@
     ;
   method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  abstract forwarding-stub method foo(core::int* x, {core::int* y}) → dynamic;
+  abstract member-signature method foo(core::int* x, {core::int* y}) → dynamic; -> self::B::foo
 }
 class D extends core::Object {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index 7e44d2a..32e4786 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -67,7 +67,7 @@
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  abstract member-signature method foo(core::int* x, {core::int* y = #C1}) → dynamic; -> self::B::foo
 }
 class D extends core::Object {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
index 7e44d2a..32e4786 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -67,7 +67,7 @@
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  abstract member-signature method foo(core::int* x, {core::int* y = #C1}) → dynamic; -> self::B::foo
 }
 class D extends core::Object {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
index d0c8058..bbdac51 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
@@ -35,8 +35,8 @@
 class D extends self::C implements self::B<core::num*> {
   synthetic constructor •() → self::D*
     ;
-  forwarding-stub set x(generic-covariant-impl core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
index c2be143..26e36fb 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
index c2be143..26e36fb 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
index f9cfecc..9c97b6c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
@@ -35,8 +35,8 @@
 class D extends self::C implements self::B {
   synthetic constructor •() → self::D*
     ;
-  forwarding-stub set x(covariant core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(covariant core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
index ff585af..92c4e15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(covariant core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
index ff585af..92c4e15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(covariant core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index 8766dd4..d6eb674 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -76,8 +76,8 @@
   synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::int* _) → void
-    return super.{self::B::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::int* value) → void
+    return super.{self::B::x} = value;
   forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index d5d7813..4f7989a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -83,8 +83,8 @@
   synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::int* _) → void
-    return super.{self::B::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::int* value) → void
+    return super.{self::B::x} = value;
   forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
 }
diff --git a/tools/VERSION b/tools/VERSION
index 194d4ab..9b98b0f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 259
+PRERELEASE 260
 PRERELEASE_PATCH 0
\ No newline at end of file