Version 2.12.0-272.0.dev

Merge commit 'e2b62088712bbb64987e8922ea68cfc9b09fc6ac' into 'dev'
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 de71663d..9dcc279 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
@@ -253,10 +253,7 @@
   @override
   bool get isSynthesized {
     Member member = memberBuilder.member;
-    return member is Procedure &&
-        // TODO(johnniwinther): Should this just be `member.isSynthesized`?
-        (member.isMemberSignature ||
-            (member.isForwardingStub && !member.isForwardingSemiStub));
+    return member is Procedure && member.isSynthetic;
   }
 
   @override
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 cbc684d..369ec37 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
@@ -1722,13 +1722,20 @@
       ClassMember mixedInGetable;
       if (tuple.mixedInMember != null &&
           !tuple.mixedInMember.isStatic &&
-          !tuple.mixedInMember.isDuplicate) {
+          !tuple.mixedInMember.isDuplicate &&
+          !tuple.mixedInMember.isSynthesized) {
         /// We treat
         ///
-        ///   class Mixin {
+        ///   opt-in:
+        ///   class Interface {
+        ///     method3() {}
+        ///   }
+        ///   opt-out:
+        ///   class Mixin implements Interface {
         ///     static method1() {}
         ///     method2() {}
         ///     method2() {}
+        ///     /*member-signature*/ method3() {}
         ///   }
         ///   class Class with Mixin {}
         ///
@@ -1737,6 +1744,27 @@
         ///   class Mixin {}
         ///   class Class with Mixin {}
         ///
+        /// Note that skipped synthetic getable 'method3' is still included
+        /// in the implemented getables, but its type will not define the type
+        /// when mixed in. For instance
+        ///
+        ///   opt-in:
+        ///   abstract class Interface {
+        ///     num get getter;
+        ///   }
+        ///   opt-out:
+        ///   abstract class Super {
+        ///     int get getter;
+        ///   }
+        ///   abstract class Mixin implements Interface {
+        ///     /*member-signature*/ num get getter;
+        ///   }
+        ///   abstract class Class extends Super with Mixin {}
+        ///
+        /// Here the type of `Class.getter` should not be defined from the
+        /// synthetic member signature `Mixin.getter` but as a combined member
+        /// signature of `Super.getter` and `Mixin.getter`, resulting in type
+        /// `int` instead of `num`.
         if (definingGetable == null) {
           /// class Mixin {
           ///   method() {}
@@ -1760,13 +1788,15 @@
       ClassMember mixedInSetable;
       if (tuple.mixedInSetter != null &&
           !tuple.mixedInSetter.isStatic &&
-          !tuple.mixedInSetter.isDuplicate) {
+          !tuple.mixedInSetter.isDuplicate &&
+          !tuple.mixedInSetter.isSynthesized) {
         /// We treat
         ///
         ///   class Mixin {
         ///     static set setter1(value) {}
         ///     set setter2(value) {}
         ///     set setter2(value) {}
+        ///     /*member-signature*/ setter3() {}
         ///   }
         ///   class Class with Mixin {}
         ///
@@ -1775,6 +1805,27 @@
         ///   class Mixin {}
         ///   class Class with Mixin {}
         ///
+        /// Note that skipped synthetic setable 'setter3' is still included
+        /// in the implemented setables, but its type will not define the type
+        /// when mixed in. For instance
+        ///
+        ///   opt-in:
+        ///   abstract class Interface {
+        ///     void set setter(int value);
+        ///   }
+        ///   opt-out:
+        ///   abstract class Super {
+        ///     void set setter(num value);
+        ///   }
+        ///   abstract class Mixin implements Interface {
+        ///     /*member-signature*/ num get getter;
+        ///   }
+        ///   abstract class Class extends Super with Mixin {}
+        ///
+        /// Here the type of `Class.setter` should not be defined from the
+        /// synthetic member signature `Mixin.setter` but as a combined member
+        /// signature of `Super.setter` and `Mixin.setter`, resulting in type
+        /// `num` instead of `int`.
         if (definingSetable == null) {
           /// class Mixin {
           ///   set setter(value) {}
@@ -2192,6 +2243,11 @@
             interfaceMember = new SynthesizedInterfaceMember(
                 classBuilder, name, interfaceMembers.toList(),
                 superClassMember: extendedMember,
+                // [definingMember] and [mixedInMember] are always the same
+                // here. Use the latter here and the former below to show the
+                // the member is canonical _because_ its the mixed in member and
+                // it defines the isProperty/forSetter properties _because_ it
+                // is the defining member.
                 canonicalMember: mixedInMember,
                 mixedInMember: mixedInMember,
                 isProperty: definingMember.isProperty,
@@ -2244,6 +2300,7 @@
               registerAbstractMember(interfaceMember);
             }
 
+            assert(!mixedInMember.isSynthesized);
             if (!mixedInMember.isSynthesized) {
               /// Members declared in the mixin must override extended and
               /// implemented members.
@@ -2311,6 +2368,11 @@
             interfaceMember = new SynthesizedInterfaceMember(
                 classBuilder, name, interfaceMembers.toList(),
                 superClassMember: mixedInMember,
+                // [definingMember] and [mixedInMember] are always the same
+                // here. Use the latter here and the former below to show the
+                // the member is canonical _because_ its the mixed in member and
+                // it defines the isProperty/forSetter properties _because_ it
+                // is the defining member.
                 canonicalMember: mixedInMember,
                 mixedInMember: mixedInMember,
                 isProperty: definingMember.isProperty,
@@ -2350,6 +2412,7 @@
               registerInheritedImplements(mixedInMember, {interfaceMember},
                   aliasForTesting: classMember);
             }
+            assert(!mixedInMember.isSynthesized);
             if (!mixedInMember.isSynthesized) {
               /// Members declared in the mixin must override extended and
               /// implemented members.
@@ -2414,6 +2477,11 @@
               interfaceMember = new SynthesizedInterfaceMember(
                   classBuilder, name, interfaceMembers.toList(),
                   superClassMember: extendedMember,
+                  // [definingMember] and [declaredMember] are always the same
+                  // here. Use the latter here and the former below to show the
+                  // the member is canonical _because_ its the declared member
+                  // and it defines the isProperty/forSetter properties
+                  // _because_ it is the defining member.
                   canonicalMember: declaredMember,
                   isProperty: definingMember.isProperty,
                   forSetter: definingMember.forSetter,
diff --git a/pkg/front_end/test/testing_utils.dart b/pkg/front_end/test/testing_utils.dart
index ba228a0..6781673 100644
--- a/pkg/front_end/test/testing_utils.dart
+++ b/pkg/front_end/test/testing_utils.dart
@@ -26,6 +26,11 @@
   ProcessResult result = await Process.run("git", ["ls-files", "."],
       workingDirectory: new Directory.fromUri(uri).absolute.path,
       runInShell: true);
+  if (result.exitCode != 0) {
+    throw "Git returned non-zero error code (${result.exitCode}):\n\n"
+        "stdout: ${result.stdout}\n\n"
+        "stderr: ${result.stderr}";
+  }
   String stdout = result.stdout;
   return stdout
       .split(new RegExp('^', multiLine: true))
diff --git a/pkg/front_end/test/unit_test_suites_impl.dart b/pkg/front_end/test/unit_test_suites_impl.dart
index fde99ac..54af94b 100644
--- a/pkg/front_end/test/unit_test_suites_impl.dart
+++ b/pkg/front_end/test/unit_test_suites_impl.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// @dart = 2.9
+// ignore_for_file: import_of_legacy_library_into_null_safe
 
 import 'dart:async' show Timer;
 import 'dart:convert' show jsonEncode;
@@ -40,16 +40,40 @@
 
 const suiteNamePrefix = "pkg/front_end/test";
 
+int getDefaultThreads() {
+  int numberOfWorkers = 1;
+  if (Platform.numberOfProcessors > 2) {
+    numberOfWorkers = Platform.numberOfProcessors - 1;
+  }
+  return numberOfWorkers;
+}
+
 class Options {
   final String configurationName;
   final bool verbose;
   final bool printFailureLog;
   final Uri outputDirectory;
-  final String testFilter;
+  final String? testFilter;
   final List<String> environmentOptions;
+  final int shardCount;
+  final int shard;
+  final bool skipTestsThatRequireGit;
+  final bool onlyTestsThatRequireGit;
+  final int numberOfWorkers;
 
-  Options(this.configurationName, this.verbose, this.printFailureLog,
-      this.outputDirectory, this.testFilter, this.environmentOptions);
+  Options(
+    this.configurationName,
+    this.verbose,
+    this.printFailureLog,
+    this.outputDirectory,
+    this.testFilter,
+    this.environmentOptions, {
+    required this.shardCount,
+    required this.shard,
+    required this.skipTestsThatRequireGit,
+    required this.onlyTestsThatRequireGit,
+    required this.numberOfWorkers,
+  });
 
   static Options parse(List<String> args) {
     var parser = new ArgParser()
@@ -63,24 +87,83 @@
       ..addFlag("print",
           abbr: "p", help: "print failure logs", defaultsTo: false)
       ..addMultiOption('environment',
-          abbr: 'D', help: "environment options for the test suite");
+          abbr: 'D', help: "environment options for the test suite")
+      ..addOption("tasks",
+          abbr: "j",
+          help: "The number of parallel tasks to run.",
+          defaultsTo: "${getDefaultThreads()}")
+      ..addOption("shards", help: "Number of shards", defaultsTo: "1")
+      ..addOption("shard", help: "Which shard to run", defaultsTo: "1")
+      ..addFlag("skipTestsThatRequireGit",
+          help: "Whether to skip tests that require git to run",
+          defaultsTo: false)
+      ..addFlag("onlyTestsThatRequireGit",
+          help: "Whether to only run tests that require git",
+          defaultsTo: false);
     var parsedArguments = parser.parse(args);
     String outputPath = parsedArguments["output-directory"] ?? ".";
     Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
-    String filter;
+
+    bool verbose = parsedArguments["verbose"];
+
+    String? filter;
     if (parsedArguments.rest.length == 1) {
       filter = parsedArguments.rest.single;
       if (filter.startsWith("$suiteNamePrefix/")) {
         filter = filter.substring(suiteNamePrefix.length + 1);
       }
     }
+    String tasksString = parsedArguments["tasks"];
+    int? tasks = int.tryParse(tasksString);
+    if (tasks == null || tasks < 1) {
+      throw "--tasks (-j) has to be an integer >= 1";
+    }
+
+    String shardsString = parsedArguments["shards"];
+    int? shardCount = int.tryParse(shardsString);
+    if (shardCount == null || shardCount < 1) {
+      throw "--shards has to be an integer >= 1";
+    }
+    String shardString = parsedArguments["shard"];
+    int? shard = int.tryParse(shardString);
+    if (shard == null || shard < 1 || shard > shardCount) {
+      throw "--shard has to be an integer >= 1 (and <= --shards)";
+    }
+    bool skipTestsThatRequireGit = parsedArguments["skipTestsThatRequireGit"];
+    bool onlyTestsThatRequireGit = parsedArguments["onlyTestsThatRequireGit"];
+    if (skipTestsThatRequireGit && onlyTestsThatRequireGit) {
+      throw "Only one of --skipTestsThatRequireGit and "
+          "--onlyTestsThatRequireGit can be provided.";
+    }
+
+    if (verbose) {
+      print("NOTE: Created with options\n  "
+          "${parsedArguments["named-configuration"]},\n  "
+          "${verbose},\n  "
+          "${parsedArguments["print"]},\n  "
+          "${outputDirectory},\n  "
+          "${filter},\n  "
+          "${parsedArguments['environment']},\n  "
+          "shardCount: ${shardCount},\n  "
+          "shard: ${shard - 1 /* make it 0-indexed */},\n  "
+          "onlyTestsThatRequireGit: ${onlyTestsThatRequireGit},\n  "
+          "skipTestsThatRequireGit: ${skipTestsThatRequireGit},\n  "
+          "numberOfWorkers: ${tasks}");
+    }
+
     return Options(
-        parsedArguments["named-configuration"],
-        parsedArguments["verbose"],
-        parsedArguments["print"],
-        outputDirectory,
-        filter,
-        parsedArguments['environment']);
+      parsedArguments["named-configuration"],
+      verbose,
+      parsedArguments["print"],
+      outputDirectory,
+      filter,
+      parsedArguments['environment'],
+      shardCount: shardCount,
+      shard: shard - 1 /* make it 0-indexed */,
+      onlyTestsThatRequireGit: onlyTestsThatRequireGit,
+      skipTestsThatRequireGit: skipTestsThatRequireGit,
+      numberOfWorkers: tasks,
+    );
   }
 }
 
@@ -93,6 +176,7 @@
   final Map<String, Stopwatch> stopwatches = {};
   final String configurationName;
   final Set<String> seenTests = {};
+  bool gotFrameworkError = false;
 
   ResultLogger(this.prefix, this.resultsPort, this.logsPort, this.verbose,
       this.printFailureLog, this.configurationName);
@@ -134,7 +218,7 @@
       "configuration": configurationName,
       "suite": suite,
       "test_name": shortTestName,
-      "time_ms": stopwatches[testName].elapsedMilliseconds,
+      "time_ms": stopwatches[testName]!.elapsedMilliseconds,
       "expected": "Pass",
       "result": matchedExpectations ? "Pass" : "Fail",
       "matches": matchedExpectations,
@@ -211,116 +295,169 @@
     seenTests.add(testName);
     handleTestResult(description, result, prefix, false);
   }
+
+  @override
+  void noticeFrameworkCatchError(error, StackTrace stackTrace) {
+    gotFrameworkError = true;
+  }
 }
 
 class Suite {
-  final String name;
   final CreateContext createContext;
   final String testingRootPath;
-  final String path;
+  final String? path;
   final int shardCount;
-  final int shard;
   final String prefix;
+  final bool requiresGit;
 
-  const Suite(this.name, this.createContext, this.testingRootPath,
-      {this.path, this.shardCount: 1, this.shard: 0, String prefix})
-      : prefix = prefix ?? name;
+  const Suite(
+    this.prefix,
+    this.createContext,
+    this.testingRootPath, {
+    required this.shardCount,
+    this.path,
+    this.requiresGit: false,
+  });
 }
 
 const List<Suite> suites = [
   const Suite(
-      "fasta/expression", expression.createContext, "../../testing.json"),
-  const Suite("fasta/outline", outline.createContext, "../../testing.json"),
+    "fasta/expression",
+    expression.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
   const Suite(
-      "fasta/fast_strong", fast_strong.createContext, "../../testing.json"),
+    "fasta/outline",
+    outline.createContext,
+    "../../testing.json",
+    shardCount: 2,
+  ),
+  // TODO(CFE TEAM): Should the 'fast strong' be run at all?
   const Suite(
-      "fasta/incremental", incremental.createContext, "../../testing.json"),
-  const Suite("fasta/messages", messages.createContext, "../../testing.json"),
-  const Suite("fasta/text_serialization1", text_serialization.createContext,
-      "../../testing.json",
-      path: "fasta/text_serialization_tester.dart",
-      shardCount: 4,
-      shard: 0,
-      prefix: "fasta/text_serialization"),
-  const Suite("fasta/text_serialization2", text_serialization.createContext,
-      "../../testing.json",
-      path: "fasta/text_serialization_tester.dart",
-      shardCount: 4,
-      shard: 1,
-      prefix: "fasta/text_serialization"),
-  const Suite("fasta/text_serialization3", text_serialization.createContext,
-      "../../testing.json",
-      path: "fasta/text_serialization_tester.dart",
-      shardCount: 4,
-      shard: 2,
-      prefix: "fasta/text_serialization"),
-  const Suite("fasta/text_serialization4", text_serialization.createContext,
-      "../../testing.json",
-      path: "fasta/text_serialization_tester.dart",
-      shardCount: 4,
-      shard: 3,
-      prefix: "fasta/text_serialization"),
-  const Suite("fasta/strong1", strong.createContext, "../../testing.json",
-      path: "fasta/strong_tester.dart",
-      shardCount: 4,
-      shard: 0,
-      prefix: "fasta/strong"),
-  const Suite("fasta/strong2", strong.createContext, "../../testing.json",
-      path: "fasta/strong_tester.dart",
-      shardCount: 4,
-      shard: 1,
-      prefix: "fasta/strong"),
-  const Suite("fasta/strong3", strong.createContext, "../../testing.json",
-      path: "fasta/strong_tester.dart",
-      shardCount: 4,
-      shard: 2,
-      prefix: "fasta/strong"),
-  const Suite("fasta/strong4", strong.createContext, "../../testing.json",
-      path: "fasta/strong_tester.dart",
-      shardCount: 4,
-      shard: 3,
-      prefix: "fasta/strong"),
-  const Suite("incremental_bulk_compiler_smoke",
-      incremental_bulk_compiler.createContext, "../testing.json"),
-  const Suite("incremental_load_from_dill", incremental_load.createContext,
-      "../testing.json"),
-  const Suite("lint", lint.createContext, "../testing.json"),
-  const Suite("parser", parser.createContext, "../testing.json"),
-  const Suite("parser_all", parserAll.createContext, "../testing.json"),
-  const Suite("spelling_test_not_src", spelling_not_src.createContext,
-      "../testing.json"),
+    "fasta/fast_strong",
+    fast_strong.createContext,
+    "../../testing.json",
+    shardCount: 4,
+  ),
   const Suite(
-      "spelling_test_src", spelling_src.createContext, "../testing.json"),
-  const Suite("fasta/weak", weak.createContext, "../../testing.json"),
-  const Suite("fasta/textual_outline", textual_outline.createContext,
-      "../../testing.json"),
+    "fasta/incremental",
+    incremental.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/messages",
+    messages.createContext,
+    "../../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "fasta/text_serialization",
+    text_serialization.createContext,
+    "../../testing.json",
+    path: "fasta/text_serialization_tester.dart",
+    shardCount: 10,
+  ),
+  const Suite(
+    "fasta/strong",
+    strong.createContext,
+    "../../testing.json",
+    path: "fasta/strong_tester.dart",
+    shardCount: 10,
+  ),
+  const Suite(
+    "incremental_bulk_compiler_smoke",
+    incremental_bulk_compiler.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "incremental_load_from_dill",
+    incremental_load.createContext,
+    "../testing.json",
+    shardCount: 2,
+  ),
+  const Suite(
+    "lint",
+    lint.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "parser",
+    parser.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "parser_all",
+    parserAll.createContext,
+    "../testing.json",
+    shardCount: 4,
+    requiresGit:
+        true /* technically not true, but tests *many* more files
+         than in test_matrix.json file set */
+    ,
+  ),
+  const Suite(
+    "spelling_test_not_src",
+    spelling_not_src.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "spelling_test_src",
+    spelling_src.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "fasta/weak",
+    weak.createContext,
+    "../../testing.json",
+    shardCount: 2,
+  ),
+  const Suite(
+    "fasta/textual_outline",
+    textual_outline.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
 ];
 
 const Duration timeoutDuration = Duration(minutes: 30);
 
 class SuiteConfiguration {
-  final String name;
+  final Suite suite;
   final SendPort resultsPort;
   final SendPort logsPort;
   final bool verbose;
   final bool printFailureLog;
   final String configurationName;
-  final String testFilter;
+  final String? testFilter;
   final List<String> environmentOptions;
+  final int shard;
 
   const SuiteConfiguration(
-      this.name,
-      this.resultsPort,
-      this.logsPort,
-      this.verbose,
-      this.printFailureLog,
-      this.configurationName,
-      this.testFilter,
-      this.environmentOptions);
+    this.suite,
+    this.resultsPort,
+    this.logsPort,
+    this.verbose,
+    this.printFailureLog,
+    this.configurationName,
+    this.testFilter,
+    this.environmentOptions,
+    this.shard,
+  );
 }
 
-void runSuite(SuiteConfiguration configuration) {
-  Suite suite = suites.where((s) => s.name == configuration.name).single;
+void runSuite(SuiteConfiguration configuration) async {
+  Suite suite = configuration.suite;
   String name = suite.prefix;
   String fullSuiteName = "$suiteNamePrefix/$name";
   Uri suiteUri = Platform.script.resolve(suite.path ?? "${name}_suite.dart");
@@ -334,23 +471,30 @@
       configuration.verbose,
       configuration.printFailureLog,
       configuration.configurationName);
-  runMe(<String>[
-    if (configuration.testFilter != null) configuration.testFilter,
-    if (configuration.environmentOptions != null)
+  await runMe(
+    <String>[
+      if (configuration.testFilter != null) configuration.testFilter!,
       for (String option in configuration.environmentOptions) '-D${option}',
-  ], suite.createContext,
-      me: suiteUri,
-      configurationPath: suite.testingRootPath,
-      logger: logger,
-      shards: suite.shardCount,
-      shard: suite.shard);
+    ],
+    suite.createContext,
+    me: suiteUri,
+    configurationPath: suite.testingRootPath,
+    logger: logger,
+    shards: suite.shardCount,
+    shard: configuration.shard,
+  );
+  if (logger.gotFrameworkError) {
+    throw "Got framework error!";
+  }
 }
 
-void writeLinesToFile(Uri uri, List<String> lines) async {
+Future<void> writeLinesToFile(Uri uri, List<String> lines) async {
   await File.fromUri(uri).writeAsString(lines.map((line) => "$line\n").join());
 }
 
 main([List<String> arguments = const <String>[]]) async {
+  Stopwatch totalRuntime = new Stopwatch()..start();
+
   List<String> results = [];
   List<String> logs = [];
   Options options = Options.parse(arguments);
@@ -359,13 +503,23 @@
   ReceivePort logsPort = new ReceivePort()
     ..listen((logEntry) => logs.add(logEntry));
   List<Future<bool>> futures = [];
+
+  if (options.verbose) {
+    print("NOTE: Willing to run with ${options.numberOfWorkers} 'workers'");
+    print("");
+  }
+
+  int numberOfFreeWorkers = options.numberOfWorkers;
   // Run test suites and record the results and possible failure logs.
+  int chunkNum = 0;
   for (Suite suite in suites) {
-    String name = suite.name;
-    String filter = options.testFilter;
+    if (options.onlyTestsThatRequireGit && !suite.requiresGit) continue;
+    if (options.skipTestsThatRequireGit && suite.requiresGit) continue;
+    String prefix = suite.prefix;
+    String? filter = options.testFilter;
     if (filter != null) {
       // Skip suites that are not hit by the test filter, is there is one.
-      if (!filter.startsWith(suite.prefix)) {
+      if (!filter.startsWith(prefix)) {
         continue;
       }
       // Remove the 'fasta/' from filters, if there, because it is not used
@@ -374,39 +528,63 @@
         filter = filter.substring("fasta/".length);
       }
     }
-    // Start the test suite in a new isolate.
-    ReceivePort exitPort = new ReceivePort();
-    SuiteConfiguration configuration = SuiteConfiguration(
-        name,
-        resultsPort.sendPort,
-        logsPort.sendPort,
-        options.verbose,
-        options.printFailureLog,
-        options.configurationName,
-        filter,
-        options.environmentOptions);
-    Future future = Future<bool>(() async {
-      Stopwatch stopwatch = Stopwatch()..start();
-      print("Running suite $name");
-      Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
-          runSuite, configuration,
-          onExit: exitPort.sendPort);
-      bool timedOut = false;
-      Timer timer = Timer(timeoutDuration, () {
-        timedOut = true;
-        print("Suite $name timed out after "
-            "${timeoutDuration.inMilliseconds}ms");
-        isolate.kill(priority: Isolate.immediate);
-      });
-      await exitPort.first;
-      timer.cancel();
-      if (!timedOut) {
-        int seconds = stopwatch.elapsedMilliseconds ~/ 1000;
-        print("Suite $name finished (took ${seconds} seconds)");
+    for (int shard = 0; shard < suite.shardCount; shard++) {
+      if (chunkNum++ % options.shardCount != options.shard) continue;
+
+      while (numberOfFreeWorkers <= 0) {
+        // This might not be great design, but it'll work fine.
+        await Future.delayed(const Duration(milliseconds: 50));
       }
-      return timedOut;
-    });
-    futures.add(future);
+      numberOfFreeWorkers--;
+      // Start the test suite in a new isolate.
+      ReceivePort exitPort = new ReceivePort();
+      ReceivePort errorPort = new ReceivePort();
+      SuiteConfiguration configuration = new SuiteConfiguration(
+          suite,
+          resultsPort.sendPort,
+          logsPort.sendPort,
+          options.verbose,
+          options.printFailureLog,
+          options.configurationName,
+          filter,
+          options.environmentOptions,
+          shard);
+      Future<bool> future = new Future<bool>(() async {
+        try {
+          Stopwatch stopwatch = new Stopwatch()..start();
+          String naming = "$prefix";
+          if (suite.shardCount > 1) {
+            naming += " (${shard + 1} of ${suite.shardCount})";
+          }
+          print("Running suite $naming");
+          Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
+              runSuite, configuration,
+              onExit: exitPort.sendPort, onError: errorPort.sendPort);
+          bool timedOutOrCrash = false;
+          Timer timer = new Timer(timeoutDuration, () {
+            timedOutOrCrash = true;
+            print("Suite $naming timed out after "
+                "${timeoutDuration.inMilliseconds}ms");
+            isolate.kill(priority: Isolate.immediate);
+          });
+          await exitPort.first;
+          errorPort.close();
+          bool gotError = !await errorPort.isEmpty;
+          if (gotError) {
+            timedOutOrCrash = true;
+          }
+          timer.cancel();
+          if (!timedOutOrCrash) {
+            int seconds = stopwatch.elapsedMilliseconds ~/ 1000;
+            print("Suite $naming finished (took ${seconds} seconds)");
+          }
+          return timedOutOrCrash;
+        } finally {
+          numberOfFreeWorkers++;
+        }
+      });
+      futures.add(future);
+    }
   }
   // Wait for isolates to terminate and clean up.
   Iterable<bool> timeouts = await Future.wait(futures);
@@ -419,6 +597,7 @@
   await writeLinesToFile(logsJsonUri, logs);
   print("Log files written to ${resultJsonUri.toFilePath()} and"
       " ${logsJsonUri.toFilePath()}");
+  print("Entire run took ${totalRuntime.elapsed}.");
   // Return with exit code 1 if at least one suite timed out.
   bool timeout = timeouts.any((timeout) => timeout);
   if (timeout) {
diff --git a/pkg/front_end/test/utils/io_utils.dart b/pkg/front_end/test/utils/io_utils.dart
index 6cd9daa..05be497 100644
--- a/pkg/front_end/test/utils/io_utils.dart
+++ b/pkg/front_end/test/utils/io_utils.dart
@@ -11,7 +11,16 @@
       'git', ['rev-parse', '--show-toplevel'],
       runInShell: true,
       workingDirectory: new File.fromUri(Platform.script).parent.path);
-  return (result.stdout as String).trim();
+  if (result.exitCode != 0) {
+    throw "Git returned non-zero error code (${result.exitCode}):\n\n"
+        "stdout: ${result.stdout}\n\n"
+        "stderr: ${result.stderr}";
+  }
+  String dirPath = (result.stdout as String).trim();
+  if (!new Directory(dirPath).existsSync()) {
+    throw "The path returned by git ($dirPath) does not actually exist.";
+  }
+  return dirPath;
 }
 
 Uri computeRepoDirUri() {
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 525ba41..3aede9c 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
@@ -24,32 +24,22 @@
     ;
   mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
     return super.{iss::A::method}(i, s: s);
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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 class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
   abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::B::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
@@ -59,16 +49,16 @@
   const synthetic constructor •() → self::_E&Object&A*
     : super core::Object::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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
   mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
     return super.{iss::A::method}(i, s: s);
 }
@@ -76,18 +66,8 @@
   const synthetic constructor •() → self::_E&Object&A&D*
     : super self::_E&Object&A::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::D::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::D::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::D::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::D::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::D::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::D::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::D::runtimeType
-  forwarding-stub method method(covariant core::num* i) → core::String*
-    return super.{self::_E&Object&A::method}(i);
+  forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
 }
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
@@ -97,16 +77,16 @@
   const synthetic constructor •() → self::_G&Object&A*
     : super core::Object::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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
   mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
     return super.{iss::A::method}(i, s: s);
 }
@@ -114,16 +94,6 @@
   const synthetic constructor •() → self::_G&Object&A&F*
     : super self::_G&Object&A::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::F::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::F::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::F::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::F::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::F::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::F::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::F::runtimeType
 }
 class G extends self::_G&Object&A&F {
   synthetic constructor •() → self::G*
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 eb41372..7273976 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
@@ -24,32 +24,22 @@
     ;
   mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(i, s: s);
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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 class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
   abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::B::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
@@ -60,16 +50,16 @@
   const synthetic constructor •() → self::_E&Object&A*
     : super core::Object::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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
   mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(i, s: s);
 }
@@ -77,18 +67,8 @@
   const synthetic constructor •() → self::_E&Object&A&D*
     : super self::_E&Object&A::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::D::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::D::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::D::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::D::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::D::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::D::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::D::runtimeType
-  forwarding-stub method method(covariant core::num* i) → core::String*
-    return super.{self::_E&Object&A::method}(i);
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
 }
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
@@ -99,16 +79,16 @@
   const synthetic constructor •() → self::_G&Object&A*
     : super core::Object::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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
   mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(i, s: s);
 }
@@ -116,16 +96,6 @@
   const synthetic constructor •() → self::_G&Object&A&F*
     : super self::_G&Object&A::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::F::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::F::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::F::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::F::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::F::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::F::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::F::runtimeType
 }
 class G extends self::_G&Object&A&F {
   synthetic constructor •() → self::G*
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart
new file mode 100644
index 0000000..08bd4e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart
@@ -0,0 +1,15 @@
+// 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 'issue41210_lib.dart';
+
+class C with A, B {} // error
+
+class E with A, D {} // ok
+
+class G with A, F {} // ok
+
+main() {
+  print(C().method(0));
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.outline.expect
new file mode 100644
index 0000000..cb4f387
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.outline.expect
@@ -0,0 +1,196 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart:7:7: Error: Applying the mixin 'B' to 'Object with A' introduces an erroneous override of 'method'.
+// class C with A, B {} // error
+//       ^
+// pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart:18:10: Context: The method 'B.method' has fewer named arguments than those of overridden method 'Object with A.method'.
+//   String method(num i);
+//          ^
+// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart:7:7: Context: This is the overridden method ('method').
+// class C with A, B {} // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  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 class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    ;
+}
+abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  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 class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    ;
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  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 class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss::Interface*
+    ;
+  abstract method method(core::num* i) → core::String*;
+  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 class Interface2 extends core::Object {
+  synthetic constructor •() → iss::Interface2*
+    ;
+  abstract method method(covariant core::int* i) → core::String*;
+  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 class A extends core::Object implements iss::Interface /*isMixinDeclaration*/  {
+  method method(core::num* i, {core::String* s = "hello"}) → core::String*
+    ;
+  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 class B extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::B*
+    ;
+  abstract method method(core::num* i) → core::String*;
+  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 class D extends core::Object implements iss::Interface, iss::Interface2 {
+  synthetic constructor •() → iss::D*
+    ;
+  abstract forwarding-stub method method(covariant core::num* i) → core::String*;
+  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 class F extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::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
+  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
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.strong.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.strong.expect
new file mode 100644
index 0000000..efd7b7f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.strong.expect
@@ -0,0 +1,209 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart:7:7: Error: Applying the mixin 'B' to 'Object with A' introduces an erroneous override of 'method'.
+// class C with A, B {} // error
+//       ^
+// pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart:18:10: Context: The method 'B.method' has fewer named arguments than those of overridden method 'Object with A.method'.
+//   String method(num i);
+//          ^
+// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart:7:7: Context: This is the overridden method ('method').
+// class C with A, B {} // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  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 class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  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 class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  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 class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A&B::method}(0));
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss::Interface*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  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 class Interface2 extends core::Object {
+  synthetic constructor •() → iss::Interface2*
+    : super core::Object::•()
+    ;
+  abstract method method(covariant core::int* i) → core::String*;
+  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 class A extends core::Object implements iss::Interface /*isMixinDeclaration*/  {
+  method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return s;
+  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 class B extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  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 class D extends core::Object implements iss::Interface, iss::Interface2 {
+  synthetic constructor •() → iss::D*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num* i) → core::String*;
+  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 class F extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::F*
+    : 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
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.textual_outline.expect
new file mode 100644
index 0000000..8c473d0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+import 'issue41210_lib.dart';
+
+class C with A, B {}
+
+class E with A, D {}
+
+class G with A, F {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..8c473d0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+import 'issue41210_lib.dart';
+
+class C with A, B {}
+
+class E with A, D {}
+
+class G with A, F {}
+
+main() {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
index cd92eb8..136a4b6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
@@ -7,16 +7,6 @@
     synthetic constructor •() → main::ABC*
       : super a::AB::•()
       ;
-    abstract mixin-stub get _identityHashCode() → dart.core::int*; -> a::C::_identityHashCode
-    abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> a::C::_instanceOf
-    abstract mixin-stub method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOf
-    abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOfTrue
-    abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOfFalse
-    abstract mixin-stub operator ==(dynamic other) → dart.core::bool*; -> a::C::==
-    abstract mixin-stub get hashCode() → dart.core::int*; -> a::C::hashCode
-    abstract mixin-stub method toString() → dart.core::String*; -> a::C::toString
-    abstract mixin-stub method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> a::C::noSuchMethod
-    abstract mixin-stub get runtimeType() → dart.core::Type*; -> a::C::runtimeType
   }
 }
 library from "package:module/a.dart" as a {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml
index 1f4e0da3..d97a711 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml
@@ -49,7 +49,6 @@
 
   - entry: main.dart
     worldType: updated
-    errors: true
     expectInitializeFromDill: false
     invalidate:
       - main.dart
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml.world.2.expect
index e251ab0..03611f5 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change.yaml.world.2.expect
@@ -50,15 +50,6 @@
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
-//
-// Problems in library:
-//
-// org-dartlang-test:///main.dart:9:36: Error: The getter 'axis' isn't defined for the class 'Constraints'.
-//  - 'Constraints' is from 'package:flutter/object.dart' ('org-dartlang-test:///flutter/object.dart').
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'axis'.
-//     print(renderObject.constraints.axis);
-//                                    ^^^^
-//
 
   import "package:flutter/object.dart";
   import "org-dartlang-test:///lib.dart";
@@ -92,7 +83,7 @@
     get renderObject() → main::Adaptor*
       return super.{obj::RenderObject::renderObject} as{TypeError} main::Adaptor*;
     method foo() → void {
-      dart.core::print(invalid-expression "org-dartlang-test:///main.dart:9:36: Error: The getter 'axis' isn't defined for the class 'Constraints'.\n - 'Constraints' is from 'package:flutter/object.dart' ('org-dartlang-test:///flutter/object.dart').\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'axis'.\n    print(renderObject.constraints.axis);\n                                   ^^^^");
+      dart.core::print(this.{main::AdaptorElement::renderObject}.{main::_Adaptor&RenderFoo&LibMixin::constraints}.{obj::FooConstraints::axis});
     }
     abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
index 7e07afc..7d7406e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -67,13 +67,13 @@
     synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
       : super fra::State::•()
       ;
-    abstract mixin-stub get _widget() → main::HotReloadIssue*; -> aft::AfterLayoutMixin::_widget
-    abstract mixin-stub set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> aft::AfterLayoutMixin::_widget
-    abstract mixin-stub method toString() → dart.core::String*; -> aft::AfterLayoutMixin::toString
-    abstract mixin-stub operator ==(dynamic other) → dart.core::bool*; -> aft::AfterLayoutMixin::==
-    abstract mixin-stub get hashCode() → dart.core::int*; -> aft::AfterLayoutMixin::hashCode
-    abstract mixin-stub method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> aft::AfterLayoutMixin::noSuchMethod
-    abstract mixin-stub get runtimeType() → dart.core::Type*; -> aft::AfterLayoutMixin::runtimeType
+    abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> fra::State::_widget
+    abstract member-signature method toString() → dart.core::String*; -> fra::Diagnosticable::toString
+    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
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
   class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
     synthetic constructor •() → main::_HotReloadIssueState*
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart
new file mode 100644
index 0000000..4f4e957
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, 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.
+
+// @dart=2.9
+
+import 'opt_in_lib1.dart';
+import 'opt_in_lib2.dart';
+import 'opt_out_lib.dart';
+
+class Super {
+  B get getter => new B();
+  void set setter(A a) {}
+}
+
+class Class1 extends Super with Mixin1 {}
+
+class Class2 extends Base with Mixin2 {}
+
+main() {
+  var c = new Class1();
+  c.getter.property;
+  c.setter = new B();
+  testInterface2(new Mixin2());
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.textual_outline.expect
new file mode 100644
index 0000000..f98e8df
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+// @dart = 2.9
+import 'opt_in_lib1.dart';
+import 'opt_in_lib2.dart';
+import 'opt_out_lib.dart';
+
+class Super {
+  B get getter => new B();
+  void set setter(A a) {}
+}
+
+class Class1 extends Super with Mixin1 {}
+
+class Class2 extends Base with Mixin2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..cf495e2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+// @dart = 2.9
+import 'opt_in_lib1.dart';
+import 'opt_in_lib2.dart';
+import 'opt_out_lib.dart';
+
+class Class1 extends Super with Mixin1 {}
+
+class Class2 extends Base with Mixin2 {}
+
+class Super {
+  B get getter => new B();
+  void set setter(A a) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.expect
new file mode 100644
index 0000000..a5e1b1f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.expect
@@ -0,0 +1,202 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+import "opt_out_lib.dart" as opt2;
+import "opt_in_lib2.dart" as opt3;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+import "org-dartlang-testcase:///opt_in_lib2.dart";
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  get getter() → opt::B*
+    return new opt::B::•();
+  set setter(opt::A* a) → 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
+}
+abstract class _Class1&Super&Mixin1 = self::Super with opt2::Mixin1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin1*
+    : super self::Super::•()
+    ;
+}
+class Class1 extends self::_Class1&Super&Mixin1 {
+  synthetic constructor •() → self::Class1*
+    : super self::_Class1&Super&Mixin1::•()
+    ;
+}
+abstract class _Class2&Base&Mixin2 = opt::Base with opt3::Mixin2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class2&Base&Mixin2*
+    : super opt::Base::•()
+    ;
+  abstract member-signature get _privateGetter() → opt::B*; -> opt::Base::_privateGetter
+  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 member-signature set _privateSetter(opt::A* a) → void; -> opt::Base::_privateSetter
+}
+class Class2 extends self::_Class2&Base&Mixin2 {
+  synthetic constructor •() → self::Class2*
+    : super self::_Class2&Base&Mixin2::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class1* c = new self::Class1::•();
+  c.{self::Super::getter}.{opt::B::property};
+  c.{self::Super::setter} = new opt::B::•();
+  opt::testInterface2(new opt3::Mixin2::•());
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:32:8: Error: A catch clause must have a body, even if it is empty.
+// Try adding an empty body.
+//   } on NoSuchMethodError (e) {
+//        ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:34:3: Error: Expected ';' after this.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:38:8: Error: A catch clause must have a body, even if it is empty.
+// Try adding an empty body.
+//   } on NoSuchMethodError (e) {
+//        ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:40:3: Error: Expected ';' after this.
+//   }
+//   ^
+//
+import self as opt;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → opt::A
+    : super core::Object::•()
+    ;
+}
+class B extends opt::A {
+  synthetic constructor •() → opt::B
+    : super opt::A::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+class C extends opt::A {
+  synthetic constructor •() → opt::C
+    : super opt::A::•()
+    ;
+}
+class Base extends core::Object {
+  synthetic constructor •() → opt::Base
+    : super core::Object::•()
+    ;
+  get _privateGetter() → opt::B
+    return new opt::B::•();
+  set _privateSetter(opt::A a) → void {}
+}
+abstract class Interface1 extends core::Object {
+  synthetic constructor •() → opt::Interface1
+    : super core::Object::•()
+    ;
+  abstract get getter() → opt::A;
+  abstract set setter(opt::C c) → void;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → opt::Interface2
+    : super core::Object::•()
+    ;
+  abstract get _privateGetter() → opt::A;
+  abstract set _privateSetter(opt::C c) → void;
+}
+static method testInterface2(opt::Interface2 c) → dynamic {
+  try {
+    c.{opt::Interface2::_privateGetter};
+    throw "Expected NoSuchMethodError";
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+  (dynamic e) → Null {
+    core::print(e);
+  };
+  try {
+    c.{opt::Interface2::_privateSetter} = new opt::C::•();
+    throw "Expected NoSuchMethodError";
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+  (dynamic e) → Null {
+    core::print(e);
+  };
+}
+
+library /*isNonNullableByDefault*/;
+import self as opt3;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+
+class Mixin2 extends core::Object implements opt::Interface2 {
+  synthetic constructor •() → opt3::Mixin2
+    : super core::Object::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///opt_in_lib1.dart */ _privateGetter() → opt::A
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} opt::A;
+  no-such-method-forwarder set /* from org-dartlang-testcase:///opt_in_lib1.dart */ _privateSetter(opt::C c) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(c)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+library;
+import self as opt2;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+
+abstract class Mixin1 extends core::Object implements opt::Interface1 {
+  synthetic constructor •() → opt2::Mixin1*
+    : 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 member-signature get getter() → opt::A*; -> opt::Interface1::getter
+  abstract member-signature set setter(opt::C* c) → void; -> opt::Interface1::setter
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///opt_in_lib2.dart::_privateGetter
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #org-dartlang-testcase:///opt_in_lib2.dart::_privateSetter=
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..83877b7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.transformed.expect
@@ -0,0 +1,214 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+import "opt_out_lib.dart" as opt2;
+import "opt_in_lib2.dart" as opt3;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+import "org-dartlang-testcase:///opt_in_lib2.dart";
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  get getter() → opt::B*
+    return new opt::B::•();
+  set setter(opt::A* a) → 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
+}
+abstract class _Class1&Super&Mixin1 extends self::Super implements opt2::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin1*
+    : super self::Super::•()
+    ;
+  abstract member-signature get /* from org-dartlang-testcase:///opt_out_lib.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method /* from org-dartlang-testcase:///opt_out_lib.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///opt_out_lib.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///opt_out_lib.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///opt_out_lib.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///opt_out_lib.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///opt_out_lib.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///opt_out_lib.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///opt_out_lib.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///opt_out_lib.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get /* from org-dartlang-testcase:///opt_out_lib.dart */ getter() → opt::A*; -> opt::Interface1::getter
+  abstract member-signature set /* from org-dartlang-testcase:///opt_out_lib.dart */ setter(opt::C* c) → void; -> opt::Interface1::setter
+}
+class Class1 extends self::_Class1&Super&Mixin1 {
+  synthetic constructor •() → self::Class1*
+    : super self::_Class1&Super&Mixin1::•()
+    ;
+}
+abstract class _Class2&Base&Mixin2 extends opt::Base implements opt3::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class2&Base&Mixin2*
+    : super opt::Base::•()
+    ;
+  abstract member-signature get _privateGetter() → opt::B*; -> opt::Base::_privateGetter
+  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 member-signature set _privateSetter(opt::A* a) → void; -> opt::Base::_privateSetter
+}
+class Class2 extends self::_Class2&Base&Mixin2 {
+  synthetic constructor •() → self::Class2*
+    : super self::_Class2&Base&Mixin2::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class1* c = new self::Class1::•();
+  c.{self::Super::getter}.{opt::B::property};
+  c.{self::Super::setter} = new opt::B::•();
+  opt::testInterface2(new opt3::Mixin2::•());
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:32:8: Error: A catch clause must have a body, even if it is empty.
+// Try adding an empty body.
+//   } on NoSuchMethodError (e) {
+//        ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:34:3: Error: Expected ';' after this.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:38:8: Error: A catch clause must have a body, even if it is empty.
+// Try adding an empty body.
+//   } on NoSuchMethodError (e) {
+//        ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart:40:3: Error: Expected ';' after this.
+//   }
+//   ^
+//
+import self as opt;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → opt::A
+    : super core::Object::•()
+    ;
+}
+class B extends opt::A {
+  synthetic constructor •() → opt::B
+    : super opt::A::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+class C extends opt::A {
+  synthetic constructor •() → opt::C
+    : super opt::A::•()
+    ;
+}
+class Base extends core::Object {
+  synthetic constructor •() → opt::Base
+    : super core::Object::•()
+    ;
+  get _privateGetter() → opt::B
+    return new opt::B::•();
+  set _privateSetter(opt::A a) → void {}
+}
+abstract class Interface1 extends core::Object {
+  synthetic constructor •() → opt::Interface1
+    : super core::Object::•()
+    ;
+  abstract get getter() → opt::A;
+  abstract set setter(opt::C c) → void;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → opt::Interface2
+    : super core::Object::•()
+    ;
+  abstract get _privateGetter() → opt::A;
+  abstract set _privateSetter(opt::C c) → void;
+}
+static method testInterface2(opt::Interface2 c) → dynamic {
+  try {
+    c.{opt::Interface2::_privateGetter};
+    throw "Expected NoSuchMethodError";
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+  (dynamic e) → Null {
+    core::print(e);
+  };
+  try {
+    c.{opt::Interface2::_privateSetter} = new opt::C::•();
+    throw "Expected NoSuchMethodError";
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+  (dynamic e) → Null {
+    core::print(e);
+  };
+}
+
+library /*isNonNullableByDefault*/;
+import self as opt3;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+
+class Mixin2 extends core::Object implements opt::Interface2 {
+  synthetic constructor •() → opt3::Mixin2
+    : super core::Object::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///opt_in_lib1.dart */ _privateGetter() → opt::A
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic,ForNonNullableByDefault} opt::A;
+  no-such-method-forwarder set /* from org-dartlang-testcase:///opt_in_lib1.dart */ _privateSetter(opt::C c) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(c)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+library;
+import self as opt2;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+
+abstract class Mixin1 extends core::Object implements opt::Interface1 {
+  synthetic constructor •() → opt2::Mixin1*
+    : 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 member-signature get getter() → opt::A*; -> opt::Interface1::getter
+  abstract member-signature set setter(opt::C* c) → void; -> opt::Interface1::setter
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///opt_in_lib2.dart::_privateGetter
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #org-dartlang-testcase:///opt_in_lib2.dart::_privateSetter=
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart
new file mode 100644
index 0000000..0019ab0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib1.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2021, 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 {}
+
+class B extends A {
+  int get property => 0;
+}
+
+class C extends A {}
+
+class Base {
+  B get _privateGetter => new B();
+  void set _privateSetter(A a) {}
+}
+
+abstract class Interface1 {
+  A get getter;
+  void set setter(C c);
+}
+
+abstract class Interface2 {
+  A get _privateGetter;
+  void set _privateSetter(C c);
+}
+
+testInterface2(Interface2 c) {
+  try {
+    c._privateGetter;
+    throw 'Expected NoSuchMethodError';
+  } on NoSuchMethodError (e) {
+    print(e);
+  }
+  try {
+    c._privateSetter = new C();
+    throw 'Expected NoSuchMethodError';
+  } on NoSuchMethodError (e) {
+    print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib2.dart b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib2.dart
new file mode 100644
index 0000000..01e1432
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_in_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, 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 'opt_in_lib1.dart';
+
+class Mixin2 implements Interface2 {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_out_lib.dart b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_out_lib.dart
new file mode 100644
index 0000000..60c244a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/opt_out_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, 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.
+
+// @dart=2.9
+
+import 'opt_in_lib1.dart';
+
+abstract class Mixin1 implements Interface1 {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/test.options b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/test.options
new file mode 100644
index 0000000..f1e6396
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/test.options
@@ -0,0 +1,3 @@
+opt_in_lib1.dart
+opt_in_lib2.dart
+opt_out_lib.dart
\ No newline at end of file
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 a878892..f2d5fcc 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
@@ -9,32 +9,22 @@
   const synthetic constructor •() → self::_C&Object&A*
     : super core::Object::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> baz2::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> baz2::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> baz2::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> baz2::A::hashCode
+  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
   mixin-super-stub method toString({core::String* s = #C1}) → core::String*
     return super.{baz2::A::toString}(s: s);
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> baz2::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> baz2::A::runtimeType
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class _C&Object&A&B = self::_C&Object&A with baz2::B /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> baz2::B::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> baz2::B::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> baz2::B::==
-  abstract mixin-stub get hashCode() → core::int*; -> baz2::B::hashCode
-  abstract mixin-stub method toString() → core::String*; -> baz2::B::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> baz2::B::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> baz2::B::runtimeType
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
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 44da6f8..363ce97 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
@@ -9,8 +9,6 @@
   const synthetic constructor •() → self::_C&Object&A*
     : super core::Object::•()
     ;
-  method /* from org-dartlang-testcase:///issue40512_lib.dart */ toString({core::String* s = #C1}) → core::String*
-    return s;
   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
@@ -18,6 +16,8 @@
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
   abstract member-signature operator /* from org-dartlang-testcase:///issue40512_lib.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  method /* from org-dartlang-testcase:///issue40512_lib.dart */ toString({core::String* s = #C1}) → core::String*
+    return s;
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
 }
@@ -25,7 +25,6 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> self::_C&Object&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
@@ -33,6 +32,7 @@
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
   abstract member-signature operator /* from org-dartlang-testcase:///issue40512_lib.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ toString() → core::String*; -> core::Object::toString
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
 }
@@ -40,7 +40,6 @@
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::toString
 }
 static method main() → void {
   core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart
new file mode 100644
index 0000000..3b3ec1f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.6
+import 'issue40512_lib.dart';
+
+class C extends Object with A, B {}
+
+void main() {
+  print(B());
+  print(C());
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.textual_outline.expect
new file mode 100644
index 0000000..6d60882
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+// @dart = 2.6
+import 'issue40512_lib.dart';
+
+class C extends Object with A, B {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6d60882
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+// @dart = 2.6
+import 'issue40512_lib.dart';
+
+class C extends Object with A, B {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.expect
new file mode 100644
index 0000000..5ce29b0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.expect
@@ -0,0 +1,74 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue40512_lib.dart" as baz2;
+
+import "org-dartlang-testcase:///issue40512_lib.dart";
+
+abstract class _C&Object&A = core::Object with baz2::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method toString({core::String* s = #C1}) → core::String*
+    return super.{baz2::A::toString}(s: s);
+  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 noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with baz2::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → void {
+  core::print(new baz2::B::•());
+  core::print(new self::C::•());
+}
+
+library baz2;
+import self as baz2;
+import "dart:core" as core;
+
+abstract class A extends core::Object /*isMixinDeclaration*/  {
+  method toString({core::String* s = #C1}) → core::String*
+    return s;
+  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 noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → baz2::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  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 noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.transformed.expect
new file mode 100644
index 0000000..29324d1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue40512_lib.dart" as baz2;
+
+import "org-dartlang-testcase:///issue40512_lib.dart";
+
+abstract class _C&Object&A extends core::Object implements baz2::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  method /* from org-dartlang-testcase:///issue40512_lib.dart */ toString({core::String* s = #C1}) → core::String*
+    return s;
+  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
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///issue40512_lib.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B extends self::_C&Object&A implements baz2::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ toString() → core::String*; -> core::Object::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
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///issue40512_lib.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → void {
+  core::print(new baz2::B::•());
+  core::print(new self::C::•());
+}
+
+library baz2;
+import self as baz2;
+import "dart:core" as core;
+
+abstract class A extends core::Object /*isMixinDeclaration*/  {
+  method toString({core::String* s = #C1}) → core::String*
+    return s;
+  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 noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → baz2::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  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 noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = "hello"
+}
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 2ba727b..e644ba8 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
@@ -9,16 +9,16 @@
   const synthetic constructor •() → self::_C&Object&A*
     : super core::Object::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  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
   mixin-super-stub method method({core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(s: s);
 }
@@ -26,17 +26,6 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
-  abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
-  abstract mixin-stub method toString() → core::String*; -> iss::B::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
-  abstract mixin-stub method method() → core::String*; -> iss::B::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
@@ -44,7 +33,7 @@
     ;
 }
 static method main() → dynamic {
-  core::print(new self::C::•().{self::_C&Object&A&B::method}());
+  core::print(new self::C::•().{self::_C&Object&A::method}());
 }
 
 library;
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 bb7985d..a08b62f 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
@@ -9,8 +9,6 @@
   const synthetic constructor •() → self::_C&Object&A*
     : super core::Object::•()
     ;
-  method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method({core::String* s = #C1}) → core::String*
-    return s;
   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
@@ -21,12 +19,13 @@
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ toString() → core::String*; -> core::Object::toString
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+  method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method({core::String* s = #C1}) → core::String*
+    return s;
 }
 abstract class _C&Object&A&B extends self::_C&Object&A implements iss::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> self::_C&Object&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
@@ -37,15 +36,15 @@
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ toString() → core::String*; -> core::Object::toString
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method() → core::String*; -> #lib1::Interface::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
 }
 static method main() → dynamic {
-  core::print(new self::C::•().{self::C::method}());
+  core::print(new self::C::•().{self::_C&Object&A::method}());
 }
 
 library;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart
new file mode 100644
index 0000000..384a53c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.6
+
+import 'issue41210_lib1.dart';
+
+class C with A, B {} // ok
+
+main() {
+  print(C().method());
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.textual_outline.expect
new file mode 100644
index 0000000..8cdec02
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+// @dart = 2.6
+import 'issue41210_lib1.dart';
+
+class C with A, B {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..8cdec02
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+// @dart = 2.6
+import 'issue41210_lib1.dart';
+
+class C with A, B {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.expect
new file mode 100644
index 0000000..5dfa45a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.expect
@@ -0,0 +1,91 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib1.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method({core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(s: s);
+  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 class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A::method}());
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue41210_lib2.dart" as iss2;
+
+import "org-dartlang-testcase:///issue41210_lib2.dart";
+
+abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/  {
+  method method({core::String* s = #C1}) → core::String*
+    return s;
+  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 class B extends core::Object implements iss2::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method method() → core::String*; -> iss2::Interface::method
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+library /*isNonNullableByDefault*/;
+import self as iss2;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss2::Interface
+    : super core::Object::•()
+    ;
+  abstract method method() → core::String;
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.transformed.expect
new file mode 100644
index 0000000..a058bfa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.transformed.expect
@@ -0,0 +1,102 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib1.dart";
+
+abstract class _C&Object&A extends core::Object implements iss::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method({core::String* s = #C1}) → core::String*
+    return s;
+  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
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///issue41210_lib1.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B extends self::_C&Object&A implements iss::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method() → core::String*; -> #lib1::Interface::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
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///issue41210_lib1.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A::method}());
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue41210_lib2.dart" as iss2;
+
+import "org-dartlang-testcase:///issue41210_lib2.dart";
+
+abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/  {
+  method method({core::String* s = #C1}) → core::String*
+    return s;
+  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 class B extends core::Object implements iss2::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method method() → core::String*; -> iss2::Interface::method
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+library /*isNonNullableByDefault*/;
+import self as iss2;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss2::Interface
+    : super core::Object::•()
+    ;
+  abstract method method() → core::String;
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
index cf0c156..255626c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
@@ -14,17 +14,17 @@
   synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding*
     : super fou::BindingBase::•()
     ;
-  abstract mixin-stub method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> sch::SchedulerBinding::registerSignalServiceExtension
-  abstract mixin-stub get _identityHashCode() → core::int*; -> sch::SchedulerBinding::_identityHashCode
-  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> sch::SchedulerBinding::_instanceOf
-  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOf
-  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOfTrue
-  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOfFalse
-  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> sch::SchedulerBinding::==
-  abstract mixin-stub get hashCode() → core::int*; -> sch::SchedulerBinding::hashCode
-  abstract mixin-stub method toString() → core::String*; -> sch::SchedulerBinding::toString
-  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> sch::SchedulerBinding::noSuchMethod
-  abstract mixin-stub get runtimeType() → core::Type*; -> sch::SchedulerBinding::runtimeType
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  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 class _TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding = self::_TestSchedulerBinding&BindingBase&SchedulerBinding with ser::ServicesBinding /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding*
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
index 11f8668..b315eec 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
@@ -26,8 +26,8 @@
   const synthetic constructor •() → self::_E1&Object&A&D*
     : super self::_E1&Object&A::•()
     ;
-  forwarding-stub method method(covariant core::num* i) → core::String*
-    return super.{self::_E1&Object&A::method}(i);
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E1&Object&A::method}(i, s: s);
 }
 class E1 extends self::_E1&Object&A&D {
   synthetic constructor •() → self::E1*
@@ -55,8 +55,8 @@
   const synthetic constructor •() → self::E2*
     : super self::_E2&Object&A::•()
     ;
-  forwarding-stub method method(covariant core::num* i) → core::String*
-    return super.{self::_E2&Object&A::method}(i);
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E2&Object&A::method}(i, s: s);
 }
 abstract class _E3&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E3&Object&A*
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
index 7b32bba..f366369 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
@@ -26,8 +26,8 @@
   const synthetic constructor •() → self::_E1&Object&A&D*
     : super self::_E1&Object&A::•()
     ;
-  forwarding-stub method method(covariant core::num* i) → core::String*
-    return super.{self::_E1&Object&A::method}(i);
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E1&Object&A::method}(i, s: s);
 }
 class E1 extends self::_E1&Object&A&D {
   synthetic constructor •() → self::E1*
@@ -55,8 +55,8 @@
   const synthetic constructor •() → self::E2*
     : super self::_E2&Object&A::•()
     ;
-  forwarding-stub method method(covariant core::num* i) → core::String*
-    return super.{self::_E2&Object&A::method}(i);
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E2&Object&A::method}(i, s: s);
 }
 abstract class _E3&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E3&Object&A*
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart
new file mode 100644
index 0000000..4ac860d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.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.
+
+// @dart=2.9
+
+import 'main_lib.dart';
+
+class E1 with A, D {}
+
+class E2 = Object with A, D;
+
+class E3 = Object with A, F;
+
+abstract class C6 extends C3 implements C4 {}
+
+abstract class C8 extends C5 implements C7 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.textual_outline.expect
new file mode 100644
index 0000000..212f813
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+// @dart = 2.9
+import 'main_lib.dart';
+
+class E1 with A, D {}
+
+class E2 = Object with A, D;
+class E3 = Object with A, F;
+
+abstract class C6 extends C3 implements C4 {}
+
+abstract class C8 extends C5 implements C7 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ea6829e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+// @dart = 2.9
+import 'main_lib.dart';
+
+abstract class C6 extends C3 implements C4 {}
+
+abstract class C8 extends C5 implements C7 {}
+
+class E1 with A, D {}
+
+class E2 = Object with A, D;
+class E3 = Object with A, F;
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.expect
new file mode 100644
index 0000000..f9f739d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.expect
@@ -0,0 +1,188 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _E1&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  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 class _E1&Object&A&D = self::_E1&Object&A with mai::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A&D*
+    : super self::_E1&Object&A::•()
+    ;
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E1&Object&A::method}(i, s: s);
+}
+class E1 extends self::_E1&Object&A&D {
+  synthetic constructor •() → self::E1*
+    : super self::_E1&Object&A&D::•()
+    ;
+}
+abstract class _E2&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E2&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  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 E2 = self::_E2&Object&A with mai::D /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E2*
+    : super self::_E2&Object&A::•()
+    ;
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E2&Object&A::method}(i, s: s);
+}
+abstract class _E3&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E3&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  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 E3 = self::_E3&Object&A with mai::F /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E3*
+    : super self::_E3&Object&A::•()
+    ;
+}
+abstract class C6 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → self::C6*
+    : super mai::C3::•()
+    ;
+  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 method2([covariant core::String* a]) → dynamic;
+}
+abstract class C8 extends mai::C5 implements mai::C7 {
+  synthetic constructor •() → self::C8*
+    : super mai::C5::•()
+    ;
+  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 method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → mai::Interface
+    : super core::Object::•()
+    ;
+  abstract method method(core::num i) → core::String;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → mai::Interface2
+    : super core::Object::•()
+    ;
+  abstract method method(covariant core::int i) → core::String;
+}
+abstract class A extends core::Object implements mai::Interface /*isMixinDeclaration*/  {
+  method method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+abstract class D extends core::Object implements mai::Interface, mai::Interface2 {
+  synthetic constructor •() → mai::D
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num i) → core::String;
+}
+abstract class F extends core::Object implements mai::Interface {
+  synthetic constructor •() → mai::F
+    : super core::Object::•()
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → mai::C1
+    : super core::Object::•()
+    ;
+  abstract method method2() → dynamic;
+}
+abstract class C2 extends core::Object {
+  synthetic constructor •() → mai::C2
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2]) → dynamic;
+}
+abstract class C3 extends core::Object implements mai::C1, mai::C2 {
+  synthetic constructor •() → mai::C3
+    : super core::Object::•()
+    ;
+  abstract member-signature method method2([core::String a = #C2]) → dynamic; -> mai::C2::method2
+}
+abstract class C4 extends core::Object {
+  synthetic constructor •() → mai::C4
+    : super core::Object::•()
+    ;
+  abstract method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C5 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → mai::C5
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C7 extends core::Object {
+  synthetic constructor •() → mai::C7
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2, core::num b = #C2]) → dynamic;
+}
+
+constants  {
+  #C1 = "hello"
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.transformed.expect
new file mode 100644
index 0000000..2645eb5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.transformed.expect
@@ -0,0 +1,188 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _E1&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A*
+    : super core::Object::•()
+    ;
+  method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+  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 class _E1&Object&A&D extends self::_E1&Object&A implements mai::D /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A&D*
+    : super self::_E1&Object&A::•()
+    ;
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E1&Object&A::method}(i, s: s);
+}
+class E1 extends self::_E1&Object&A&D {
+  synthetic constructor •() → self::E1*
+    : super self::_E1&Object&A&D::•()
+    ;
+}
+abstract class _E2&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E2&Object&A*
+    : super core::Object::•()
+    ;
+  method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+  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 E2 extends self::_E2&Object&A implements mai::D /*isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::E2*
+    : super self::_E2&Object&A::•()
+    ;
+  forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E2&Object&A::method}(i, s: s);
+}
+abstract class _E3&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E3&Object&A*
+    : super core::Object::•()
+    ;
+  method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+  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 E3 extends self::_E3&Object&A implements mai::F /*isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::E3*
+    : super self::_E3&Object&A::•()
+    ;
+}
+abstract class C6 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → self::C6*
+    : super mai::C3::•()
+    ;
+  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 method2([covariant core::String* a]) → dynamic;
+}
+abstract class C8 extends mai::C5 implements mai::C7 {
+  synthetic constructor •() → self::C8*
+    : super mai::C5::•()
+    ;
+  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 method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → mai::Interface
+    : super core::Object::•()
+    ;
+  abstract method method(core::num i) → core::String;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → mai::Interface2
+    : super core::Object::•()
+    ;
+  abstract method method(covariant core::int i) → core::String;
+}
+abstract class A extends core::Object implements mai::Interface /*isMixinDeclaration*/  {
+  method method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+abstract class D extends core::Object implements mai::Interface, mai::Interface2 {
+  synthetic constructor •() → mai::D
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num i) → core::String;
+}
+abstract class F extends core::Object implements mai::Interface {
+  synthetic constructor •() → mai::F
+    : super core::Object::•()
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → mai::C1
+    : super core::Object::•()
+    ;
+  abstract method method2() → dynamic;
+}
+abstract class C2 extends core::Object {
+  synthetic constructor •() → mai::C2
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2]) → dynamic;
+}
+abstract class C3 extends core::Object implements mai::C1, mai::C2 {
+  synthetic constructor •() → mai::C3
+    : super core::Object::•()
+    ;
+  abstract member-signature method method2([core::String a = #C2]) → dynamic; -> mai::C2::method2
+}
+abstract class C4 extends core::Object {
+  synthetic constructor •() → mai::C4
+    : super core::Object::•()
+    ;
+  abstract method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C5 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → mai::C5
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C7 extends core::Object {
+  synthetic constructor •() → mai::C7
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2, core::num b = #C2]) → dynamic;
+}
+
+constants  {
+  #C1 = "hello"
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index add20b0..7221323 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -21,6 +21,7 @@
 general/invalid_operator_override: TypeCheckError
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
+general/issue41210b/issue41210.no_link: TypeCheckError
 general/mixin_application_override: TypeCheckError
 general/override_check_accessor_after_inference: TypeCheckError
 general/override_check_accessor_basic: TypeCheckError
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 10f576d..4b102ab 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -76,6 +76,7 @@
 general/issue38961: RuntimeError # no main and compile time errors.
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
+general/issue41210b/issue41210.no_link: TypeCheckError
 general/micro: RuntimeError
 general/mixin_application_override: ExpectationFileMismatch # Too many errors.
 general/mixin_application_override: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index ca60b99..c22bd35 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -76,6 +76,7 @@
 general/issue38961: RuntimeError
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
+general/issue41210b/issue41210.no_link: TypeCheckError
 general/micro: RuntimeError
 general/mixin_application_override: TypeCheckError
 general/mixin_constructors_with_default_values: RuntimeError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 6efa9d9..fe180bd 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -78,8 +78,6 @@
 nnbd_mixed/hierarchy/mix_in_override: TypeCheckError
 nnbd_mixed/hierarchy/override: TypeCheckError
 nnbd_mixed/inheritance_from_opt_in: TypeCheckError
-nnbd_mixed/issue40512/issue40512: TypeCheckError
-nnbd_mixed/issue41210a/issue41210: TypeCheckError
 nnbd_mixed/issue41567: TypeCheckError
 nnbd_mixed/messages_with_types_opt_in: TypeCheckError
 nnbd_mixed/messages_with_types_opt_out: TypeCheckError
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 26ef345..8839438 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -1216,8 +1216,7 @@
           mixedInClassNode, mixedInInfo,
           setters: setters)) {
         if (mixinMember is! Procedure ||
-            (mixinMember is Procedure &&
-                !mixinMember.isNoSuchMethodForwarder)) {
+            (mixinMember is Procedure && !mixinMember.isSynthetic)) {
           memberMap[mixinMember.name] = mixinMember;
         }
       }
diff --git a/pkg/testing/lib/src/error_handling.dart b/pkg/testing/lib/src/error_handling.dart
index bf13cb0..452e4b7 100644
--- a/pkg/testing/lib/src/error_handling.dart
+++ b/pkg/testing/lib/src/error_handling.dart
@@ -10,7 +10,9 @@
 
 import 'dart:isolate' show ReceivePort;
 
-Future<T> withErrorHandling<T>(Future<T> f()) async {
+import 'log.dart';
+
+Future<T> withErrorHandling<T>(Future<T> f(), {Logger logger}) async {
   final ReceivePort port = new ReceivePort();
   try {
     return await f();
@@ -20,6 +22,7 @@
     if (trace != null) {
       stderr.writeln(trace);
     }
+    logger?.noticeFrameworkCatchError(e, trace);
     return null;
   } finally {
     port.close();
diff --git a/pkg/testing/lib/src/log.dart b/pkg/testing/lib/src/log.dart
index e916ba9..7e6fafd 100644
--- a/pkg/testing/lib/src/log.dart
+++ b/pkg/testing/lib/src/log.dart
@@ -68,6 +68,11 @@
   void logSuiteComplete(Suite suite);
 
   void logUncaughtError(error, StackTrace stackTrace);
+
+  /// Issued when there's been a crash caught by the framework.
+  /// Notice that the exit-code has already been set and that the error has
+  /// been printed to stderr.
+  void noticeFrameworkCatchError(error, StackTrace stackTrace);
 }
 
 class StdoutLogger implements Logger {
@@ -185,6 +190,8 @@
       logMessage(stackTrace);
     }
   }
+
+  void noticeFrameworkCatchError(error, StackTrace stackTrace) {}
 }
 
 String pad(Object o, int pad, {String filler: " "}) {
diff --git a/pkg/testing/lib/src/run.dart b/pkg/testing/lib/src/run.dart
index 1930c45..7ce9bd0 100644
--- a/pkg/testing/lib/src/run.dart
+++ b/pkg/testing/lib/src/run.dart
@@ -67,7 +67,7 @@
             shards: shards, shard: shard, logger: logger);
       }
     }
-  });
+  }, logger: logger);
 }
 
 /// This is called from a `_test.dart` file, and helps integration in other
diff --git a/tools/VERSION b/tools/VERSION
index f6cc11d..6fdb2fb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 271
+PRERELEASE 272
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 12f746b..29f0ba2 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -964,7 +964,7 @@
             "co19_2"
           ],
           "fileset": "front-end",
-          "shards": 10
+          "shards": 2
         },
         {
           "name": "sdk tests",
@@ -972,22 +972,44 @@
             "-ncfe-${system}"
           ],
           "fileset": "front-end",
-          "shards": 5
+          "shards": 2
         },
         {
-          "name": "unit tests",
+          "name": "unit tests (no git)",
           "arguments": [
             "-ncfe-unittest-asserts-${mode}-${system}",
-            "pkg/pkg/(kernel|front_end|fasta)/"
-          ]
+            "pkg/pkg/(kernel|front_end|fasta)\/(*?)(?<!_git)_test"
+          ],
+          "fileset": "front-end",
+          "shards": 3
         },
         {
-          "name": "unit tests suites",
+          "name": "unit tests suites (no git)",
           "script": "out/ReleaseX64/dart-sdk/bin/dart",
           "testRunner": true,
           "arguments": [
             "pkg/front_end/test/unit_test_suites.dart",
-            "-ncfe-unittest-asserts-${mode}-${system}"
+            "-ncfe-unittest-asserts-${mode}-${system}",
+            "--skipTestsThatRequireGit"
+          ],
+          "fileset": "front-end",
+          "shards": 3
+        },
+        {
+          "name": "unit tests (with git)",
+          "arguments": [
+            "-ncfe-unittest-asserts-${mode}-${system}",
+            "pkg/pkg/(kernel|front_end|fasta)\/(*?)(_git)_test"
+          ]
+        },
+        {
+          "name": "unit tests suites (with git)",
+          "script": "out/ReleaseX64/dart-sdk/bin/dart",
+          "testRunner": true,
+          "arguments": [
+            "pkg/front_end/test/unit_test_suites.dart",
+            "-ncfe-unittest-asserts-${mode}-${system}",
+            "--onlyTestsThatRequireGit"
           ]
         }
       ]