Version 2.16.0-105.0.dev

Merge commit '843583f3564a27d78640859217f22db36c881988' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index ece4718..e7890ff 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1049,51 +1049,74 @@
       ];
     }
 
-    if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
-      List<VariableDeclaration>? positionalSuperParameters;
-      List<VariableDeclaration>? namedSuperParameters;
-
-      List<FormalParameterBuilder>? formals =
-          (member as ConstructorBuilder).formals;
-      if (formals != null) {
-        for (FormalParameterBuilder formal in formals) {
-          if (formal.isSuperInitializingFormal) {
-            if (formal.isNamed) {
-              (namedSuperParameters ??= <VariableDeclaration>[])
-                  .add(formal.variable!);
-            } else {
-              (positionalSuperParameters ??= <VariableDeclaration>[])
-                  .add(formal.variable!);
-            }
-          }
-        }
-
+    if (libraryBuilder.enableSuperParametersInLibrary) {
+      if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
         SuperInitializer superInitializer =
             initializers.last as SuperInitializer;
         Arguments arguments = superInitializer.arguments;
-        if (positionalSuperParameters != null) {
-          if (arguments.positional.isNotEmpty) {
-            addProblem(fasta.messagePositionalSuperParametersAndArguments,
-                arguments.fileOffset, noLength,
-                context: <LocatedMessage>[
-                  fasta.messageSuperInitializerParameter.withLocation(
-                      uri, positionalSuperParameters.first.fileOffset, noLength)
-                ]);
-          } else {
-            for (VariableDeclaration positional in positionalSuperParameters) {
-              arguments.positional.add(
-                  new VariableGetImpl(positional, forNullGuardedAccess: false)
-                    ..fileOffset = positional.fileOffset);
+
+        List<VariableDeclaration>? positionalSuperParameters;
+        List<VariableDeclaration>? namedSuperParameters;
+
+        List<FormalParameterBuilder>? formals =
+            (member as ConstructorBuilder).formals;
+        if (formals != null) {
+          for (FormalParameterBuilder formal in formals) {
+            if (formal.isSuperInitializingFormal) {
+              if (formal.isNamed) {
+                (namedSuperParameters ??= <VariableDeclaration>[])
+                    .add(formal.variable!);
+              } else {
+                (positionalSuperParameters ??= <VariableDeclaration>[])
+                    .add(formal.variable!);
+              }
+            }
+          }
+
+          if (positionalSuperParameters != null) {
+            if (arguments.positional.isNotEmpty) {
+              addProblem(fasta.messagePositionalSuperParametersAndArguments,
+                  arguments.fileOffset, noLength,
+                  context: <LocatedMessage>[
+                    fasta.messageSuperInitializerParameter.withLocation(uri,
+                        positionalSuperParameters.first.fileOffset, noLength)
+                  ]);
+            } else {
+              for (VariableDeclaration positional
+                  in positionalSuperParameters) {
+                arguments.positional.add(
+                    new VariableGetImpl(positional, forNullGuardedAccess: false)
+                      ..fileOffset = positional.fileOffset);
+              }
+            }
+          }
+          if (namedSuperParameters != null) {
+            // TODO(cstefantsova): Report name conflicts.
+            for (VariableDeclaration named in namedSuperParameters) {
+              arguments.named.add(new NamedExpression(
+                  named.name!,
+                  new VariableGetImpl(named, forNullGuardedAccess: false)
+                    ..fileOffset = named.fileOffset)
+                ..fileOffset = named.fileOffset);
             }
           }
         }
-        if (namedSuperParameters != null) {
-          // TODO(cstefantsova): Report name conflicts.
-          for (VariableDeclaration named in namedSuperParameters) {
-            arguments.named.add(new NamedExpression(named.name!,
-                new VariableGetImpl(named, forNullGuardedAccess: false))
-              ..fileOffset = named.fileOffset);
-          }
+
+        LocatedMessage? message = checkArgumentsForFunction(
+            superInitializer.target.function,
+            arguments,
+            arguments.fileOffset, <TypeParameter>[]);
+        if (message != null) {
+          initializers[initializers.length - 1] = buildInvalidInitializer(
+              buildUnresolvedError(
+                  forest.createNullLiteral(superInitializer.fileOffset),
+                  constructorNameForDiagnostics(
+                      superInitializer.target.name.text),
+                  arguments,
+                  superInitializer.fileOffset,
+                  isSuper: true,
+                  message: message,
+                  kind: UnresolvedKind.Constructor));
         }
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 7bc120f..eeb3f6f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -72,7 +72,7 @@
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
 import '../loader.dart' show Loader, untranslatableUriScheme;
-import '../problems.dart' show internalProblem, unhandled;
+import '../problems.dart' show internalProblem;
 import '../scope.dart';
 import '../ticker.dart' show Ticker;
 import '../type_inference/type_inference_engine.dart';
@@ -527,9 +527,8 @@
     }
     accessor ??= _builders[accessorUri];
     if (accessor == null) {
-      if (libraryBuilder.loader == this && first != libraryBuilder) {
-        unhandled("null", "accessor", charOffset, uri);
-      }
+      // TODO(johnniwinther): Separate reading of imports/exports/parts from
+      // reading entry points.
     } else {
       libraryBuilder.recordAccess(charOffset, noLength, accessor.fileUri);
       if (!accessor.isPatch &&
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml b/pkg/front_end/testcases/incremental/change_main.yaml
new file mode 100644
index 0000000..e7167fa
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml
@@ -0,0 +1,59 @@
+# 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.md file.
+
+# Change entry point between deltas, provoking the read of the new entry
+# point before the read of the previous entry point. This triggers the crash
+# in https://github.com/flutter/flutter/issues/95014
+
+type: newworld
+worlds:
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {}
+      second.dart: |
+        import 'first.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method2() {}
+    expectedLibraryCount: 2
+  - entry: second.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      [second.dart, first.dart]
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {
+          print('method1');
+        }
+      second.dart: |
+        import 'first.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method2() {
+          print('method2');
+        }
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect
new file mode 100644
index 0000000..1e283df
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = fir::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {}
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  import "org-dartlang-test:///first.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method2() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect b/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect
new file mode 100644
index 0000000..df10188
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect
@@ -0,0 +1,25 @@
+main = sec::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {
+    dart.core::print("method1");
+  }
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  import "org-dartlang-test:///first.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method2() → dynamic {
+    dart.core::print("method2");
+  }
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart
new file mode 100644
index 0000000..bd5cc28
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart
@@ -0,0 +1,33 @@
+// 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 A1 {
+  final int foo;
+  A1({required this.foo});
+}
+
+class B1 extends A1 {
+  B1({required super.foo}) : super(); // Ok.
+}
+
+class C1 extends A1 {
+  C1({required super.foo}) : super(foo: foo); // Error.
+}
+
+class A2 {
+  final int foo;
+  final String bar;
+  A2({required this.foo, required this.bar});
+}
+
+class B2 extends A2 {
+  B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+}
+
+class C2 extends A2 {
+  C2({required super.foo}) : super(); // Error.
+  C2.other({required super.foo}) : super(bar: 'bar'); // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..74cac10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..3c4243b
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+class A1 {
+  final int foo;
+  A1({required this.foo});
+}
+class B1 extends A1 {
+  B1({required super.foo}) : super();
+}
+class C1 extends A1 {
+  C1({required super.foo}) : super(foo: foo);
+}
+class A2 {
+  final int foo;
+  final String bar;
+  A2({required this.foo, required this.bar});
+}
+class B2 extends A2 {
+  B2() : super(foo: 42, bar: "bar", baz: false);
+}
+class C2 extends A2 {
+  C2({required super.foo}) : super();
+  C2.other({required super.foo}) : super(bar: 'bar');
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..f3d5bdd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo}) → self::A1
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo}) → self::B1
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo}) → self::C1
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo, required core::String bar}) → self::A2
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo}) → self::C2
+    ;
+  constructor other({required dynamic foo}) → self::C2
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..74cac10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
index f8bb940..d34d4a6 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
@@ -2,17 +2,31 @@
 // 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 A1 {
   final int foo;
-  A(this.foo);
+  A1(this.foo);
 }
 
-class B extends A {
-  B(super.foo) : super();
+class B1 extends A1 {
+  B1(super.foo) : super(); // Ok.
 }
 
-class C extends A {
-  C(super.foo) : super(42); // Error.
+class C1 extends A1 {
+  C1(super.foo) : super(42); // Error.
+}
+
+class A2 {
+  final int foo;
+  final String bar;
+  A2(this.foo, this.bar);
+}
+
+class B2 extends A2 {
+  B2() : super(0, 1, 2); // Error.
+}
+
+class C2 extends A2 {
+  C2(super.foo) : super(); // Error.
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
@@ -2,30 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-//   C(super.foo) : super(42); // Error.
-//                       ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-//   C(super.foo) : super(42); // Error.
-//           ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
 //
 import self as self;
 import "dart:core" as core;
 
-class A extends core::Object {
+class A1 extends core::Object {
   final field core::int foo;
-  constructor •(core::int foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
     ;
 }
-class B extends self::A {
-  constructor •(dynamic foo) → self::B
-    : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
     ;
 }
-class C extends self::A {
-  constructor •(dynamic foo) → self::C
-    : super self::A::•(42)
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
@@ -2,30 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-//   C(super.foo) : super(42); // Error.
-//                       ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-//   C(super.foo) : super(42); // Error.
-//           ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
 //
 import self as self;
 import "dart:core" as core;
 
-class A extends core::Object {
+class A1 extends core::Object {
   final field core::int foo;
-  constructor •(core::int foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
     ;
 }
-class B extends self::A {
-  constructor •(dynamic foo) → self::B
-    : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
     ;
 }
-class C extends self::A {
-  constructor •(dynamic foo) → self::C
-    : super self::A::•(42)
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
index 942d614..a6fc5bc 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
@@ -1,11 +1,22 @@
-class A {
+class A1 {
   final int foo;
-  A(this.foo);
+  A1(this.foo);
 }
-class B extends A {
-  B(super.foo) : super();
+class B1 extends A1 {
+  B1(super.foo) : super();
 }
-class C extends A {
-  C(super.foo) : super(42);
+class C1 extends A1 {
+  C1(super.foo) : super(42);
+}
+class A2 {
+  final int foo;
+  final String bar;
+  A2(this.foo, this.bar);
+}
+class B2 extends A2 {
+  B2() : super(0, 1, 2);
+}
+class C2 extends A2 {
+  C2(super.foo) : super();
 }
 main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
@@ -2,30 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-//   C(super.foo) : super(42); // Error.
-//                       ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-//   C(super.foo) : super(42); // Error.
-//           ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
 //
 import self as self;
 import "dart:core" as core;
 
-class A extends core::Object {
+class A1 extends core::Object {
   final field core::int foo;
-  constructor •(core::int foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
     ;
 }
-class B extends self::A {
-  constructor •(dynamic foo) → self::B
-    : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
     ;
 }
-class C extends self::A {
-  constructor •(dynamic foo) → self::C
-    : super self::A::•(42)
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
@@ -2,30 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-//   C(super.foo) : super(42); // Error.
-//                       ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-//   C(super.foo) : super(42); // Error.
-//           ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
 //
 import self as self;
 import "dart:core" as core;
 
-class A extends core::Object {
+class A1 extends core::Object {
   final field core::int foo;
-  constructor •(core::int foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
     ;
 }
-class B extends self::A {
-  constructor •(dynamic foo) → self::B
-    : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
     ;
 }
-class C extends self::A {
-  constructor •(dynamic foo) → self::C
-    : super self::A::•(42)
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
index 767d2ef..184b3f4 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
@@ -2,17 +2,31 @@
 import self as self;
 import "dart:core" as core;
 
-class A extends core::Object {
+class A1 extends core::Object {
   final field core::int foo;
-  constructor •(core::int foo) → self::A
+  constructor •(core::int foo) → self::A1
     ;
 }
-class B extends self::A {
-  constructor •(dynamic foo) → self::B
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
     ;
 }
-class C extends self::A {
-  constructor •(dynamic foo) → self::C
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
@@ -2,30 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-//   C(super.foo) : super(42); // Error.
-//                       ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-//   C(super.foo) : super(42); // Error.
-//           ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
 //
 import self as self;
 import "dart:core" as core;
 
-class A extends core::Object {
+class A1 extends core::Object {
   final field core::int foo;
-  constructor •(core::int foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
     ;
 }
-class B extends self::A {
-  constructor •(dynamic foo) → self::B
-    : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
     ;
 }
-class C extends self::A {
-  constructor •(dynamic foo) → self::C
-    : super self::A::•(42)
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 9eb437c..5df5fee 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -200,6 +200,7 @@
 regress/issue_41265.crash: Crash
 regress/issue_41265.crash: FormatterCrash
 super_parameters/simple: FormatterCrash
+super_parameters/simple_named_super_parameters: FormatterCrash
 super_parameters/simple_positional_super_parameters: FormatterCrash
 super_parameters/typed_super_parameter: FormatterCrash
 triple_shift/invalid_operator: FormatterCrash
diff --git a/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart b/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart
new file mode 100644
index 0000000..548a2d4
--- /dev/null
+++ b/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// This test attempts to verify that the slow path for late static and
+// instance field initialization appropriately restores the write barrier
+// invariant.
+
+import 'dart:_internal';
+
+class Box {
+  var field;
+}
+
+late var global = (() {
+  VMInternalsForTesting.collectAllGarbage();
+  return 10;
+})();
+
+@pragma('vm:never-inline')
+foo() {
+  final kTrue = int.parse('1') == 1;
+  final box = Box(); // Ensure this box is allocated new
+  if (kTrue) {
+    global; // Will not block write-barrier elimination (GC in here should restore invariants)
+    box.field = Box()..field = 42; // Runtime should've made `box` remembered.
+    VMInternalsForTesting.collectAllGarbage();
+  }
+  return box;
+}
+
+main() {
+  if (foo().field.field != 42) throw 'a';
+}
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 0540135..cd7dcb5 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -4203,13 +4203,11 @@
     auto& stub = Code::ZoneHandle(compiler->zone());
     __ Bind(&call_initializer);
     if (field().needs_load_guard()) {
-      ASSERT(!CanCallDart());
       stub = object_store->init_static_field_stub();
     } else if (field().is_late()) {
       // The stubs below call the initializer function directly, so make sure
       // one is created.
       original_field.EnsureInitializerFunction();
-      ASSERT(CanCallDart());
       stub = field().is_final()
                  ? object_store->init_late_final_static_field_stub()
                  : object_store->init_late_static_field_stub();
@@ -4217,7 +4215,6 @@
       // We call to runtime for non-late fields because the stub would need to
       // catch any exception generated by the initialization function to change
       // the value of the static field from the transition sentinel to null.
-      ASSERT(!CanCallDart());
       stub = object_store->init_static_field_stub();
     }
 
@@ -4260,19 +4257,15 @@
   auto object_store = compiler->isolate_group()->object_store();
   auto& stub = Code::ZoneHandle(compiler->zone());
   if (field.needs_load_guard()) {
-    ASSERT(!CanCallDart());
     stub = object_store->init_instance_field_stub();
   } else if (field.is_late()) {
     if (!field.has_nontrivial_initializer()) {
-      // Common stub calls runtime which will throw an exception.
-      ASSERT(!CanCallDart());
       stub = object_store->init_instance_field_stub();
     } else {
       // Stubs for late field initialization call initializer
       // function directly, so make sure one is created.
       original_field.EnsureInitializerFunction();
 
-      ASSERT(CanCallDart());
       if (field.is_final()) {
         stub = object_store->init_late_final_instance_field_stub();
       } else {
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 8d6cf9b..c261131 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -5596,12 +5596,8 @@
                     const Field* field = nullptr)
       : Base(source, deopt_id),
         token_pos_(source.token_pos),
-        calls_runtime_on_initialization_(
-            field != nullptr &&
-            (!field->is_late() || field->needs_load_guard())),
-        throw_exception_on_initialization_(field != nullptr &&
-                                           !field->has_initializer() &&
-                                           !calls_runtime_on_initialization_),
+        throw_exception_on_initialization_(
+            field != nullptr && !field->has_initializer() && field->is_late()),
         calls_initializer_(calls_initializer) {
     ASSERT(!calls_initializer || field != nullptr);
     ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
@@ -5634,15 +5630,17 @@
   }
 
   virtual bool CanCallDart() const {
-    return calls_initializer() && !throw_exception_on_initialization() &&
-           !calls_runtime_on_initialization_;
+    // The slow path (running the field initializer) always calls one of a
+    // specific set of stubs. For those stubs that do not simply call the
+    // runtime, the GC recognizes their frames and restores write barriers
+    // automatically (see Thread::RestoreWriteBarrierInvariant).
+    return false;
   }
   virtual bool CanTriggerGC() const { return calls_initializer(); }
   virtual bool MayThrow() const { return calls_initializer(); }
 
  private:
   const TokenPosition token_pos_;
-  const bool calls_runtime_on_initialization_;
   const bool throw_exception_on_initialization_;
   bool calls_initializer_;
 
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index 936d432..1275b14 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -298,8 +298,59 @@
       },
       kMoveGlob));
 
-  EXPECT(store1->ShouldEmitStoreBarrier());
-  EXPECT(store2->ShouldEmitStoreBarrier());
+  EXPECT(!store1->ShouldEmitStoreBarrier());
+  EXPECT(!store2->ShouldEmitStoreBarrier());
+}
+
+ISOLATE_UNIT_TEST_CASE(IRTest_WriteBarrierElimination_LoadLateStaticField) {
+  DEBUG_ONLY(
+      SetFlagScope<bool> sfs(&FLAG_trace_write_barrier_elimination, true));
+  const char* kScript = R"(
+    class A {
+    }
+
+    class B {
+    }
+
+    class C {
+      C(this.a, this.b);
+      A a;
+      B b;
+    }
+
+    late var x = new B();
+
+    foo(A a) => C(a, x);
+
+    main() { foo(A()); }
+    )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+
+  Invoke(root_library, "main");
+
+  const auto& function = Function::Handle(GetFunction(root_library, "foo"));
+  TestPipeline pipeline(function, CompilerPass::kJIT);
+  FlowGraph* flow_graph = pipeline.RunPasses({});
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+  EXPECT(entry != nullptr);
+
+  StoreInstanceFieldInstr* store1 = nullptr;
+  StoreInstanceFieldInstr* store2 = nullptr;
+
+  ILMatcher cursor(flow_graph, entry);
+  RELEASE_ASSERT(cursor.TryMatch(
+      {
+          kMatchAndMoveAllocateObject,
+          kMatchAndMoveLoadStaticField,
+          {kMatchAndMoveStoreInstanceField, &store1},
+          {kMatchAndMoveStoreInstanceField, &store2},
+      },
+      kMoveGlob));
+
+  EXPECT(!store1->ShouldEmitStoreBarrier());
+  EXPECT(!store2->ShouldEmitStoreBarrier());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 5e838e6..6efc403 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -15,6 +15,7 @@
 #include "vm/message_handler.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/os_thread.h"
 #include "vm/profiler.h"
 #include "vm/runtime_entry.h"
@@ -726,12 +727,28 @@
                                      ValidationPolicy::kDontValidateFrames,
                                      this, cross_thread_policy);
   RestoreWriteBarrierInvariantVisitor visitor(isolate_group(), this, op);
+  ObjectStore* object_store = isolate_group()->object_store();
   bool scan_next_dart_frame = false;
   for (StackFrame* frame = frames_iterator.NextFrame(); frame != NULL;
        frame = frames_iterator.NextFrame()) {
     if (frame->IsExitFrame()) {
       scan_next_dart_frame = true;
-    } else if (frame->IsDartFrame(/*validate=*/false)) {
+    } else if (frame->IsEntryFrame()) {
+      /* Continue searching. */
+    } else if (frame->IsStubFrame()) {
+      const uword pc = frame->pc();
+      if (Code::ContainsInstructionAt(
+              object_store->init_late_static_field_stub(), pc) ||
+          Code::ContainsInstructionAt(
+              object_store->init_late_final_static_field_stub(), pc) ||
+          Code::ContainsInstructionAt(
+              object_store->init_late_instance_field_stub(), pc) ||
+          Code::ContainsInstructionAt(
+              object_store->init_late_final_instance_field_stub(), pc)) {
+        scan_next_dart_frame = true;
+      }
+    } else {
+      ASSERT(frame->IsDartFrame(/*validate=*/false));
       if (scan_next_dart_frame) {
         frame->VisitObjectPointers(&visitor);
       }
diff --git a/tools/VERSION b/tools/VERSION
index 2b9050c..51977ba 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 104
+PRERELEASE 105
 PRERELEASE_PATCH 0
\ No newline at end of file