Version 2.16.0-141.0.dev

Merge commit '584411632fa0117dd9a9dbde5ba235e2626cfac2' into 'dev'
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index f320c5f..6c4801c 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -2,14 +2,17 @@
 // 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 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer_utilities/check/check.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'completion_check.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
@@ -19,95 +22,6 @@
 }
 
 mixin ArgListContributorMixin on DartCompletionContributorTest {
-  void assertNoOtherSuggestions(Iterable<CompletionSuggestion> expected) {
-    for (var suggestion in suggestions) {
-      if (!expected.contains(suggestion)) {
-        failedCompletion('did not expect completion: '
-            '${suggestion.completion}\n  $suggestion');
-      }
-    }
-  }
-
-  /// Assert that there is a suggestion with the given parameter [name] that has
-  /// the given [completion], [selectionOffset] and [selectionLength].
-  void assertSuggestArgumentAndCompletion(String name,
-      {required String completion,
-      required int selectionOffset,
-      int selectionLength = 0}) {
-    var suggestion = suggestions.firstWhere((s) => s.parameterName == name);
-    expect(suggestion, isNotNull);
-    expect(suggestion.completion, completion);
-    expect(suggestion.selectionOffset, selectionOffset);
-    expect(suggestion.selectionLength, selectionLength);
-  }
-
-  void assertSuggestArgumentList_params(
-      List<String> expectedNames,
-      List<String> expectedTypes,
-      List<String>? actualNames,
-      List<String>? actualTypes) {
-    if (actualNames != null &&
-        actualNames.length == expectedNames.length &&
-        actualTypes != null &&
-        actualTypes.length == expectedTypes.length) {
-      var index = 0;
-      while (index < expectedNames.length) {
-        if (actualNames[index] != expectedNames[index] ||
-            actualTypes[index] != expectedTypes[index]) {
-          break;
-        }
-        ++index;
-      }
-      if (index == expectedNames.length) {
-        return;
-      }
-    }
-    var msg = StringBuffer();
-    msg.writeln('Argument list not the same');
-    msg.writeln('  Expected names: $expectedNames');
-    msg.writeln('           found: $actualNames');
-    msg.writeln('  Expected types: $expectedTypes');
-    msg.writeln('           found: $actualTypes');
-    fail(msg.toString());
-  }
-
-  /// Assert that the specified named argument suggestions with their types are
-  /// the only suggestions.
-  void assertSuggestArgumentsAndTypes(
-      {required Map<String, String> namedArgumentsWithTypes,
-      bool includeColon = true,
-      bool includeComma = false}) {
-    var expected = <CompletionSuggestion>[];
-    namedArgumentsWithTypes.forEach((String name, String type) {
-      var completion = includeColon ? '$name: ' : name;
-      // Selection should be before any trailing commas.
-      var selectionOffset = completion.length;
-      if (includeComma) {
-        completion = '$completion,';
-      }
-      expected.add(assertSuggest(completion,
-          csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-          paramName: name,
-          paramType: type,
-          selectionOffset: selectionOffset));
-    });
-    assertNoOtherSuggestions(expected);
-  }
-
-  /// Assert that the specified suggestions are the only suggestions.
-  void assertSuggestions(List<String> suggestions) {
-    var expected = <CompletionSuggestion>[];
-    for (var suggestion in suggestions) {
-      // Selection offset should be before any trailing commas.
-      var selectionOffset =
-          suggestion.endsWith(',') ? suggestion.length - 1 : suggestion.length;
-      expected.add(assertSuggest('$suggestion',
-          csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-          selectionOffset: selectionOffset));
-    }
-    assertNoOtherSuggestions(expected);
-  }
-
   @override
   DartCompletionContributor createContributor(
     DartCompletionRequest request,
@@ -358,12 +272,19 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(^)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ')
+            ..parameterType.isEqualTo('int')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -372,12 +293,19 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(o^)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ')
+            ..parameterType.isEqualTo('int')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -386,11 +314,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(o^ two: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: true);
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ,', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ,')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -399,11 +330,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(o^, two: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: false);
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -412,11 +346,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(o^ , two: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: false);
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -425,12 +362,19 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(^o,)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ')
+            ..parameterType.isEqualTo('int')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -439,11 +383,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(^ two: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: true);
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ,', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ,')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -452,8 +399,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(^two: 2)',
-      check: () {
-        assertSuggestions(['one: ,']);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ,')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(right: 3)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -462,13 +415,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(^, two: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool'},
-          includeComma: false,
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -477,10 +431,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(^ , two: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool'},
-        );
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -489,10 +447,14 @@
     await _tryParametersArguments(
       parameters: '(int one, {bool two, int three})',
       arguments: '(1, ^, three: 3)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'two': 'bool'},
-        );
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -501,8 +463,14 @@
     await _tryParametersArguments(
       parameters: '(int one, {bool two, int three})',
       arguments: '(1, ^ three: 3)',
-      check: () {
-        assertSuggestions(['two: ,']);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ,')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -511,8 +479,14 @@
     await _tryParametersArguments(
       parameters: '(int one, {bool two, int three})',
       arguments: '(1, ^three: 3)',
-      check: () {
-        assertSuggestions(['two: ,']);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ,')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(right: 5)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -522,8 +496,8 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(two: 2^)',
-      check: () {
-        assertSuggestions([', one: ']);
+      check: (response) {
+        check(response).suggestions.namedArguments.isEmpty;
       },
     );
   }
@@ -533,8 +507,8 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(two: 2 ^)',
-      check: () {
-        assertSuggestions([', one: ']);
+      check: (response) {
+        check(response).suggestions.namedArguments.isEmpty;
       },
     );
   }
@@ -543,12 +517,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(two: 2, ^)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool'},
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -557,12 +533,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(two: 2, o^)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool'},
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -571,12 +549,14 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(two: 2, o^,)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool'},
-        );
-        assertSuggestArgumentAndCompletion('one',
-            completion: 'one: ', selectionOffset: 5);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one: ')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 5),
+        ]);
       },
     );
   }
@@ -585,8 +565,19 @@
     await _tryParametersArguments(
       parameters: '(int one, int two, int three, {int four, int five})',
       arguments: '(1, ^, 3)',
-      check: () {
-        assertSuggestions(['four: ', 'five: ']);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('four: ')
+            ..parameterType.isEqualTo('int')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 6),
+          (suggestion) => suggestion
+            ..completion.isEqualTo('five: ')
+            ..parameterType.isEqualTo('int')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 6),
+        ]);
       },
     );
   }
@@ -596,8 +587,8 @@
       languageVersion: '2.15',
       parameters: '(int one, int two, int three, {int four, int five})',
       arguments: '(1, ^, 3)',
-      check: () {
-        assertNoSuggestions();
+      check: (response) {
+        check(response).suggestions.namedArguments.isEmpty;
       },
     );
   }
@@ -606,11 +597,19 @@
     await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(o^: false)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
-          includeColon: false,
-        );
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('one')
+            ..parameterType.isEqualTo('bool')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 3),
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two')
+            ..parameterType.isEqualTo('int')
+            ..hasReplacement(left: 1)
+            ..hasSelection(offset: 3),
+        ]);
       },
     );
   }
@@ -619,30 +618,68 @@
     await _tryParametersArguments(
       parameters: '(bool one, {int two, double three})',
       arguments: '(false, ^t: 2)',
-      check: () {
-        assertSuggestions(['two: ,', 'three: ,']);
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two: ,')
+            ..parameterType.isEqualTo('int')
+            ..hasReplacement(right: 1)
+            ..hasSelection(offset: 5),
+          (suggestion) => suggestion
+            ..completion.isEqualTo('three: ,')
+            ..parameterType.isEqualTo('double')
+            ..hasReplacement(right: 1)
+            ..hasSelection(offset: 7),
+        ]);
       },
     );
   }
 
   Future<void> test_named_23() async {
     await _tryParametersArguments(
-      parameters: '(bool one, {int two, double three})',
-      arguments: '(false, ^: 2)',
-      check: () {
-        assertSuggestArgumentsAndTypes(
-          namedArgumentsWithTypes: {'two': 'int', 'three': 'double'},
-        );
+      parameters: '(bool one, {int two})',
+      arguments: '(false, foo^ba: 2)',
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..completion.isEqualTo('two')
+            ..parameterType.isEqualTo('int')
+            ..hasReplacement(left: 3, right: 2)
+            ..hasSelection(offset: 3),
+        ]);
       },
     );
   }
 
   Future<void> test_named_24() async {
     await _tryParametersArguments(
+      parameters: '(bool one, {int two, double three})',
+      arguments: '(false, ^: 2)',
+      check: (response) {
+        check(response).suggestions.namedArguments.matchesInAnyOrder([
+          (suggestion) => suggestion
+            // TODO(scheglov) This does not seem right.
+            ..completion.isEqualTo('two: ')
+            ..parameterType.isEqualTo('int')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 5),
+          (suggestion) => suggestion
+            // TODO(scheglov) This does not seem right.
+            ..completion.isEqualTo('three: ')
+            ..parameterType.isEqualTo('double')
+            ..hasEmptyReplacement()
+            ..hasSelection(offset: 7),
+        ]);
+      },
+    );
+  }
+
+  Future<void> test_named_25() async {
+    await _tryParametersArguments(
       parameters: '({bool one, int two})',
       arguments: '(one: ^)',
-      check: () {
-        assertNoSuggestions();
+      check: (response) {
+        check(response).suggestions.namedArguments.isEmpty;
       },
     );
   }
@@ -651,12 +688,24 @@
     String? languageVersion,
     required String parameters,
     required String arguments,
-    required void Function() check,
+    required void Function(CompletionResponseForTesting response) check,
   }) async {
     var languageVersionLine = languageVersion != null
         ? '// @dart = $languageVersion'
         : '// no language version override';
 
+    Future<void> computeAndCheck() async {
+      await computeSuggestions();
+      check(
+        CompletionResponseForTesting(
+          requestOffset: completionOffset,
+          replacementOffset: replacementOffset,
+          replacementLength: replacementLength,
+          suggestions: suggestions,
+        ),
+      );
+    }
+
     // Annotation, local class.
     addTestSource2('''
 $languageVersionLine
@@ -666,8 +715,7 @@
 @A$arguments
 void f() {}
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Annotation, imported class.
     newFile('$testPackageLibPath/a.dart', content: '''
@@ -681,8 +729,7 @@
 @A$arguments
 void f() {}
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Annotation, imported class, prefixed.
     newFile('$testPackageLibPath/a.dart', content: '''
@@ -696,8 +743,7 @@
 @p.A$arguments
 void f() {}
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Function expression invocation.
     addTestSource2('''
@@ -706,8 +752,7 @@
 void f$parameters() {}
 var v = (f)$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Instance creation, local class, generative.
     addTestSource2('''
@@ -717,8 +762,7 @@
 }
 var v = A$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Instance creation, imported class, generative.
     newFile('$testPackageLibPath/a.dart', content: '''
@@ -731,8 +775,7 @@
 import 'a.dart';
 var v = A$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Instance creation, imported class, factory.
     newFile('$testPackageLibPath/a.dart', content: '''
@@ -745,8 +788,7 @@
 import 'a.dart';
 var v = A$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Method invocation, local method.
     addTestSource2('''
@@ -756,8 +798,7 @@
 }
 var v = A().foo$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Method invocation, local function.
     addTestSource2('''
@@ -765,8 +806,7 @@
 void f$parameters() {}
 var v = f$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Method invocation, imported function.
     newFile('$testPackageLibPath/a.dart', content: '''
@@ -777,8 +817,7 @@
 import 'a.dart';
 var v = f$arguments;
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Super constructor invocation.
     addTestSource2('''
@@ -790,8 +829,7 @@
   B() : super$arguments;
 }
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // This constructor invocation.
     addTestSource2('''
@@ -801,8 +839,7 @@
   A.named() : this$arguments;
 }
 ''');
-    await computeSuggestions();
-    check();
+    await computeAndCheck();
 
     // Invalid: getter invocation.
     // Parameters not used. Check not used.
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
new file mode 100644
index 0000000..669cf76
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -0,0 +1,148 @@
+// 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 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer_utilities/check/check.dart';
+
+class CompletionResponseForTesting {
+  final int requestOffset;
+  final int replacementOffset;
+  final int replacementLength;
+  final List<CompletionSuggestion> suggestions;
+
+  CompletionResponseForTesting({
+    required this.requestOffset,
+    required this.replacementOffset,
+    required this.replacementLength,
+    required this.suggestions,
+  });
+
+  factory CompletionResponseForTesting.legacy(
+    int requestOffset,
+    CompletionResultsParams parameters,
+  ) {
+    return CompletionResponseForTesting(
+      requestOffset: requestOffset,
+      replacementOffset: parameters.replacementOffset,
+      replacementLength: parameters.replacementLength,
+      suggestions: parameters.results,
+    );
+  }
+}
+
+/// A completion suggestion with the response for context.
+class CompletionSuggestionForTesting {
+  final CompletionResponseForTesting response;
+  final CompletionSuggestion suggestion;
+
+  CompletionSuggestionForTesting({
+    required this.response,
+    required this.suggestion,
+  });
+
+  /// Return the effective replacement length.
+  int get replacementLength =>
+      suggestion.replacementLength ?? response.replacementLength;
+
+  /// Return the effective replacement offset.
+  int get replacementOffset =>
+      suggestion.replacementOffset ?? response.replacementOffset;
+
+  @override
+  String toString() => '(completion: ${suggestion.completion})';
+}
+
+extension CompletionResponseExtension
+    on CheckTarget<CompletionResponseForTesting> {
+  CheckTarget<List<CompletionSuggestionForTesting>> get suggestions {
+    var suggestions = value.suggestions
+        .map((e) =>
+            CompletionSuggestionForTesting(response: value, suggestion: e))
+        .toList();
+    return nest(
+      suggestions,
+      (selected) => 'suggestions ${valueStr(selected)}',
+    );
+  }
+}
+
+extension CompletionSuggestionExtension
+    on CheckTarget<CompletionSuggestionForTesting> {
+  CheckTarget<String> get completion {
+    return nest(
+      value.suggestion.completion,
+      (selected) => 'has completion ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<String?> get parameterType {
+    return nest(
+      value.suggestion.parameterType,
+      (selected) => 'has parameterType ${valueStr(selected)}',
+    );
+  }
+
+  /// Return the effective replacement length.
+  CheckTarget<int> get replacementLength {
+    return nest(
+      value.replacementLength,
+      (selected) => 'has replacementLength ${valueStr(selected)}',
+    );
+  }
+
+  /// Return the effective replacement offset.
+  CheckTarget<int> get replacementOffset {
+    return nest(
+      value.replacementOffset,
+      (selected) => 'has replacementOffset ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<int> get selectionLength {
+    return nest(
+      value.suggestion.selectionLength,
+      (selected) => 'has selectionLength ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<int> get selectionOffset {
+    return nest(
+      value.suggestion.selectionOffset,
+      (selected) => 'has selectionOffset ${valueStr(selected)}',
+    );
+  }
+
+  /// Check that the effective replacement offset is the completion request
+  /// offset, and the length of the replacement is zero.
+  void hasEmptyReplacement() {
+    hasReplacement(left: 0, right: 0);
+  }
+
+  /// Check that the effective replacement offset is the completion request
+  /// offset minus [left], and the length of the replacement is `left + right`.
+  void hasReplacement({int left = 0, int right = 0}) {
+    replacementOffset.isEqualTo(value.response.requestOffset - left);
+    replacementLength.isEqualTo(left + right);
+  }
+
+  void hasSelection({required int offset, int length = 0}) {
+    selectionOffset.isEqualTo(offset);
+    selectionLength.isEqualTo(length);
+  }
+}
+
+extension CompletionSuggestionsExtension
+    on CheckTarget<Iterable<CompletionSuggestionForTesting>> {
+  CheckTarget<Iterable<CompletionSuggestionForTesting>> get namedArguments {
+    var result = value
+        .where((suggestion) =>
+            suggestion.suggestion.kind ==
+            CompletionSuggestionKind.NAMED_ARGUMENT)
+        .toList();
+    return nest(
+      result,
+      (selected) => 'named arguments ${valueStr(selected)}',
+    );
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 0b49b4e..6d7e98d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -334,8 +334,8 @@
 
   /// Compute [_constants] in all units.
   void _computeConstants() {
-    computeConstants(_typeProvider, _typeSystem, _declaredVariables,
-        _constants.toList(), _libraryElement.featureSet);
+    computeConstants(
+        _declaredVariables, _constants.toList(), _libraryElement.featureSet);
   }
 
   void _computeHints(FileState file, CompilationUnit unit) {
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index cb56ffe..b2b67c8 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -4,20 +4,14 @@
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/summary/link.dart' as graph
     show DependencyWalker, Node;
 
 /// Compute values of the given [constants] with correct ordering.
-void computeConstants(
-    TypeProvider typeProvider,
-    TypeSystemImpl typeSystem,
-    DeclaredVariables declaredVariables,
-    List<ConstantEvaluationTarget> constants,
-    FeatureSet featureSet) {
+void computeConstants(DeclaredVariables declaredVariables,
+    List<ConstantEvaluationTarget> constants, FeatureSet featureSet) {
   var walker = _ConstantWalker(declaredVariables, featureSet);
 
   for (var constant in constants) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 43e9949..0a2341a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1594,8 +1594,7 @@
   /// of formal parameters, are evaluated.
   void computeConstantDependencies() {
     if (!isConstantEvaluated) {
-      computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], library.featureSet);
+      computeConstants(context.declaredVariables, [this], library.featureSet);
     }
   }
 }
@@ -1680,8 +1679,7 @@
           '[reference: $reference]',
         );
       }
-      computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], library.featureSet);
+      computeConstants(context.declaredVariables, [this], library.featureSet);
     }
     return evaluationResult?.value;
   }
@@ -2031,9 +2029,8 @@
   @override
   DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      var library = compilationUnit.library;
-      computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], library.featureSet);
+      computeConstants(context.declaredVariables, [this],
+          compilationUnit.library.featureSet);
     }
     return evaluationResult?.value;
   }
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index d3ba759..2caa7a1 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -196,8 +196,8 @@
 
   /// Compute [_constants] in all units.
   void _computeConstants() {
-    computeConstants(_typeProvider, _typeSystem, _declaredVariables,
-        _constants.toList(), _libraryElement.featureSet);
+    computeConstants(
+        _declaredVariables, _constants.toList(), _libraryElement.featureSet);
   }
 
   void _computeDiagnostics({
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 8b32896..542e9ec 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -375,8 +375,6 @@
     );
 
     computeConstants(
-      typeProvider,
-      typeSystem,
       declaredVariables,
       dependencies,
       libraryElement.featureSet,
@@ -483,8 +481,6 @@
     var dependenciesFinder = ConstantExpressionsDependenciesFinder();
     node.accept(dependenciesFinder);
     computeConstants(
-      typeProvider,
-      typeSystem,
       declaredVariables,
       dependenciesFinder.dependencies.toList(),
       libraryElement.featureSet,
diff --git a/pkg/analyzer_utilities/lib/check/iterable.dart b/pkg/analyzer_utilities/lib/check/iterable.dart
index 0e3e0d3..e6415c3 100644
--- a/pkg/analyzer_utilities/lib/check/iterable.dart
+++ b/pkg/analyzer_utilities/lib/check/iterable.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer_utilities/check/check.dart';
 import 'package:meta/meta.dart';
+import 'package:test/test.dart' as test_package;
 
 extension IterableExtension<T> on CheckTarget<Iterable<T>> {
   void get isEmpty {
@@ -28,4 +29,51 @@
 
     return nest(actual, (length) => 'has length $length');
   }
+
+  /// Succeeds if the number of [matchers] is exactly the same as the number
+  /// of elements in [value], and for each matcher there is exactly one element
+  /// that matches.
+  void matchesInAnyOrder(
+    Iterable<void Function(CheckTarget<T> element)> matchers,
+  ) {
+    var elementList = value.toList();
+    var matcherList = matchers.toList();
+    if (elementList.length != matcherList.length) {
+      fail('Expected ${valueStr(matcherList.length)} elements, '
+          'actually ${valueStr(elementList.length)}');
+    }
+
+    for (var matcherIndex = 0;
+        matcherIndex < matcherList.length;
+        matcherIndex++) {
+      var matcher = matcherList[matcherIndex];
+      T? matchedElement;
+      for (var elementIndex = 0;
+          elementIndex < elementList.length;
+          elementIndex++) {
+        var element = elementList[elementIndex];
+        var elementTarget = nest(
+          element,
+          (element) =>
+              'element ${valueStr(element)} at ${valueStr(elementIndex)}',
+        );
+        // Jump to the next element if does not match.
+        try {
+          matcher(elementTarget);
+        } on test_package.TestFailure {
+          continue;
+        }
+        // The element matches, check that it is unique.
+        if (matchedElement == null) {
+          matchedElement = element;
+        } else {
+          fail('Already matched ${valueStr(matchedElement)}, '
+              'found ${valueStr(element)}');
+        }
+      }
+      if (matchedElement == null) {
+        fail('No match at ${valueStr(matcherIndex)}');
+      }
+    }
+  }
 }
diff --git a/pkg/analyzer_utilities/test/check/check_test.dart b/pkg/analyzer_utilities/test/check/check_test.dart
index 907438f..bab4572 100644
--- a/pkg/analyzer_utilities/test/check/check_test.dart
+++ b/pkg/analyzer_utilities/test/check/check_test.dart
@@ -96,6 +96,46 @@
         _fails(() => check(<int>[]).isNotEmpty);
         _fails(() => check(<int>{}).isNotEmpty);
       });
+      test('matchesInAnyOrder', () {
+        // Order does not matter.
+        check([0, 1]).matchesInAnyOrder([
+          (e) => e.isEqualTo(0),
+          (e) => e.isEqualTo(1),
+        ]);
+        check([0, 1]).matchesInAnyOrder([
+          (e) => e.isEqualTo(1),
+          (e) => e.isEqualTo(0),
+        ]);
+        // Matchers can be different.
+        check([0, 1]).matchesInAnyOrder([
+          (e) => e.isZero,
+          (e) => e.isEqualTo(1),
+        ]);
+        check([0, 10]).matchesInAnyOrder([
+          (e) => e.isZero,
+          (e) => e.isGreaterThan(5),
+        ]);
+        // Wrong number of matchers.
+        _fails(
+          () => check([0, 1]).matchesInAnyOrder([
+            (e) => e.isZero,
+          ]),
+        );
+        // The first matcher accepts more than one element.
+        _fails(
+          () => check([1, 2]).matchesInAnyOrder([
+            (e) => e.isGreaterThan(0),
+            (e) => e.isEqualTo(2),
+          ]),
+        );
+        // The second matcher accepts more than one element.
+        _fails(
+          () => check([1, 2]).matchesInAnyOrder([
+            (e) => e.isEqualTo(2),
+            (e) => e.isGreaterThan(0),
+          ]),
+        );
+      });
     });
     group('nullability', () {
       const int? notNullable = 0;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 7069199..70eeca3 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -125,7 +125,7 @@
 
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes);
 
@@ -351,12 +351,12 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     void build(String ignore, Builder declaration) {
       SourceMemberBuilder member = declaration as SourceMemberBuilder;
-      member.buildOutlineExpressions(library, coreTypes,
+      member.buildOutlineExpressions(library, classHierarchy,
           delayedActionPerformers, synthesizedFunctionNodes);
     }
 
@@ -365,7 +365,7 @@
     if (typeVariables != null) {
       for (int i = 0; i < typeVariables!.length; i++) {
         typeVariables![i].buildOutlineExpressions(library, this, null,
-            coreTypes, delayedActionPerformers, scope.parent!);
+            classHierarchy, delayedActionPerformers, scope.parent!);
       }
     }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index c91f09f..c2e155b 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -5,7 +5,8 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/type_algebra.dart';
 
 import '../builder/library_builder.dart';
 
@@ -41,12 +42,16 @@
 import '../util/helpers.dart' show DelayedActionPerformer;
 
 import 'builder.dart';
+import 'class_builder.dart';
 import 'field_builder.dart';
 import 'formal_parameter_builder.dart';
 import 'function_builder.dart';
 import 'member_builder.dart';
 import 'metadata_builder.dart';
+import 'named_type_builder.dart';
+import 'type_alias_builder.dart';
 import 'type_builder.dart';
+import 'type_declaration_builder.dart';
 import 'type_variable_builder.dart';
 
 abstract class ConstructorBuilder implements FunctionBuilder {
@@ -75,6 +80,13 @@
 
   Constructor get actualConstructor => _constructor;
 
+  bool _hasFormalsInferred = false;
+
+  final bool _hasSuperInitializingFormals;
+
+  final List<SynthesizedFunctionNode> _superParameterDefaultValueCloners =
+      <SynthesizedFunctionNode>[];
+
   SourceConstructorBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
@@ -106,6 +118,8 @@
             charOffset,
             tearOffReference,
             forAbstractClassOrEnum: forAbstractClassOrEnum),
+        _hasSuperInitializingFormals =
+            formals?.any((formal) => formal.isSuperInitializingFormal) ?? false,
         super(metadata, modifiers, returnType, name, typeVariables, formals,
             compilationUnit, charOffset, nativeMethodName);
 
@@ -190,7 +204,8 @@
     if (formals != null) {
       bool needsInference = false;
       for (FormalParameterBuilder formal in formals!) {
-        if (formal.type == null && formal.isInitializingFormal) {
+        if (formal.type == null &&
+            (formal.isInitializingFormal || formal.isSuperInitializingFormal)) {
           formal.variable!.type = const UnknownType();
           needsInference = true;
         }
@@ -208,13 +223,205 @@
   }
 
   /// Infers the types of any untyped initializing formals.
-  void inferFormalTypes() {
+  void inferFormalTypes(ClassHierarchy classHierarchy) {
+    if (_hasFormalsInferred) return;
     if (formals != null) {
       for (FormalParameterBuilder formal in formals!) {
-        if (formal.type == null && formal.isInitializingFormal) {
-          formal.finalizeInitializingFormal(classBuilder);
+        if (formal.type == null) {
+          if (formal.isInitializingFormal) {
+            formal.finalizeInitializingFormal(classBuilder);
+          }
         }
       }
+
+      if (_hasSuperInitializingFormals) {
+        if (beginInitializers != null) {
+          BodyBuilder bodyBuilder = library.loader
+              .createBodyBuilderForOutlineExpression(
+                  library, classBuilder, this, classBuilder.scope, fileUri);
+          bodyBuilder.constantContext = ConstantContext.required;
+          bodyBuilder.parseInitializers(beginInitializers!,
+              doFinishConstructor: false);
+        }
+        finalizeSuperInitializingFormals(
+            classHierarchy, _superParameterDefaultValueCloners);
+      }
+    }
+    _hasFormalsInferred = true;
+  }
+
+  /* ConstructorBuilder | DillConstructorBuilder */
+  Object? _computeSuperTargetBuilder() {
+    Constructor superTarget;
+    ClassBuilder superclassBuilder;
+
+    TypeBuilder? supertype = classBuilder.supertypeBuilder;
+    if (supertype is NamedTypeBuilder) {
+      TypeDeclarationBuilder? declaration = supertype.declaration;
+      if (declaration is ClassBuilder) {
+        superclassBuilder = declaration;
+      } else if (declaration is TypeAliasBuilder) {
+        declaration = declaration.unaliasDeclaration(supertype.arguments);
+        if (declaration is ClassBuilder) {
+          superclassBuilder = declaration;
+        } else {
+          // The error in this case should be reported elsewhere.
+          return null;
+        }
+      } else {
+        // The error in this case should be reported elsewhere.
+        return null;
+      }
+    } else {
+      // The error in this case should be reported elsewhere.
+      return null;
+    }
+
+    if (constructor.initializers.isNotEmpty &&
+        constructor.initializers.last is SuperInitializer) {
+      superTarget = (constructor.initializers.last as SuperInitializer).target;
+    } else {
+      MemberBuilder? memberBuilder = superclassBuilder.constructors
+          .lookup("", charOffset, library.fileUri);
+      if (memberBuilder is ConstructorBuilder) {
+        superTarget = memberBuilder.constructor;
+      } else if (memberBuilder is DillConstructorBuilder) {
+        superTarget = memberBuilder.constructor;
+      } else {
+        // The error in this case should be reported elsewhere.
+        return null;
+      }
+    }
+
+    MemberBuilder? constructorBuilder =
+        superclassBuilder.findConstructorOrFactory(
+            superTarget.name.text, charOffset, library.fileUri, library);
+    return constructorBuilder is ConstructorBuilder ||
+            constructorBuilder is DillConstructorBuilder
+        ? constructorBuilder
+        : null;
+  }
+
+  void finalizeSuperInitializingFormals(ClassHierarchy classHierarchy,
+      List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+    if (formals == null) return;
+    if (!_hasSuperInitializingFormals) return;
+
+    void performRecoveryForErroneousCase() {
+      for (FormalParameterBuilder formal in formals!) {
+        if (formal.isSuperInitializingFormal) {
+          formal.variable!.type = const DynamicType();
+        }
+      }
+    }
+
+    Object? superTargetBuilder = _computeSuperTargetBuilder();
+    Constructor superTarget;
+    List<FormalParameterBuilder>? superFormals;
+    if (superTargetBuilder is SourceConstructorBuilder) {
+      superTarget = superTargetBuilder.constructor;
+      superFormals = superTargetBuilder.formals!;
+    } else if (superTargetBuilder is DillConstructorBuilder) {
+      superTarget = superTargetBuilder.constructor;
+      if (superTargetBuilder is SyntheticConstructorBuilder) {
+        superFormals = superTargetBuilder.formals;
+      } else {
+        // The error in this case should be reported elsewhere. Here we perform
+        // a simple recovery.
+        return performRecoveryForErroneousCase();
+      }
+    } else {
+      // The error in this case should be reported elsewhere. Here we perform a
+      // simple recovery.
+      return performRecoveryForErroneousCase();
+    }
+
+    if (superFormals == null) {
+      // The error in this case should be reported elsewhere. Here we perform a
+      // simple recovery.
+      return performRecoveryForErroneousCase();
+    }
+
+    if (superTargetBuilder is SourceConstructorBuilder) {
+      superTargetBuilder.inferFormalTypes(classHierarchy);
+    } else if (superTargetBuilder is SyntheticConstructorBuilder) {
+      MemberBuilder? superTargetOriginBuilder = superTargetBuilder.actualOrigin;
+      if (superTargetOriginBuilder is SourceConstructorBuilder) {
+        superTargetOriginBuilder.inferFormalTypes(classHierarchy);
+      }
+    }
+
+    int superInitializingFormalIndex = -1;
+    List<int>? positionalSuperParameters;
+    List<String>? namedSuperParameters;
+
+    Supertype? supertype = classHierarchy.getClassAsInstanceOf(
+        classBuilder.cls, superTarget.enclosingClass);
+    assert(supertype != null);
+    Map<TypeParameter, DartType> substitution =
+        new Map<TypeParameter, DartType>.fromIterables(
+            supertype!.classNode.typeParameters, supertype.typeArguments);
+
+    for (int formalIndex = 0; formalIndex < formals!.length; formalIndex++) {
+      FormalParameterBuilder formal = formals![formalIndex];
+      if (formal.isSuperInitializingFormal) {
+        superInitializingFormalIndex++;
+        bool hasImmediatelyDeclaredInitializer = formal.hasDeclaredInitializer;
+        if (formal.type == null) {
+          DartType? type;
+
+          if (formal.isPositional) {
+            if (superInitializingFormalIndex < superFormals.length) {
+              FormalParameterBuilder correspondingSuperFormal =
+                  superFormals[superInitializingFormalIndex];
+              formal.hasDeclaredInitializer =
+                  hasImmediatelyDeclaredInitializer ||
+                      correspondingSuperFormal.hasDeclaredInitializer;
+              if (!hasImmediatelyDeclaredInitializer) {
+                (positionalSuperParameters ??= <int>[]).add(formalIndex);
+              }
+              type = correspondingSuperFormal.variable!.type;
+            } else {
+              // TODO(cstefantsova): Report an error.
+            }
+          } else {
+            FormalParameterBuilder? correspondingSuperFormal;
+            for (FormalParameterBuilder superFormal in superFormals) {
+              if (superFormal.isNamed && superFormal.name == formal.name) {
+                correspondingSuperFormal = superFormal;
+                break;
+              }
+            }
+
+            if (correspondingSuperFormal != null) {
+              formal.hasDeclaredInitializer =
+                  hasImmediatelyDeclaredInitializer ||
+                      correspondingSuperFormal.hasDeclaredInitializer;
+              if (!hasImmediatelyDeclaredInitializer) {
+                (namedSuperParameters ??= <String>[]).add(formal.name);
+              }
+              type = correspondingSuperFormal.variable!.type;
+            } else {
+              // TODO(cstefantsova): Report an error.
+            }
+          }
+
+          if (substitution.isNotEmpty && type != null) {
+            type = substitute(type, substitution);
+          }
+          formal.variable!.type = type ?? const DynamicType();
+        } else {
+          formal.variable!.type = const DynamicType();
+        }
+      }
+    }
+
+    if (positionalSuperParameters != null || namedSuperParameters != null) {
+      synthesizedFunctionNodes.add(new SynthesizedFunctionNode(
+          substitution, superTarget.function, constructor.function,
+          positionalSuperParameters: positionalSuperParameters ?? const <int>[],
+          namedSuperParameters: namedSuperParameters ?? const <String>[],
+          isOutlineNode: true));
     }
   }
 
@@ -223,34 +430,52 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     if (_hasBuiltOutlines) return;
     if (isConst && isPatch) {
-      origin.buildOutlineExpressions(library, coreTypes,
+      origin.buildOutlineExpressions(library, classHierarchy,
           delayedActionPerformers, synthesizedFunctionNodes);
     }
-    super.buildOutlineExpressions(
-        library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+    super.buildOutlineExpressions(library, classHierarchy,
+        delayedActionPerformers, synthesizedFunctionNodes);
 
     // For modular compilation purposes we need to include initializers
-    // for const constructors into the outline.
-    if (isConst && beginInitializers != null) {
+    // for const constructors into the outline. We also need to parse
+    // initializers to infer types of the super-initializing parameters.
+    if ((isConst || _hasSuperInitializingFormals) &&
+        beginInitializers != null) {
       BodyBuilder bodyBuilder = library.loader
           .createBodyBuilderForOutlineExpression(
               library, classBuilder, this, classBuilder.scope, fileUri);
       bodyBuilder.constantContext = ConstantContext.required;
-      bodyBuilder.parseInitializers(beginInitializers!);
+      bodyBuilder.parseInitializers(beginInitializers!,
+          doFinishConstructor: isConst);
       bodyBuilder.performBacklogComputations(delayedActionPerformers);
     }
     beginInitializers = null;
+    addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
     if (isConst && isPatch) {
       _finishPatch();
     }
     _hasBuiltOutlines = true;
   }
 
+  void addSuperParameterDefaultValueCloners(
+      List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+    Object? superTargetBuilder = _computeSuperTargetBuilder();
+    if (superTargetBuilder is SourceConstructorBuilder) {
+      superTargetBuilder
+          .addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+    } else if (superTargetBuilder is SyntheticConstructorBuilder) {
+      superTargetBuilder
+          .addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+    }
+    synthesizedFunctionNodes.addAll(_superParameterDefaultValueCloners);
+    _superParameterDefaultValueCloners.clear();
+  }
+
   @override
   void buildFunction(SourceLibraryBuilder library) {
     // According to the specification §9.3 the return type of a constructor
@@ -460,21 +685,40 @@
 
 class SyntheticConstructorBuilder extends DillConstructorBuilder
     with SourceMemberBuilderMixin {
-  SourceMemberBuilder? _origin;
+  // TODO(johnniwinther,cstefantsova): Rename [_origin] to avoid the confusion
+  // with patches.
+  // TODO(johnniwinther): Change the type of [_origin] to SourceMemberBuilder
+  // when it's the supertype for both old SourceMemberBuilder and
+  // SyntheticConstructorBuilder.
+  MemberBuilder? _origin;
   SynthesizedFunctionNode? _synthesizedFunctionNode;
 
   SyntheticConstructorBuilder(SourceClassBuilder parent,
       Constructor constructor, Procedure? constructorTearOff,
-      {SourceMemberBuilder? origin,
-      SynthesizedFunctionNode? synthesizedFunctionNode})
+      {MemberBuilder? origin, SynthesizedFunctionNode? synthesizedFunctionNode})
       : _origin = origin,
         _synthesizedFunctionNode = synthesizedFunctionNode,
         super(constructor, constructorTearOff, parent);
 
+  // TODO(johnniwinther,cstefantsova): Rename [actualOrigin] to avoid the
+  //  confusion with patches.
+  MemberBuilder? get actualOrigin {
+    MemberBuilder? origin = _origin;
+    while (origin is SyntheticConstructorBuilder) {
+      origin = origin._origin;
+    }
+    return origin;
+  }
+
+  List<FormalParameterBuilder>? get formals {
+    MemberBuilder? origin = actualOrigin;
+    return origin is SourceConstructorBuilder ? origin.formals : null;
+  }
+
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder libraryBuilder,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     if (_origin != null) {
@@ -483,12 +727,32 @@
       if (originLibraryBuilder is SourceLibraryBuilder) {
         // If [_origin] is from a source library, we need to build the default
         // values and initializers first.
-        _origin!.buildOutlineExpressions(originLibraryBuilder, coreTypes,
-            delayedActionPerformers, synthesizedFunctionNodes);
+        MemberBuilder origin = _origin!;
+        if (origin is SourceConstructorBuilder) {
+          origin.buildOutlineExpressions(originLibraryBuilder, classHierarchy,
+              delayedActionPerformers, synthesizedFunctionNodes);
+        } else if (origin is SyntheticConstructorBuilder) {
+          origin.buildOutlineExpressions(originLibraryBuilder, classHierarchy,
+              delayedActionPerformers, synthesizedFunctionNodes);
+        }
       }
-      _synthesizedFunctionNode!.cloneDefaultValues();
-      _synthesizedFunctionNode = null;
+      addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
       _origin = null;
     }
   }
+
+  void addSuperParameterDefaultValueCloners(
+      List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+    MemberBuilder? origin = _origin;
+    if (origin is SourceConstructorBuilder) {
+      origin.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+    } else if (origin is SyntheticConstructorBuilder) {
+      origin.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+    }
+    if (_synthesizedFunctionNode != null) {
+      synthesizedFunctionNodes
+          .add(_synthesizedFunctionNode!..isOutlineNode = true);
+      _synthesizedFunctionNode = null;
+    }
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index a72ac97..1253322 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -27,7 +27,7 @@
         StringLiteral,
         SuperInitializer,
         ThisExpression;
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 
@@ -467,7 +467,7 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder libraryBuilder,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     List<Expression> values = <Expression>[];
@@ -486,7 +486,7 @@
     SourceFieldBuilder valuesBuilder =
         firstMemberNamed("values") as SourceFieldBuilder;
     valuesBuilder.buildBody(
-        coreTypes,
+        classHierarchy.coreTypes,
         new ListLiteral(values,
             typeArgument: rawType(library.nonNullable), isConst: true));
     SourceConstructorBuilder constructorBuilder =
@@ -508,7 +508,7 @@
             new IntLiteral(index++),
             new StringLiteral(constant),
           ]);
-          field.buildBody(coreTypes,
+          field.buildBody(classHierarchy.coreTypes,
               new ConstructorInvocation(constructor, arguments, isConst: true));
         }
       }
@@ -533,8 +533,8 @@
       ]));
     } else {}
 
-    super.buildOutlineExpressions(
-        library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+    super.buildOutlineExpressions(library, classHierarchy,
+        delayedActionPerformers, synthesizedFunctionNodes);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index fabf10a..95e42ab 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import '../fasta_codes.dart'
     show templateInternalProblemNotFoundIn, templateTypeArgumentMismatch;
@@ -37,7 +37,7 @@
 
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes);
 
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 86c7b96..9d3f52d 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/type_algebra.dart';
 
 import '../dill/dill_member_builder.dart';
@@ -167,12 +167,12 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     if (_hasBuiltOutlines) return;
-    super.buildOutlineExpressions(
-        library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+    super.buildOutlineExpressions(library, classHierarchy,
+        delayedActionPerformers, synthesizedFunctionNodes);
     _hasBuiltOutlines = true;
   }
 
@@ -374,16 +374,16 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     if (_hasBuiltOutlines) return;
     if (isConst && isPatch) {
-      origin.buildOutlineExpressions(library, coreTypes,
+      origin.buildOutlineExpressions(library, classHierarchy,
           delayedActionPerformers, synthesizedFunctionNodes);
     }
-    super.buildOutlineExpressions(
-        library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+    super.buildOutlineExpressions(library, classHierarchy,
+        delayedActionPerformers, synthesizedFunctionNodes);
     RedirectingFactoryBody redirectingFactoryBody =
         _procedureInternal.function.body as RedirectingFactoryBody;
     List<DartType>? typeArguments = redirectingFactoryBody.typeArguments;
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 8a69632..251ad96 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -7,6 +7,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/src/legacy_erasure.dart';
 import 'package:kernel/type_algebra.dart';
@@ -419,10 +420,10 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
-    _fieldEncoding.completeSignature(coreTypes);
+    _fieldEncoding.completeSignature(classHierarchy.coreTypes);
 
     for (Annotatable annotatable in _fieldEncoding.annotatables) {
       MetadataBuilder.buildAnnotations(
@@ -464,7 +465,7 @@
             bodyBuilder.transformCollections, library.library);
         initializer = wrapper.operand;
       }
-      buildBody(coreTypes, initializer);
+      buildBody(classHierarchy.coreTypes, initializer);
       bodyBuilder.performBacklogComputations(delayedActionPerformers);
     }
     _constInitializerToken = null;
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 9fda3a8..1390968 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -5,7 +5,7 @@
 library fasta.procedure_builder;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import '../identifiers.dart';
 import '../scope.dart';
@@ -446,7 +446,7 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     if (!_hasBuiltOutlineExpressions) {
@@ -463,7 +463,7 @@
               library,
               classOrExtensionBuilder,
               this,
-              coreTypes,
+              classHierarchy,
               delayedActionPerformers,
               computeTypeParameterScope(parentScope));
         }
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index d3e08e6..954097a 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -5,7 +5,7 @@
 library fasta.member_builder;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import '../../base/common.dart';
 
@@ -174,7 +174,7 @@
 
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes);
 }
@@ -223,7 +223,7 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {}
 
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 2430ab7a..077db8d 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -6,7 +6,7 @@
 
 import 'package:kernel/ast.dart'
     show DartType, Nullability, TypeParameter, TypeParameterType;
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import '../fasta_codes.dart'
     show
@@ -201,7 +201,7 @@
       SourceLibraryBuilder libraryBuilder,
       DeclarationBuilder? classOrExtensionBuilder,
       MemberBuilder? memberBuilder,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       Scope scope) {
     MetadataBuilder.buildAnnotations(parameter, metadata, libraryBuilder,
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index 097bdc1..01f0010 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import '../builder/extension_builder.dart';
 import '../builder/library_builder.dart';
@@ -108,7 +108,7 @@
   @override
   void buildOutlineExpressions(
       LibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     // TODO(johnniwinther): Remove the need for this.
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 d8fbe1d..3c7b280 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1085,7 +1085,8 @@
       for (int i = 0; i < formals.parameters!.length; i++) {
         FormalParameterBuilder parameter = formals.parameters![i];
         Expression? initializer = parameter.variable!.initializer;
-        if (parameter.isOptional || initializer != null) {
+        if (!parameter.isSuperInitializingFormal &&
+            (parameter.isOptional || initializer != null)) {
           if (!parameter.initializerWasInferred) {
             parameter.initializerWasInferred = true;
             if (parameter.isOptional) {
@@ -1621,7 +1622,7 @@
     return fakeReturn.expression!;
   }
 
-  void parseInitializers(Token token) {
+  void parseInitializers(Token token, {bool doFinishConstructor = true}) {
     Parser parser = new Parser(this,
         useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     if (!token.isEof) {
@@ -1630,10 +1631,10 @@
     } else {
       handleNoInitializers();
     }
-    // We are passing [AsyncMarker.Sync] because the error will be reported
-    // already.
-    finishConstructor(
-        member as SourceConstructorBuilder, AsyncMarker.Sync, null);
+    if (doFinishConstructor) {
+      finishConstructor(
+          member as SourceConstructorBuilder, AsyncMarker.Sync, null);
+    }
   }
 
   Expression parseFieldInitializer(Token token) {
@@ -1724,11 +1725,13 @@
                   ]);
             } else {
               arguments.positional.addAll(positionalSuperParametersAsArguments);
+              setParents(positionalSuperParametersAsArguments, arguments);
             }
           }
           if (namedSuperParametersAsArguments != null) {
             // TODO(cstefantsova): Report name conflicts.
             arguments.named.addAll(namedSuperParametersAsArguments);
+            setParents(namedSuperParametersAsArguments, arguments);
           }
 
           LocatedMessage? message = checkArgumentsForFunction(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
index bf49dae..8dba882 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
@@ -35,9 +35,52 @@
   /// named parameters.
   final bool identicalSignatures;
 
+  final List<int>? _positionalSuperParameters;
+
+  final List<String>? _namedSuperParameters;
+
+  bool isOutlineNode;
+
   SynthesizedFunctionNode(
       this._typeSubstitution, this._original, this._synthesized,
-      {this.identicalSignatures: true});
+      {this.identicalSignatures: true,
+      List<int>? positionalSuperParameters: null,
+      List<String>? namedSuperParameters: null,
+      this.isOutlineNode: false})
+      : _positionalSuperParameters = positionalSuperParameters,
+        _namedSuperParameters = namedSuperParameters,
+        // Check that [positionalSuperParameters] and [namedSuperParameters] are
+        // provided or omitted together.
+        assert((positionalSuperParameters == null) ==
+            (namedSuperParameters == null)),
+        assert(positionalSuperParameters == null ||
+            () {
+              // Check that [positionalSuperParameters] is sorted if it's
+              // provided.
+              for (int i = 1; i < positionalSuperParameters.length; i++) {
+                if (positionalSuperParameters[i] <
+                    positionalSuperParameters[i - 1]) {
+                  return false;
+                }
+              }
+              return true;
+            }()),
+        assert(namedSuperParameters == null ||
+            () {
+              // Check that [namedSuperParameters] are the subset of and in the
+              // same order as the named parameters of [_synthesized].
+              int superParameterIndex = 0;
+              for (int namedParameterIndex = 0;
+                  namedParameterIndex < _synthesized.namedParameters.length &&
+                      superParameterIndex < namedSuperParameters.length;
+                  namedParameterIndex++) {
+                if (_synthesized.namedParameters[namedParameterIndex].name ==
+                    namedSuperParameters[superParameterIndex]) {
+                  ++superParameterIndex;
+                }
+              }
+              return superParameterIndex == namedSuperParameters.length;
+            }());
 
   void cloneDefaultValues() {
     // TODO(ahe): It is unclear if it is legal to use type variables in
@@ -63,17 +106,40 @@
     // unrelated.
 
     if (identicalSignatures) {
-      assert(_synthesized.positionalParameters.length ==
-          _original.positionalParameters.length);
-      for (int i = 0; i < _synthesized.positionalParameters.length; i++) {
-        cloneInitializer(_original.positionalParameters[i],
-            _synthesized.positionalParameters[i]);
+      assert(_positionalSuperParameters != null ||
+          _synthesized.positionalParameters.length ==
+              _original.positionalParameters.length);
+      List<int>? positionalSuperParameters = _positionalSuperParameters;
+      int superParameterIndex = 0;
+      for (int i = 0; i < _original.positionalParameters.length; i++) {
+        if (positionalSuperParameters == null) {
+          cloneInitializer(_original.positionalParameters[i],
+              _synthesized.positionalParameters[i]);
+        } else if (superParameterIndex < positionalSuperParameters.length &&
+            positionalSuperParameters[superParameterIndex] == i) {
+          cloneInitializer(_original.positionalParameters[i],
+              _synthesized.positionalParameters[superParameterIndex]);
+          superParameterIndex++;
+        }
       }
-      assert(_synthesized.namedParameters.length ==
-          _original.namedParameters.length);
-      for (int i = 0; i < _synthesized.namedParameters.length; i++) {
-        cloneInitializer(
-            _original.namedParameters[i], _synthesized.namedParameters[i]);
+
+      assert(_namedSuperParameters != null ||
+          _synthesized.namedParameters.length ==
+              _original.namedParameters.length);
+      List<String>? namedSuperParameters = _namedSuperParameters;
+      superParameterIndex = 0;
+      for (int i = 0; i < _original.namedParameters.length; i++) {
+        if (namedSuperParameters == null) {
+          cloneInitializer(
+              _original.namedParameters[i], _synthesized.namedParameters[i]);
+        } else if (superParameterIndex < namedSuperParameters.length &&
+            namedSuperParameters[superParameterIndex] ==
+                _original.namedParameters[i].name) {
+          // TODO(cstefantsova): Handle the erroneous case of missing names.
+          cloneInitializer(_original.namedParameters[i],
+              _synthesized.namedParameters[superParameterIndex]);
+          superParameterIndex++;
+        }
       }
     } else {
       for (int i = 0; i < _synthesized.positionalParameters.length; i++) {
@@ -110,6 +176,12 @@
       }
     }
   }
+
+  @override
+  String toString() {
+    return "SynthesizedFunctionNode(original=${_original.parent}, "
+        "synthesized=${_synthesized.parent})";
+  }
 }
 
 class TypeDependency {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 2070ba302..4167fe9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -416,9 +416,10 @@
       loader.addNoSuchMethodForwarders(sourceClassBuilders);
       loader.checkMixins(sourceClassBuilders);
       loader.buildOutlineExpressions(
-          loader.coreTypes, synthesizedFunctionNodes);
+          loader.hierarchy, synthesizedFunctionNodes);
       loader.checkTypes();
       loader.checkRedirectingFactories(sourceClassBuilders);
+      finishSynthesizedParameters(forOutline: true);
       loader.checkMainMethods();
       installAllComponentProblems(loader.allComponentProblems);
       loader.allComponentProblems.clear();
@@ -884,22 +885,26 @@
     }
     return new SyntheticConstructorBuilder(
         classBuilder, constructor, constructorTearOff,
-        // If the constructor is constant, the default values must be part of
-        // the outline expressions. We pass on the original constructor and
-        // cloned function nodes to ensure that the default values are computed
-        // and cloned for the outline.
-        origin: isConst && superConstructorBuilder is SourceMemberBuilder
-            ? superConstructorBuilder
-            : null,
-        synthesizedFunctionNode: isConst ? synthesizedFunctionNode : null);
+        // We pass on the original constructor and the cloned function nodes to
+        // ensure that the default values are computed and cloned for the
+        // outline. It is needed to make the default values a part of the
+        // outline for const constructors, and additionally it is required for
+        // a potential subclass using super initializing parameters that will
+        // required the cloning of the default values.
+        origin: superConstructorBuilder,
+        synthesizedFunctionNode: synthesizedFunctionNode);
   }
 
-  void finishSynthesizedParameters() {
+  void finishSynthesizedParameters({bool forOutline = false}) {
     for (SynthesizedFunctionNode synthesizedFunctionNode
         in synthesizedFunctionNodes) {
-      synthesizedFunctionNode.cloneDefaultValues();
+      if (!forOutline || synthesizedFunctionNode.isOutlineNode) {
+        synthesizedFunctionNode.cloneDefaultValues();
+      }
     }
-    synthesizedFunctionNodes.clear();
+    if (!forOutline) {
+      synthesizedFunctionNodes.clear();
+    }
     ticker.logMs("Cloned default values of formals");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index af11d4d..840e400 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -5,7 +5,7 @@
 library fasta.scope;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import 'builder/builder.dart';
 import 'builder/extension_builder.dart';
@@ -820,7 +820,7 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     throw new UnsupportedError(
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 367808c..f60505d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -7,7 +7,6 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart'
     show ClassHierarchy, ClassHierarchyMembers;
-import 'package:kernel/core_types.dart';
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 import 'package:kernel/src/bounds_checks.dart';
 import 'package:kernel/src/legacy_erasure.dart';
@@ -1927,7 +1926,7 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     // Do nothing.
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 7e37aee..e17ec41 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/type_environment.dart';
 
 import '../../base/common.dart';
@@ -282,7 +282,7 @@
   @override
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     MetadataBuilder.buildAnnotations(isPatch ? origin.extension : extension,
@@ -290,13 +290,13 @@
     if (typeParameters != null) {
       for (int i = 0; i < typeParameters!.length; i++) {
         typeParameters![i].buildOutlineExpressions(library, this, null,
-            coreTypes, delayedActionPerformers, scope.parent!);
+            classHierarchy, delayedActionPerformers, scope.parent!);
       }
     }
 
     void build(String ignore, Builder declaration) {
       SourceMemberBuilder member = declaration as SourceMemberBuilder;
-      member.buildOutlineExpressions(library, coreTypes,
+      member.buildOutlineExpressions(library, classHierarchy,
           delayedActionPerformers, synthesizedFunctionNodes);
     }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index cfa2f08..b7551de 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -17,7 +17,6 @@
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
-import 'package:kernel/core_types.dart';
 
 import 'package:kernel/reference_from_index.dart'
     show IndexedClass, IndexedContainer, IndexedLibrary;
@@ -2580,8 +2579,11 @@
     }
     if (constructorBuilder.isConst) {
       currentTypeParameterScopeBuilder.declaresConstConstructor = true;
+    }
+    if (constructorBuilder.isConst || enableSuperParametersInLibrary) {
       // const constructors will have their initializers compiled and written
-      // into the outline.
+      // into the outline. In case of super-parameters language feature, the
+      // super initializers are required to infer the types of super parameters.
       constructorBuilder.beginInitializers =
           beginInitializers ?? new Token.eof(-1);
     }
@@ -2972,14 +2974,14 @@
   }
 
   void buildOutlineExpressions(
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes,
       List<DelayedActionPerformer> delayedActionPerformers) {
     Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
     if (patches != null) {
       for (SourceLibraryBuilder patchLibrary in patches) {
         patchLibrary.buildOutlineExpressions(
-            coreTypes, synthesizedFunctionNodes, delayedActionPerformers);
+            classHierarchy, synthesizedFunctionNodes, delayedActionPerformers);
       }
     }
 
@@ -2990,17 +2992,17 @@
     while (iterator.moveNext()) {
       Builder declaration = iterator.current;
       if (declaration is ClassBuilder) {
-        declaration.buildOutlineExpressions(
-            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+        declaration.buildOutlineExpressions(this, classHierarchy,
+            delayedActionPerformers, synthesizedFunctionNodes);
       } else if (declaration is ExtensionBuilder) {
-        declaration.buildOutlineExpressions(
-            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+        declaration.buildOutlineExpressions(this, classHierarchy,
+            delayedActionPerformers, synthesizedFunctionNodes);
       } else if (declaration is SourceMemberBuilder) {
-        declaration.buildOutlineExpressions(
-            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+        declaration.buildOutlineExpressions(this, classHierarchy,
+            delayedActionPerformers, synthesizedFunctionNodes);
       } else if (declaration is SourceTypeAliasBuilder) {
-        declaration.buildOutlineExpressions(
-            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+        declaration.buildOutlineExpressions(this, classHierarchy,
+            delayedActionPerformers, synthesizedFunctionNodes);
       } else {
         assert(
             declaration is PrefixBuilder ||
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 48f3241..b7bcf7a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1948,13 +1948,13 @@
     ticker.logMs("Checked mixin declaration applications");
   }
 
-  void buildOutlineExpressions(CoreTypes coreTypes,
+  void buildOutlineExpressions(ClassHierarchy classHierarchy,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     List<DelayedActionPerformer> delayedActionPerformers =
         <DelayedActionPerformer>[];
     for (SourceLibraryBuilder library in sourceLibraryBuilders) {
       library.buildOutlineExpressions(
-          coreTypes, synthesizedFunctionNodes, delayedActionPerformers);
+          classHierarchy, synthesizedFunctionNodes, delayedActionPerformers);
     }
     for (DelayedActionPerformer delayedActionPerformer
         in delayedActionPerformers) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index 9585ec4..7ff533d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -6,8 +6,7 @@
 
 import 'package:front_end/src/fasta/kernel/expression_generator_helper.dart';
 import 'package:kernel/ast.dart';
-
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
 
 import 'package:kernel/type_algebra.dart'
     show FreshTypeParameters, getFreshTypeParameters;
@@ -258,7 +257,7 @@
 
   void buildOutlineExpressions(
       SourceLibraryBuilder library,
-      CoreTypes coreTypes,
+      ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     MetadataBuilder.buildAnnotations(
@@ -269,7 +268,7 @@
             library,
             null,
             null,
-            coreTypes,
+            classHierarchy,
             delayedActionPerformers,
             computeTypeParameterScope(library.scope));
       }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 34aa46b..407f747 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -154,7 +154,7 @@
     // Field types have all been inferred so we don't need to guard against
     // cyclic dependency.
     for (SourceConstructorBuilder builder in toBeInferred.values) {
-      builder.inferFormalTypes();
+      builder.inferFormalTypes(classHierarchy);
     }
     toBeInferred.clear();
     for (TypeDependency typeDependency in typeDependencies.values) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index ad23808..1107037 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -405,7 +405,7 @@
     } else if ((constructor = engine.toBeInferred[target]) != null) {
       engine.toBeInferred.remove(target);
       engine.beingInferred[target] = constructor!;
-      constructor.inferFormalTypes();
+      constructor.inferFormalTypes(classHierarchy);
       engine.beingInferred.remove(target);
     }
   }
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 39c9d6c..3f775f2 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -475,6 +475,7 @@
 clone
 cloned
 cloner
+cloners
 clones
 cloning
 close
@@ -586,6 +587,7 @@
 conformed
 confuse
 confused
+confusion
 conjunction
 connect
 connected
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index ea9623a..5452103 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -934,6 +934,7 @@
 t4b
 t\b\f\u
 t\u0008\f\u
+ta
 tails
 talk
 templates
@@ -974,7 +975,10 @@
 trivially
 truncated
 tt
+tta
 ttest
+ttta
+tttta
 txt
 typeargs
 typeparam
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
index 37b4b1f..dfa0d03 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
@@ -34,7 +34,7 @@
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
-  synthetic constructor •([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = 0]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -51,7 +51,7 @@
     return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
-  synthetic constructor •([core::int field]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = 0]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
index c282d10..16c614a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
@@ -24,7 +24,7 @@
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
-  synthetic constructor •([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = 0]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -35,7 +35,7 @@
     ;
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
-  synthetic constructor •([core::int field]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = 0]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
index 2950126..60cff2d 100644
--- a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
@@ -18,10 +18,10 @@
 import "org-dartlang-testcase:///m_lib.dart";
 
 abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
-  synthetic constructor •({core::double d, (core::String) → core::String s}) → self2::_B&A&M
+  synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → self2::_B&A&M
     : super a_l::A::•(d: d, s: s)
     ;
-  synthetic constructor factoryConstructor({core::double d, (core::String) → core::String s}) → self2::_B&A&M
+  synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → self2::_B&A&M
     : super a_l::A::factoryConstructor(d: d, s: s)
     ;
   mixin-super-stub method m1() → dynamic
diff --git a/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
index d4d8c65..9e60bbc 100644
--- a/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
@@ -25,7 +25,7 @@
     ;
 }
 class D = self::C with self::M {
-  synthetic constructor foo(core::int* x, [core::int* y, core::int* z]) → self::D*
+  synthetic constructor foo(core::int* x, [core::int* y = 0, core::int* z = 0]) → self::D*
     : super self::C::foo(x, y, z)
     ;
   mixin-super-stub get w2() → core::int*
@@ -36,7 +36,7 @@
     ;
 }
 class E = iss::A with self::N {
-  synthetic constructor foo(core::int* x, [core::int* y, core::int* z, iss::_A* a]) → self::E*
+  synthetic constructor foo(core::int* x, [core::int* y = iss::_private, core::int* z = iss::_private, iss::_A* a = const iss::_A::•(5)]) → self::E*
     : super iss::A::foo(x, y, z, a)
     ;
   mixin-super-stub get w2() → core::int*
@@ -92,7 +92,10 @@
 
 
 Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///issue31767.dart:31:7 -> IntConstant(3)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue31767.dart:31:7 -> IntConstant(3)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue31767.dart:31:7 -> InstanceConstant(const _A{_A.field: 5})
 Evaluated: StaticGet @ org-dartlang-testcase:///issue31767_lib.dart:14:25 -> IntConstant(3)
 Evaluated: StaticGet @ org-dartlang-testcase:///issue31767_lib.dart:14:43 -> IntConstant(3)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue31767_lib.dart:14:68 -> InstanceConstant(const _A{_A.field: 5})
-Extra constant evaluation: evaluated: 13, effectively constant: 3
+Extra constant evaluation: evaluated: 16, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
index b84923c..4244473 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
@@ -41,7 +41,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class D = self::C<core::String*> with self::M {
-  synthetic constructor •({dynamic a, dynamic b}) → self::D*
+  synthetic constructor •({dynamic a = 0, dynamic b = invalid-type}) → self::D*
     : super self::C::•(a: a, b: b)
     ;
 }
@@ -50,7 +50,7 @@
     ;
 }
 abstract class _F&C&M = self::C<core::int*> with self::M /*isAnonymousMixin*/  {
-  synthetic constructor •({dynamic a, dynamic b}) → self::_F&C&M*
+  synthetic constructor •({dynamic a = 0, dynamic b = invalid-type}) → self::_F&C&M*
     : super self::C::•(a: a, b: b)
     ;
 }
@@ -64,4 +64,6 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:9:15 -> TypeLiteralConstant(<invalid>)
-Extra constant evaluation: evaluated: 5, effectively constant: 1
+Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:14:7 -> TypeLiteralConstant(<invalid>)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:18:7 -> TypeLiteralConstant(<invalid>)
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
index 46d5dff..bffd38a 100644
--- a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
@@ -52,7 +52,7 @@
   synthetic constructor unpatched() → self2::_SubClass&Class&Mixin*
     : super self2::Class::unpatched()
     ;
-  synthetic constructor _internal({core::bool* value}) → self2::_SubClass&Class&Mixin*
+  synthetic constructor _internal({core::bool* value = false}) → self2::_SubClass&Class&Mixin*
     : super self2::Class::_internal(value: value)
     ;
 }
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart
new file mode 100644
index 0000000..9a48c68
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart
@@ -0,0 +1,40 @@
+// 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.
+
+B1 f1() => throw 42;
+
+class A1 {
+  var foo = f1(); // Ok.
+  A1(this.foo);
+}
+
+class B1 extends A1 {
+  B1(super.foo) : super();
+}
+
+class A2 {
+  var foo = B2.new; // Error.
+  A2(this.foo);
+}
+
+class B2 extends A2 {
+  B2(super.foo) : super();
+}
+
+class A3 {
+  var foo = C3.new; // Error.
+  A3();
+  A3.initializeFoo(this.foo);
+}
+
+class B3 extends A3 {
+  var bar = A3.initializeFoo;
+  B3(this.bar) : super();
+}
+
+class C3 extends B3 {
+  C3(super.bar) : super();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = B2.new; // Error.
+//       ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = C3.new; // Error.
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field self::B1 foo = self::f1();
+  constructor •(self::B1 foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(self::B1 foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  field invalid-type foo = #C1;
+  constructor •(invalid-type foo) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •(invalid-type foo) → self::B2
+    : super self::A2::•(foo)
+    ;
+}
+class A3 extends core::Object {
+  field invalid-type foo = #C2;
+  constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  constructor initializeFoo(invalid-type foo) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class B3 extends self::A3 {
+  field (invalid-type) → self::A3 bar = #C3;
+  constructor •((invalid-type) → self::A3 bar) → self::B3
+    : self::B3::bar = bar, super self::A3::•()
+    ;
+}
+class C3 extends self::B3 {
+  constructor •((invalid-type) → self::A3 bar) → self::C3
+    : super self::B3::•(bar)
+    ;
+}
+static method f1() → self::B1
+  return throw 42;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B2::•
+  #C2 = constructor-tearoff self::C3::•
+  #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = B2.new; // Error.
+//       ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = C3.new; // Error.
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field self::B1 foo = self::f1();
+  constructor •(self::B1 foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(self::B1 foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  field invalid-type foo = #C1;
+  constructor •(invalid-type foo) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •(invalid-type foo) → self::B2
+    : super self::A2::•(foo)
+    ;
+}
+class A3 extends core::Object {
+  field invalid-type foo = #C2;
+  constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  constructor initializeFoo(invalid-type foo) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class B3 extends self::A3 {
+  field (invalid-type) → self::A3 bar = #C3;
+  constructor •((invalid-type) → self::A3 bar) → self::B3
+    : self::B3::bar = bar, super self::A3::•()
+    ;
+}
+class C3 extends self::B3 {
+  constructor •((invalid-type) → self::A3 bar) → self::C3
+    : super self::B3::•(bar)
+    ;
+}
+static method f1() → self::B1
+  return throw 42;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B2::•
+  #C2 = constructor-tearoff self::C3::•
+  #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.textual_outline.expect
new file mode 100644
index 0000000..94dbab2
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.textual_outline.expect
@@ -0,0 +1,28 @@
+B1 f1() => throw 42;
+class A1 {
+  var foo = f1();
+  A1(this.foo);
+}
+class B1 extends A1 {
+  B1(super.foo) : super();
+}
+class A2 {
+  var foo = B2.new;
+  A2(this.foo);
+}
+class B2 extends A2 {
+  B2(super.foo) : super();
+}
+class A3 {
+  var foo = C3.new;
+  A3();
+  A3.initializeFoo(this.foo);
+}
+class B3 extends A3 {
+  var bar = A3.initializeFoo;
+  B3(this.bar) : super();
+}
+class C3 extends B3 {
+  C3(super.bar) : super();
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = B2.new; // Error.
+//       ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = C3.new; // Error.
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field self::B1 foo = self::f1();
+  constructor •(self::B1 foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(self::B1 foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  field invalid-type foo = #C1;
+  constructor •(invalid-type foo) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •(invalid-type foo) → self::B2
+    : super self::A2::•(foo)
+    ;
+}
+class A3 extends core::Object {
+  field invalid-type foo = #C2;
+  constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  constructor initializeFoo(invalid-type foo) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class B3 extends self::A3 {
+  field (invalid-type) → self::A3 bar = #C3;
+  constructor •((invalid-type) → self::A3 bar) → self::B3
+    : self::B3::bar = bar, super self::A3::•()
+    ;
+}
+class C3 extends self::B3 {
+  constructor •((invalid-type) → self::A3 bar) → self::C3
+    : super self::B3::•(bar)
+    ;
+}
+static method f1() → self::B1
+  return throw 42;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B2::•
+  #C2 = constructor-tearoff self::C3::•
+  #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = B2.new; // Error.
+//       ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = C3.new; // Error.
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field self::B1 foo = self::f1();
+  constructor •(self::B1 foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(self::B1 foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  field invalid-type foo = #C1;
+  constructor •(invalid-type foo) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •(invalid-type foo) → self::B2
+    : super self::A2::•(foo)
+    ;
+}
+class A3 extends core::Object {
+  field invalid-type foo = #C2;
+  constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  constructor initializeFoo(invalid-type foo) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class B3 extends self::A3 {
+  field (invalid-type) → self::A3 bar = #C3;
+  constructor •((invalid-type) → self::A3 bar) → self::B3
+    : self::B3::bar = bar, super self::A3::•()
+    ;
+}
+class C3 extends self::B3 {
+  constructor •((invalid-type) → self::A3 bar) → self::C3
+    : super self::B3::•(bar)
+    ;
+}
+static method f1() → self::B1
+  return throw 42;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B2::•
+  #C2 = constructor-tearoff self::C3::•
+  #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.outline.expect
new file mode 100644
index 0000000..1647019
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.outline.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = B2.new; // Error.
+//       ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = C3.new; // Error.
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field self::B1 foo;
+  constructor •(self::B1 foo) → self::A1
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(self::B1 foo) → self::B1
+    ;
+}
+class A2 extends core::Object {
+  field invalid-type foo;
+  constructor •(invalid-type foo) → self::A2
+    ;
+}
+class B2 extends self::A2 {
+  constructor •(invalid-type foo) → self::B2
+    ;
+}
+class A3 extends core::Object {
+  field invalid-type foo;
+  constructor •() → self::A3
+    ;
+  constructor initializeFoo(invalid-type foo) → self::A3
+    ;
+}
+class B3 extends self::A3 {
+  field (invalid-type) → self::A3 bar;
+  constructor •((invalid-type) → self::A3 bar) → self::B3
+    ;
+}
+class C3 extends self::B3 {
+  constructor •((invalid-type) → self::A3 bar) → self::C3
+    ;
+}
+static method f1() → self::B1
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.transformed.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = B2.new; // Error.
+//       ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+//   var foo = C3.new; // Error.
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field self::B1 foo = self::f1();
+  constructor •(self::B1 foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(self::B1 foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  field invalid-type foo = #C1;
+  constructor •(invalid-type foo) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •(invalid-type foo) → self::B2
+    : super self::A2::•(foo)
+    ;
+}
+class A3 extends core::Object {
+  field invalid-type foo = #C2;
+  constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  constructor initializeFoo(invalid-type foo) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class B3 extends self::A3 {
+  field (invalid-type) → self::A3 bar = #C3;
+  constructor •((invalid-type) → self::A3 bar) → self::B3
+    : self::B3::bar = bar, super self::A3::•()
+    ;
+}
+class C3 extends self::B3 {
+  constructor •((invalid-type) → self::A3 bar) → self::C3
+    : super self::B3::•(bar)
+    ;
+}
+static method f1() → self::B1
+  return throw 42;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B2::•
+  #C2 = constructor-tearoff self::C3::•
+  #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart b/pkg/front_end/testcases/super_parameters/default_values.dart
new file mode 100644
index 0000000..515a046
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart
@@ -0,0 +1,109 @@
+// 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 S1 {
+  int s;
+  S1([int x = 0]) : s = x - 1;
+}
+
+class C1 extends S1 {
+  int c;
+  C1([super.x]) : c = x + 1; // Ok.
+}
+
+class S2 {
+  int s;
+  S2({int x = 0}) : s = x - 1;
+}
+
+class C2 extends S2 {
+  int c;
+  C2({super.x}) : c = x + 1; // Ok.
+}
+
+class S3 {
+  int s;
+  S3([int x = 0]) : s = x - 1;
+}
+
+class C3 extends S3 {
+  int c;
+  C3([super.x = 42]) : c = x + 1; // Ok.
+}
+
+class S4 {
+  int s;
+  S4({int x = 0}) : s = x - 1;
+}
+
+class C4 extends S4 {
+  int c;
+  C4({super.x = 42}) : c = x + 1; // Ok.
+}
+
+class S5 {
+  num a;
+  S5([num x = 3.14]) : a = x - 1;
+}
+
+class C5 extends S5 {
+  C5([int super.x]); // Error.
+}
+
+class S6 {
+  num? a;
+  S6([num? x = 3.14]) : a = x;
+}
+
+class C6 extends S6 {
+  int? b;
+  C6([int? super.x]); // Ok.
+}
+
+class S7 {
+  int s;
+  S7([int x = 0]) : s = x - 1;
+}
+
+class C7 extends S7 {
+  int c;
+  C7([super.x]) : c = x + 1;
+}
+
+class CC7 extends C7 {
+  int cc;
+  CC7([super.x]) : cc = x * 1;
+}
+
+class S8 {
+  int s;
+  S8([int x = 0]) : s = x - 1;
+}
+
+class CC8 extends C8 {
+  int cc;
+  CC8([super.x]) : cc = x * 1;
+}
+
+class C8 extends S8 {
+  int c;
+  C8([super.x]) : c = x + 1;
+}
+
+class CC9 extends C9 {
+  int cc;
+  CC9([super.x]) : cc = x * 1;
+}
+
+class C9 extends S9 {
+  int c;
+  C9([super.x]) : c = x + 1;
+}
+
+class S9 {
+  int s;
+  S9([int x = 0]) : s = x - 1;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+//   C5([int super.x]); // Error.
+//           ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+//   C6([int? super.x]); // Ok.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S1
+    : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C1 extends self::S1 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C1
+    : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+    ;
+}
+class S2 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S2
+    : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C2 extends self::S2 {
+  field core::int c;
+  constructor •({core::int x = #C1}) → self::C2
+    : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+    ;
+}
+class S3 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S3
+    : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C3 extends self::S3 {
+  field core::int c;
+  constructor •([core::int x = #C2]) → self::C3
+    : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+    ;
+}
+class S4 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S4
+    : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C4 extends self::S4 {
+  field core::int c;
+  constructor •({core::int x = #C2}) → self::C4
+    : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+    ;
+}
+class S5 extends core::Object {
+  field core::num a;
+  constructor •([core::num x = #C3]) → self::S5
+    : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+    ;
+}
+class C5 extends self::S5 {
+  constructor •([dynamic int = #C4]) → self::C5
+    : super self::S5::•()
+    ;
+}
+class S6 extends core::Object {
+  field core::num? a;
+  constructor •([core::num? x = #C3]) → self::S6
+    : self::S6::a = x, super core::Object::•()
+    ;
+}
+class C6 extends self::S6 {
+  field core::int? b = null;
+  constructor •([dynamic int = #C4]) → self::C6
+    : super self::S6::•()
+    ;
+}
+class S7 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S7
+    : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C7 extends self::S7 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C7
+    : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+    ;
+}
+class CC7 extends self::C7 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC7
+    : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+    ;
+}
+class S8 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S8
+    : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class CC8 extends self::C8 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC8
+    : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+    ;
+}
+class C8 extends self::S8 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C8
+    : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+    ;
+}
+class CC9 extends self::C9 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC9
+    : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+    ;
+}
+class C9 extends self::S9 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C9
+    : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+    ;
+}
+class S9 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S9
+    : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+  #C3 = 3.14
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+//   C5([int super.x]); // Error.
+//           ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+//   C6([int? super.x]); // Ok.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S1
+    : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C1 extends self::S1 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C1
+    : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+    ;
+}
+class S2 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S2
+    : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C2 extends self::S2 {
+  field core::int c;
+  constructor •({core::int x = #C1}) → self::C2
+    : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+    ;
+}
+class S3 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S3
+    : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C3 extends self::S3 {
+  field core::int c;
+  constructor •([core::int x = #C2]) → self::C3
+    : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+    ;
+}
+class S4 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S4
+    : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C4 extends self::S4 {
+  field core::int c;
+  constructor •({core::int x = #C2}) → self::C4
+    : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+    ;
+}
+class S5 extends core::Object {
+  field core::num a;
+  constructor •([core::num x = #C3]) → self::S5
+    : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+    ;
+}
+class C5 extends self::S5 {
+  constructor •([dynamic int = #C4]) → self::C5
+    : super self::S5::•()
+    ;
+}
+class S6 extends core::Object {
+  field core::num? a;
+  constructor •([core::num? x = #C3]) → self::S6
+    : self::S6::a = x, super core::Object::•()
+    ;
+}
+class C6 extends self::S6 {
+  field core::int? b = null;
+  constructor •([dynamic int = #C4]) → self::C6
+    : super self::S6::•()
+    ;
+}
+class S7 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S7
+    : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C7 extends self::S7 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C7
+    : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+    ;
+}
+class CC7 extends self::C7 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC7
+    : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+    ;
+}
+class S8 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S8
+    : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class CC8 extends self::C8 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC8
+    : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+    ;
+}
+class C8 extends self::S8 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C8
+    : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+    ;
+}
+class CC9 extends self::C9 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC9
+    : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+    ;
+}
+class C9 extends self::S9 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C9
+    : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+    ;
+}
+class S9 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S9
+    : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+  #C3 = 3.14
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.textual_outline.expect
new file mode 100644
index 0000000..1cb3689
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.textual_outline.expect
@@ -0,0 +1,84 @@
+class S1 {
+  int s;
+  S1([int x = 0]) : s = x - 1;
+}
+class C1 extends S1 {
+  int c;
+  C1([super.x]) : c = x + 1;
+}
+class S2 {
+  int s;
+  S2({int x = 0}) : s = x - 1;
+}
+class C2 extends S2 {
+  int c;
+  C2({super.x}) : c = x + 1;
+}
+class S3 {
+  int s;
+  S3([int x = 0]) : s = x - 1;
+}
+class C3 extends S3 {
+  int c;
+  C3([super.x = 42]) : c = x + 1;
+}
+class S4 {
+  int s;
+  S4({int x = 0}) : s = x - 1;
+}
+class C4 extends S4 {
+  int c;
+  C4({super.x = 42}) : c = x + 1;
+}
+class S5 {
+  num a;
+  S5([num x = 3.14]) : a = x - 1;
+}
+class C5 extends S5 {
+  C5([int super.x]);
+}
+class S6 {
+  num? a;
+  S6([num? x = 3.14]) : a = x;
+}
+class C6 extends S6 {
+  int? b;
+  C6([int? super.x]);
+}
+class S7 {
+  int s;
+  S7([int x = 0]) : s = x - 1;
+}
+class C7 extends S7 {
+  int c;
+  C7([super.x]) : c = x + 1;
+}
+class CC7 extends C7 {
+  int cc;
+  CC7([super.x]) : cc = x * 1;
+}
+class S8 {
+  int s;
+  S8([int x = 0]) : s = x - 1;
+}
+class CC8 extends C8 {
+  int cc;
+  CC8([super.x]) : cc = x * 1;
+}
+class C8 extends S8 {
+  int c;
+  C8([super.x]) : c = x + 1;
+}
+class CC9 extends C9 {
+  int cc;
+  CC9([super.x]) : cc = x * 1;
+}
+class C9 extends S9 {
+  int c;
+  C9([super.x]) : c = x + 1;
+}
+class S9 {
+  int s;
+  S9([int x = 0]) : s = x - 1;
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+//   C5([int super.x]); // Error.
+//           ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+//   C6([int? super.x]); // Ok.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S1
+    : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C1 extends self::S1 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C1
+    : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+    ;
+}
+class S2 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S2
+    : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C2 extends self::S2 {
+  field core::int c;
+  constructor •({core::int x = #C1}) → self::C2
+    : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+    ;
+}
+class S3 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S3
+    : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C3 extends self::S3 {
+  field core::int c;
+  constructor •([core::int x = #C2]) → self::C3
+    : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+    ;
+}
+class S4 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S4
+    : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C4 extends self::S4 {
+  field core::int c;
+  constructor •({core::int x = #C2}) → self::C4
+    : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+    ;
+}
+class S5 extends core::Object {
+  field core::num a;
+  constructor •([core::num x = #C3]) → self::S5
+    : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+    ;
+}
+class C5 extends self::S5 {
+  constructor •([dynamic int = #C4]) → self::C5
+    : super self::S5::•()
+    ;
+}
+class S6 extends core::Object {
+  field core::num? a;
+  constructor •([core::num? x = #C3]) → self::S6
+    : self::S6::a = x, super core::Object::•()
+    ;
+}
+class C6 extends self::S6 {
+  field core::int? b = null;
+  constructor •([dynamic int = #C4]) → self::C6
+    : super self::S6::•()
+    ;
+}
+class S7 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S7
+    : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C7 extends self::S7 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C7
+    : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+    ;
+}
+class CC7 extends self::C7 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC7
+    : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+    ;
+}
+class S8 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S8
+    : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class CC8 extends self::C8 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC8
+    : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+    ;
+}
+class C8 extends self::S8 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C8
+    : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+    ;
+}
+class CC9 extends self::C9 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC9
+    : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+    ;
+}
+class C9 extends self::S9 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C9
+    : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+    ;
+}
+class S9 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S9
+    : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+  #C3 = 3.14
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+//   C5([int super.x]); // Error.
+//           ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+//   C6([int? super.x]); // Ok.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S1
+    : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C1 extends self::S1 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C1
+    : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+    ;
+}
+class S2 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S2
+    : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C2 extends self::S2 {
+  field core::int c;
+  constructor •({core::int x = #C1}) → self::C2
+    : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+    ;
+}
+class S3 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S3
+    : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C3 extends self::S3 {
+  field core::int c;
+  constructor •([core::int x = #C2]) → self::C3
+    : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+    ;
+}
+class S4 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S4
+    : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C4 extends self::S4 {
+  field core::int c;
+  constructor •({core::int x = #C2}) → self::C4
+    : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+    ;
+}
+class S5 extends core::Object {
+  field core::num a;
+  constructor •([core::num x = #C3]) → self::S5
+    : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+    ;
+}
+class C5 extends self::S5 {
+  constructor •([dynamic int = #C4]) → self::C5
+    : super self::S5::•()
+    ;
+}
+class S6 extends core::Object {
+  field core::num? a;
+  constructor •([core::num? x = #C3]) → self::S6
+    : self::S6::a = x, super core::Object::•()
+    ;
+}
+class C6 extends self::S6 {
+  field core::int? b = null;
+  constructor •([dynamic int = #C4]) → self::C6
+    : super self::S6::•()
+    ;
+}
+class S7 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S7
+    : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C7 extends self::S7 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C7
+    : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+    ;
+}
+class CC7 extends self::C7 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC7
+    : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+    ;
+}
+class S8 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S8
+    : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class CC8 extends self::C8 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC8
+    : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+    ;
+}
+class C8 extends self::S8 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C8
+    : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+    ;
+}
+class CC9 extends self::C9 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC9
+    : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+    ;
+}
+class C9 extends self::S9 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C9
+    : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+    ;
+}
+class S9 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S9
+    : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+  #C3 = 3.14
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
new file mode 100644
index 0000000..9cb4ff2
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+//   C5([int super.x]); // Error.
+//           ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+//   C6([int? super.x]); // Ok.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = 0]) → self::S1
+    ;
+}
+class C1 extends self::S1 {
+  field core::int c;
+  constructor •([core::int x = 0]) → self::C1
+    ;
+}
+class S2 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = 0}) → self::S2
+    ;
+}
+class C2 extends self::S2 {
+  field core::int c;
+  constructor •({core::int x = 0}) → self::C2
+    ;
+}
+class S3 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = 0]) → self::S3
+    ;
+}
+class C3 extends self::S3 {
+  field core::int c;
+  constructor •([core::int x = 42]) → self::C3
+    ;
+}
+class S4 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = 0}) → self::S4
+    ;
+}
+class C4 extends self::S4 {
+  field core::int c;
+  constructor •({core::int x = 42}) → self::C4
+    ;
+}
+class S5 extends core::Object {
+  field core::num a;
+  constructor •([core::num x = 3.14]) → self::S5
+    ;
+}
+class C5 extends self::S5 {
+  constructor •([dynamic int]) → self::C5
+    ;
+}
+class S6 extends core::Object {
+  field core::num? a;
+  constructor •([core::num? x = 3.14]) → self::S6
+    ;
+}
+class C6 extends self::S6 {
+  field core::int? b;
+  constructor •([dynamic int]) → self::C6
+    ;
+}
+class S7 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = 0]) → self::S7
+    ;
+}
+class C7 extends self::S7 {
+  field core::int c;
+  constructor •([core::int x = 0]) → self::C7
+    ;
+}
+class CC7 extends self::C7 {
+  field core::int cc;
+  constructor •([core::int x = 0]) → self::CC7
+    ;
+}
+class S8 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = 0]) → self::S8
+    ;
+}
+class CC8 extends self::C8 {
+  field core::int cc;
+  constructor •([core::int x = 0]) → self::CC8
+    ;
+}
+class C8 extends self::S8 {
+  field core::int c;
+  constructor •([core::int x = 0]) → self::C8
+    ;
+}
+class CC9 extends self::C9 {
+  field core::int cc;
+  constructor •([core::int x = 0]) → self::CC9
+    ;
+}
+class C9 extends self::S9 {
+  field core::int c;
+  constructor •([core::int x = 0]) → self::C9
+    ;
+}
+class S9 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = 0]) → self::S9
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+//   C5([int super.x]); // Error.
+//           ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+//   C6([int? super.x]); // Ok.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S1
+    : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C1 extends self::S1 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C1
+    : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+    ;
+}
+class S2 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S2
+    : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C2 extends self::S2 {
+  field core::int c;
+  constructor •({core::int x = #C1}) → self::C2
+    : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+    ;
+}
+class S3 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S3
+    : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C3 extends self::S3 {
+  field core::int c;
+  constructor •([core::int x = #C2]) → self::C3
+    : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+    ;
+}
+class S4 extends core::Object {
+  field core::int s;
+  constructor •({core::int x = #C1}) → self::S4
+    : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C4 extends self::S4 {
+  field core::int c;
+  constructor •({core::int x = #C2}) → self::C4
+    : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+    ;
+}
+class S5 extends core::Object {
+  field core::num a;
+  constructor •([core::num x = #C3]) → self::S5
+    : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+    ;
+}
+class C5 extends self::S5 {
+  constructor •([dynamic int = #C4]) → self::C5
+    : super self::S5::•()
+    ;
+}
+class S6 extends core::Object {
+  field core::num? a;
+  constructor •([core::num? x = #C3]) → self::S6
+    : self::S6::a = x, super core::Object::•()
+    ;
+}
+class C6 extends self::S6 {
+  field core::int? b = null;
+  constructor •([dynamic int = #C4]) → self::C6
+    : super self::S6::•()
+    ;
+}
+class S7 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S7
+    : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class C7 extends self::S7 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C7
+    : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+    ;
+}
+class CC7 extends self::C7 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC7
+    : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+    ;
+}
+class S8 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S8
+    : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class CC8 extends self::C8 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC8
+    : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+    ;
+}
+class C8 extends self::S8 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C8
+    : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+    ;
+}
+class CC9 extends self::C9 {
+  field core::int cc;
+  constructor •([core::int x = #C1]) → self::CC9
+    : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+    ;
+}
+class C9 extends self::S9 {
+  field core::int c;
+  constructor •([core::int x = #C1]) → self::C9
+    : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+    ;
+}
+class S9 extends core::Object {
+  field core::int s;
+  constructor •([core::int x = #C1]) → self::S9
+    : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+  #C3 = 3.14
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
@@ -9,7 +9,7 @@
     ;
 }
 class B extends self::A {
-  constructor •(dynamic foo) → self::B
+  constructor •(core::int foo) → self::B
     : super self::A::•(foo)
     ;
 }
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 class B extends self::A {
-  constructor •(dynamic foo) → self::B
+  constructor •(core::int foo) → self::B
     : super self::A::•(foo)
     ;
 }
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
@@ -9,7 +9,7 @@
     ;
 }
 class B extends self::A {
-  constructor •(dynamic foo) → self::B
+  constructor •(core::int foo) → self::B
     : super self::A::•(foo)
     ;
 }
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
@@ -9,7 +9,7 @@
     ;
 }
 class B extends self::A {
-  constructor •(dynamic foo) → self::B
+  constructor •(core::int foo) → self::B
     : super self::A::•(foo)
     ;
 }
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
index 997a20e..61584c5 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
@@ -8,7 +8,7 @@
     ;
 }
 class B extends self::A {
-  constructor •(dynamic foo) → self::B
+  constructor •(core::int foo) → self::B
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 class B extends self::A {
-  constructor •(dynamic foo) → self::B
+  constructor •(core::int foo) → self::B
     : super self::A::•(foo)
     ;
 }
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart b/pkg/front_end/testcases/super_parameters/simple_inference.dart
new file mode 100644
index 0000000..41034252
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart
@@ -0,0 +1,30 @@
+// 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(this.foo);
+  A1.named(this.foo);
+  A1.named2(int foo) : foo = foo;
+  A1.named3({required int foo}) : foo = foo;
+}
+
+class B1 extends A1 {
+  B1(super.foo);
+  B1.named(super.foo) : super.named();
+  B1.named2(super.foo) : super.named2();
+  B1.named3({required super.foo}) : super.named3();
+}
+
+class A2 {
+  final int foo;
+  final String bar;
+  A2({required int this.foo, required String this.bar});
+}
+
+class B2 extends A2 {
+  B2({required super.bar, required super.foo});
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named2(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named3({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+  constructor named(core::int foo) → self::B1
+    : super self::A1::named(foo)
+    ;
+  constructor named2(core::int foo) → self::B1
+    : super self::A1::named2(foo)
+    ;
+  constructor named3({required dynamic foo = #C1}) → self::B1
+    : super self::A1::named3(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 •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+    : super self::A2::•(bar: bar, foo: foo)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.transformed.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named2(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named3({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+  constructor named(core::int foo) → self::B1
+    : super self::A1::named(foo)
+    ;
+  constructor named2(core::int foo) → self::B1
+    : super self::A1::named2(foo)
+    ;
+  constructor named3({required dynamic foo = #C1}) → self::B1
+    : super self::A1::named3(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 •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+    : super self::A2::•(bar: bar, foo: foo)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.textual_outline.expect
new file mode 100644
index 0000000..a194020
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.textual_outline.expect
@@ -0,0 +1,22 @@
+class A1 {
+  final int foo;
+  A1(this.foo);
+  A1.named(this.foo);
+  A1.named2(int foo) : foo = foo;
+  A1.named3({required int foo}) : foo = foo;
+}
+class B1 extends A1 {
+  B1(super.foo);
+  B1.named(super.foo) : super.named();
+  B1.named2(super.foo) : super.named2();
+  B1.named3({required super.foo}) : super.named3();
+}
+class A2 {
+  final int foo;
+  final String bar;
+  A2({required int this.foo, required String this.bar});
+}
+class B2 extends A2 {
+  B2({required super.bar, required super.foo});
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named2(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named3({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+  constructor named(core::int foo) → self::B1
+    : super self::A1::named(foo)
+    ;
+  constructor named2(core::int foo) → self::B1
+    : super self::A1::named2(foo)
+    ;
+  constructor named3({required dynamic foo = #C1}) → self::B1
+    : super self::A1::named3(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 •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+    : super self::A2::•(bar: bar, foo: foo)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named2(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named3({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+  constructor named(core::int foo) → self::B1
+    : super self::A1::named(foo)
+    ;
+  constructor named2(core::int foo) → self::B1
+    : super self::A1::named2(foo)
+    ;
+  constructor named3({required dynamic foo = #C1}) → self::B1
+    : super self::A1::named3(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 •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+    : super self::A2::•(bar: bar, foo: foo)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.outline.expect
new file mode 100644
index 0000000..c7b816c
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.outline.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    ;
+  constructor named(core::int foo) → self::A1
+    ;
+  constructor named2(core::int foo) → self::A1
+    ;
+  constructor named3({required core::int foo}) → self::A1
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(core::int foo) → self::B1
+    ;
+  constructor named(core::int foo) → self::B1
+    ;
+  constructor named2(core::int foo) → self::B1
+    ;
+  constructor named3({required dynamic foo}) → self::B1
+    ;
+}
+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 •({required core::String bar, required core::int foo}) → self::B2
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.transformed.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.transformed.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named2(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+  constructor named3({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
+    ;
+  constructor named(core::int foo) → self::B1
+    : super self::A1::named(foo)
+    ;
+  constructor named2(core::int foo) → self::B1
+    : super self::A1::named2(foo)
+    ;
+  constructor named3({required dynamic foo = #C1}) → self::B1
+    : super self::A1::named3(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 •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+    : super self::A2::•(bar: bar, foo: foo)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
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
index 01051cd..ad7ea47 100644
--- 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
@@ -24,17 +24,17 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::B1
-    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •({required core::int foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::C1
+  constructor •({required core::int 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)
+    } =>foo)
     ;
 }
 class A2 extends core::Object {
@@ -52,13 +52,13 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •({required dynamic foo = #C1}) → self::C2
+  constructor •({required core::int 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)
+  constructor other({required core::int foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo)
     ;
 }
 static method main() → dynamic {}
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
index 74cac10..ad7ea47 100644
--- 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
@@ -24,12 +24,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::B1
-    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •({required core::int foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::C1
+  constructor •({required core::int 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 {
@@ -52,13 +52,13 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •({required dynamic foo = #C1}) → self::C2
+  constructor •({required core::int 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)
+  constructor other({required core::int foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo)
     ;
 }
 static method main() → dynamic {}
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
index 01051cd..ad7ea47 100644
--- 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
@@ -24,17 +24,17 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::B1
-    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •({required core::int foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::C1
+  constructor •({required core::int 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)
+    } =>foo)
     ;
 }
 class A2 extends core::Object {
@@ -52,13 +52,13 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •({required dynamic foo = #C1}) → self::C2
+  constructor •({required core::int 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)
+  constructor other({required core::int foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo)
     ;
 }
 static method main() → dynamic {}
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
index 01051cd..ad7ea47 100644
--- 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
@@ -24,17 +24,17 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::B1
-    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •({required core::int foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::C1
+  constructor •({required core::int 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)
+    } =>foo)
     ;
 }
 class A2 extends core::Object {
@@ -52,13 +52,13 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •({required dynamic foo = #C1}) → self::C2
+  constructor •({required core::int 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)
+  constructor other({required core::int foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo)
     ;
 }
 static method main() → dynamic {}
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
index f3d5bdd..99e1ef3 100644
--- 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
@@ -8,11 +8,11 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •({required dynamic foo}) → self::B1
+  constructor •({required core::int foo}) → self::B1
     ;
 }
 class C1 extends self::A1 {
-  constructor •({required dynamic foo}) → self::C1
+  constructor •({required core::int foo}) → self::C1
     ;
 }
 class A2 extends core::Object {
@@ -26,9 +26,9 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •({required dynamic foo}) → self::C2
+  constructor •({required core::int foo}) → self::C2
     ;
-  constructor other({required dynamic foo}) → self::C2
+  constructor other({required core::int 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
index 74cac10..ad7ea47 100644
--- 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
@@ -24,12 +24,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::B1
-    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •({required core::int foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •({required dynamic foo = #C1}) → self::C1
+  constructor •({required core::int 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 {
@@ -52,13 +52,13 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •({required dynamic foo = #C1}) → self::C2
+  constructor •({required core::int 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)
+  constructor other({required core::int foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo)
     ;
 }
 static method main() → dynamic {}
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 228f432..4d064a8 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
@@ -28,12 +28,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •(dynamic foo) → self::B1
-    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •(dynamic foo) → self::C1
+  constructor •(core::int foo) → self::C1
     : super self::A1::•(42)
     ;
 }
@@ -53,7 +53,7 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •(dynamic foo) → self::C2
+  constructor •(core::int 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.
                        ^"
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 228f432..4d064a8 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
@@ -28,12 +28,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •(dynamic foo) → self::B1
-    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •(dynamic foo) → self::C1
+  constructor •(core::int foo) → self::C1
     : super self::A1::•(42)
     ;
 }
@@ -53,7 +53,7 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •(dynamic foo) → self::C2
+  constructor •(core::int 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.
                        ^"
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 228f432..4d064a8 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
@@ -28,12 +28,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •(dynamic foo) → self::B1
-    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •(dynamic foo) → self::C1
+  constructor •(core::int foo) → self::C1
     : super self::A1::•(42)
     ;
 }
@@ -53,7 +53,7 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •(dynamic foo) → self::C2
+  constructor •(core::int 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.
                        ^"
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 228f432..4d064a8 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
@@ -28,12 +28,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •(dynamic foo) → self::B1
-    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •(dynamic foo) → self::C1
+  constructor •(core::int foo) → self::C1
     : super self::A1::•(42)
     ;
 }
@@ -53,7 +53,7 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •(dynamic foo) → self::C2
+  constructor •(core::int 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.
                        ^"
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 184b3f4..383a149 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
@@ -8,11 +8,11 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •(dynamic foo) → self::B1
+  constructor •(core::int foo) → self::B1
     ;
 }
 class C1 extends self::A1 {
-  constructor •(dynamic foo) → self::C1
+  constructor •(core::int foo) → self::C1
     ;
 }
 class A2 extends core::Object {
@@ -26,7 +26,7 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •(dynamic foo) → self::C2
+  constructor •(core::int 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 228f432..4d064a8 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
@@ -28,12 +28,12 @@
     ;
 }
 class B1 extends self::A1 {
-  constructor •(dynamic foo) → self::B1
-    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+  constructor •(core::int foo) → self::B1
+    : super self::A1::•(foo)
     ;
 }
 class C1 extends self::A1 {
-  constructor •(dynamic foo) → self::C1
+  constructor •(core::int foo) → self::C1
     : super self::A1::•(42)
     ;
 }
@@ -53,7 +53,7 @@
     ;
 }
 class C2 extends self::A2 {
-  constructor •(dynamic foo) → self::C2
+  constructor •(core::int 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.
                        ^"
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart
new file mode 100644
index 0000000..71e4e70
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart
@@ -0,0 +1,95 @@
+// 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.
+
+// 1. The base case.
+
+class A1 {
+  final int a;
+  A1(this.a);
+}
+
+class B1 {}
+
+// C1 has a synthesized constructor that takes a positional parameter.
+class C1 = A1 with B1;
+
+class D1 extends C1 {
+  D1(super.a);
+}
+
+// 2. The case of named parameters.
+
+class A2 {
+  final int a;
+  A2({this.a = 0});
+}
+
+class B2 {}
+
+// C2 has a synthesized constructor that takes a named parameter.
+class C2 = A2 with B2;
+
+class D2 extends C2 {
+  D2({super.a});
+}
+
+// 3. The case of optional positional parameters.
+
+class A3 {
+  final int a;
+  A3([this.a = 0]);
+}
+
+class B3 {}
+
+// C3 has a synthesized constructor that takes an optional positional parameter.
+class C3 = A3 with B3;
+
+class D3 extends C3 {
+  D3([super.a]);
+}
+
+// 4. The case of the inverted order of classes.
+
+class D4 extends C4 {
+  D4([super.foo]);
+}
+
+// C4 has a synthesized constructor that takes an optional parameter.
+class C4 = A4 with B4;
+
+class B4 {}
+
+class A4 extends AA4 {
+  A4([super.foo]);
+}
+
+class AA4 {
+  final int foo;
+  AA4([this.foo = 42]);
+}
+
+// 5. The case of a longer named mixin chain.
+
+class D5 extends C5c {
+  D5([super.foo]);
+}
+
+// C5a, C5b, C5c have synthesized constructors that take an optional parameter.
+class C5c = C5b with B5;
+class C5b = C5a with B5;
+class C5a = A5 with B5;
+
+class B5 {}
+
+class A5 extends AA5 {
+  A5([super.foo]);
+}
+
+class AA5 {
+  final int foo;
+  AA5([this.foo = 42]);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.expect
new file mode 100644
index 0000000..0a867e6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int a;
+  constructor •(core::int a) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+}
+class C1 = self::A1 with self::B1 {
+  synthetic constructor •(core::int a) → self::C1
+    : super self::A1::•(a)
+    ;
+}
+class D1 extends self::C1 {
+  constructor •(core::int a) → self::D1
+    : super self::C1::•(a)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int a;
+  constructor •({core::int a = #C1}) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+}
+class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+}
+class C2 = self::A2 with self::B2 {
+  synthetic constructor •({core::int a = #C1}) → self::C2
+    : super self::A2::•(a: a)
+    ;
+}
+class D2 extends self::C2 {
+  constructor •({core::int a = #C1}) → self::D2
+    : super self::C2::•(a: a)
+    ;
+}
+class A3 extends core::Object {
+  final field core::int a;
+  constructor •([core::int a = #C1]) → self::A3
+    : self::A3::a = a, super core::Object::•()
+    ;
+}
+class B3 extends core::Object {
+  synthetic constructor •() → self::B3
+    : super core::Object::•()
+    ;
+}
+class C3 = self::A3 with self::B3 {
+  synthetic constructor •([core::int a = #C1]) → self::C3
+    : super self::A3::•(a)
+    ;
+}
+class D3 extends self::C3 {
+  constructor •([core::int a = #C1]) → self::D3
+    : super self::C3::•(a)
+    ;
+}
+class D4 extends self::C4 {
+  constructor •([core::int foo = #C2]) → self::D4
+    : super self::C4::•(foo)
+    ;
+}
+class C4 = self::A4 with self::B4 {
+  synthetic constructor •([core::int foo = #C2]) → self::C4
+    : super self::A4::•(foo)
+    ;
+}
+class B4 extends core::Object {
+  synthetic constructor •() → self::B4
+    : super core::Object::•()
+    ;
+}
+class A4 extends self::AA4 {
+  constructor •([core::int foo = #C2]) → self::A4
+    : super self::AA4::•(foo)
+    ;
+}
+class AA4 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA4
+    : self::AA4::foo = foo, super core::Object::•()
+    ;
+}
+class D5 extends self::C5c {
+  constructor •([core::int foo = #C2]) → self::D5
+    : super self::C5c::•(foo)
+    ;
+}
+class C5c = self::C5b with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5c
+    : super self::C5b::•(foo)
+    ;
+}
+class C5b = self::C5a with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5b
+    : super self::C5a::•(foo)
+    ;
+}
+class C5a = self::A5 with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5a
+    : super self::A5::•(foo)
+    ;
+}
+class B5 extends core::Object {
+  synthetic constructor •() → self::B5
+    : super core::Object::•()
+    ;
+}
+class A5 extends self::AA5 {
+  constructor •([core::int foo = #C2]) → self::A5
+    : super self::AA5::•(foo)
+    ;
+}
+class AA5 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA5
+    : self::AA5::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..cf81c26
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.transformed.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int a;
+  constructor •(core::int a) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+}
+class C1 extends self::A1 implements self::B1 /*isEliminatedMixin*/  {
+  synthetic constructor •(core::int a) → self::C1
+    : super self::A1::•(a)
+    ;
+}
+class D1 extends self::C1 {
+  constructor •(core::int a) → self::D1
+    : super self::C1::•(a)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int a;
+  constructor •({core::int a = #C1}) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+}
+class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+}
+class C2 extends self::A2 implements self::B2 /*isEliminatedMixin*/  {
+  synthetic constructor •({core::int a = #C1}) → self::C2
+    : super self::A2::•(a: a)
+    ;
+}
+class D2 extends self::C2 {
+  constructor •({core::int a = #C1}) → self::D2
+    : super self::C2::•(a: a)
+    ;
+}
+class A3 extends core::Object {
+  final field core::int a;
+  constructor •([core::int a = #C1]) → self::A3
+    : self::A3::a = a, super core::Object::•()
+    ;
+}
+class B3 extends core::Object {
+  synthetic constructor •() → self::B3
+    : super core::Object::•()
+    ;
+}
+class C3 extends self::A3 implements self::B3 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int a = #C1]) → self::C3
+    : super self::A3::•(a)
+    ;
+}
+class D3 extends self::C3 {
+  constructor •([core::int a = #C1]) → self::D3
+    : super self::C3::•(a)
+    ;
+}
+class D4 extends self::C4 {
+  constructor •([core::int foo = #C2]) → self::D4
+    : super self::C4::•(foo)
+    ;
+}
+class C4 extends self::A4 implements self::B4 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C4
+    : super self::A4::•(foo)
+    ;
+}
+class B4 extends core::Object {
+  synthetic constructor •() → self::B4
+    : super core::Object::•()
+    ;
+}
+class A4 extends self::AA4 {
+  constructor •([core::int foo = #C2]) → self::A4
+    : super self::AA4::•(foo)
+    ;
+}
+class AA4 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA4
+    : self::AA4::foo = foo, super core::Object::•()
+    ;
+}
+class D5 extends self::C5c {
+  constructor •([core::int foo = #C2]) → self::D5
+    : super self::C5c::•(foo)
+    ;
+}
+class C5c extends self::C5b implements self::B5 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C5c
+    : super self::C5b::•(foo)
+    ;
+}
+class C5b extends self::C5a implements self::B5 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C5b
+    : super self::C5a::•(foo)
+    ;
+}
+class C5a extends self::A5 implements self::B5 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C5a
+    : super self::A5::•(foo)
+    ;
+}
+class B5 extends core::Object {
+  synthetic constructor •() → self::B5
+    : super core::Object::•()
+    ;
+}
+class A5 extends self::AA5 {
+  constructor •([core::int foo = #C2]) → self::A5
+    : super self::AA5::•(foo)
+    ;
+}
+class AA5 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA5
+    : self::AA5::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..ed0e4f7
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.textual_outline.expect
@@ -0,0 +1,54 @@
+class A1 {
+  final int a;
+  A1(this.a);
+}
+class B1 {}
+class C1 = A1 with B1;
+class D1 extends C1 {
+  D1(super.a);
+}
+class A2 {
+  final int a;
+  A2({this.a = 0});
+}
+class B2 {}
+class C2 = A2 with B2;
+class D2 extends C2 {
+  D2({super.a});
+}
+class A3 {
+  final int a;
+  A3([this.a = 0]);
+}
+class B3 {}
+class C3 = A3 with B3;
+class D3 extends C3 {
+  D3([super.a]);
+}
+class D4 extends C4 {
+  D4([super.foo]);
+}
+class C4 = A4 with B4;
+class B4 {}
+class A4 extends AA4 {
+  A4([super.foo]);
+}
+class AA4 {
+  final int foo;
+  AA4([this.foo = 42]);
+}
+class D5 extends C5c {
+  D5([super.foo]);
+}
+class C5c = C5b with B5;
+class C5b = C5a with B5;
+class C5a = A5 with B5;
+class B5 {}
+class A5 extends AA5 {
+  A5([super.foo]);
+}
+class AA5 {
+  final int foo;
+  AA5([this.foo = 42]);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.expect
new file mode 100644
index 0000000..0a867e6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int a;
+  constructor •(core::int a) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+}
+class C1 = self::A1 with self::B1 {
+  synthetic constructor •(core::int a) → self::C1
+    : super self::A1::•(a)
+    ;
+}
+class D1 extends self::C1 {
+  constructor •(core::int a) → self::D1
+    : super self::C1::•(a)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int a;
+  constructor •({core::int a = #C1}) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+}
+class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+}
+class C2 = self::A2 with self::B2 {
+  synthetic constructor •({core::int a = #C1}) → self::C2
+    : super self::A2::•(a: a)
+    ;
+}
+class D2 extends self::C2 {
+  constructor •({core::int a = #C1}) → self::D2
+    : super self::C2::•(a: a)
+    ;
+}
+class A3 extends core::Object {
+  final field core::int a;
+  constructor •([core::int a = #C1]) → self::A3
+    : self::A3::a = a, super core::Object::•()
+    ;
+}
+class B3 extends core::Object {
+  synthetic constructor •() → self::B3
+    : super core::Object::•()
+    ;
+}
+class C3 = self::A3 with self::B3 {
+  synthetic constructor •([core::int a = #C1]) → self::C3
+    : super self::A3::•(a)
+    ;
+}
+class D3 extends self::C3 {
+  constructor •([core::int a = #C1]) → self::D3
+    : super self::C3::•(a)
+    ;
+}
+class D4 extends self::C4 {
+  constructor •([core::int foo = #C2]) → self::D4
+    : super self::C4::•(foo)
+    ;
+}
+class C4 = self::A4 with self::B4 {
+  synthetic constructor •([core::int foo = #C2]) → self::C4
+    : super self::A4::•(foo)
+    ;
+}
+class B4 extends core::Object {
+  synthetic constructor •() → self::B4
+    : super core::Object::•()
+    ;
+}
+class A4 extends self::AA4 {
+  constructor •([core::int foo = #C2]) → self::A4
+    : super self::AA4::•(foo)
+    ;
+}
+class AA4 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA4
+    : self::AA4::foo = foo, super core::Object::•()
+    ;
+}
+class D5 extends self::C5c {
+  constructor •([core::int foo = #C2]) → self::D5
+    : super self::C5c::•(foo)
+    ;
+}
+class C5c = self::C5b with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5c
+    : super self::C5b::•(foo)
+    ;
+}
+class C5b = self::C5a with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5b
+    : super self::C5a::•(foo)
+    ;
+}
+class C5a = self::A5 with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5a
+    : super self::A5::•(foo)
+    ;
+}
+class B5 extends core::Object {
+  synthetic constructor •() → self::B5
+    : super core::Object::•()
+    ;
+}
+class A5 extends self::AA5 {
+  constructor •([core::int foo = #C2]) → self::A5
+    : super self::AA5::•(foo)
+    ;
+}
+class AA5 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA5
+    : self::AA5::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..0a867e6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.modular.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int a;
+  constructor •(core::int a) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+}
+class C1 = self::A1 with self::B1 {
+  synthetic constructor •(core::int a) → self::C1
+    : super self::A1::•(a)
+    ;
+}
+class D1 extends self::C1 {
+  constructor •(core::int a) → self::D1
+    : super self::C1::•(a)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int a;
+  constructor •({core::int a = #C1}) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+}
+class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+}
+class C2 = self::A2 with self::B2 {
+  synthetic constructor •({core::int a = #C1}) → self::C2
+    : super self::A2::•(a: a)
+    ;
+}
+class D2 extends self::C2 {
+  constructor •({core::int a = #C1}) → self::D2
+    : super self::C2::•(a: a)
+    ;
+}
+class A3 extends core::Object {
+  final field core::int a;
+  constructor •([core::int a = #C1]) → self::A3
+    : self::A3::a = a, super core::Object::•()
+    ;
+}
+class B3 extends core::Object {
+  synthetic constructor •() → self::B3
+    : super core::Object::•()
+    ;
+}
+class C3 = self::A3 with self::B3 {
+  synthetic constructor •([core::int a = #C1]) → self::C3
+    : super self::A3::•(a)
+    ;
+}
+class D3 extends self::C3 {
+  constructor •([core::int a = #C1]) → self::D3
+    : super self::C3::•(a)
+    ;
+}
+class D4 extends self::C4 {
+  constructor •([core::int foo = #C2]) → self::D4
+    : super self::C4::•(foo)
+    ;
+}
+class C4 = self::A4 with self::B4 {
+  synthetic constructor •([core::int foo = #C2]) → self::C4
+    : super self::A4::•(foo)
+    ;
+}
+class B4 extends core::Object {
+  synthetic constructor •() → self::B4
+    : super core::Object::•()
+    ;
+}
+class A4 extends self::AA4 {
+  constructor •([core::int foo = #C2]) → self::A4
+    : super self::AA4::•(foo)
+    ;
+}
+class AA4 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA4
+    : self::AA4::foo = foo, super core::Object::•()
+    ;
+}
+class D5 extends self::C5c {
+  constructor •([core::int foo = #C2]) → self::D5
+    : super self::C5c::•(foo)
+    ;
+}
+class C5c = self::C5b with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5c
+    : super self::C5b::•(foo)
+    ;
+}
+class C5b = self::C5a with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5b
+    : super self::C5a::•(foo)
+    ;
+}
+class C5a = self::A5 with self::B5 {
+  synthetic constructor •([core::int foo = #C2]) → self::C5a
+    : super self::A5::•(foo)
+    ;
+}
+class B5 extends core::Object {
+  synthetic constructor •() → self::B5
+    : super core::Object::•()
+    ;
+}
+class A5 extends self::AA5 {
+  constructor •([core::int foo = #C2]) → self::A5
+    : super self::AA5::•(foo)
+    ;
+}
+class AA5 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA5
+    : self::AA5::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..ee7f775
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.outline.expect
@@ -0,0 +1,114 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int a;
+  constructor •(core::int a) → self::A1
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    ;
+}
+class C1 = self::A1 with self::B1 {
+  synthetic constructor •(core::int a) → self::C1
+    : super self::A1::•(a)
+    ;
+}
+class D1 extends self::C1 {
+  constructor •(core::int a) → self::D1
+    ;
+}
+class A2 extends core::Object {
+  final field core::int a;
+  constructor •({core::int a = 0}) → self::A2
+    ;
+}
+class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    ;
+}
+class C2 = self::A2 with self::B2 {
+  synthetic constructor •({core::int a = 0}) → self::C2
+    : super self::A2::•(a: a)
+    ;
+}
+class D2 extends self::C2 {
+  constructor •({core::int a = 0}) → self::D2
+    ;
+}
+class A3 extends core::Object {
+  final field core::int a;
+  constructor •([core::int a = 0]) → self::A3
+    ;
+}
+class B3 extends core::Object {
+  synthetic constructor •() → self::B3
+    ;
+}
+class C3 = self::A3 with self::B3 {
+  synthetic constructor •([core::int a = 0]) → self::C3
+    : super self::A3::•(a)
+    ;
+}
+class D3 extends self::C3 {
+  constructor •([core::int a = 0]) → self::D3
+    ;
+}
+class D4 extends self::C4 {
+  constructor •([core::int foo = 42]) → self::D4
+    ;
+}
+class C4 = self::A4 with self::B4 {
+  synthetic constructor •([core::int foo = 42]) → self::C4
+    : super self::A4::•(foo)
+    ;
+}
+class B4 extends core::Object {
+  synthetic constructor •() → self::B4
+    ;
+}
+class A4 extends self::AA4 {
+  constructor •([core::int foo = 42]) → self::A4
+    ;
+}
+class AA4 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = 42]) → self::AA4
+    ;
+}
+class D5 extends self::C5c {
+  constructor •([core::int foo = 42]) → self::D5
+    ;
+}
+class C5c = self::C5b with self::B5 {
+  synthetic constructor •([core::int foo = 42]) → self::C5c
+    : super self::C5b::•(foo)
+    ;
+}
+class C5b = self::C5a with self::B5 {
+  synthetic constructor •([core::int foo = 42]) → self::C5b
+    : super self::C5a::•(foo)
+    ;
+}
+class C5a = self::A5 with self::B5 {
+  synthetic constructor •([core::int foo = 42]) → self::C5a
+    : super self::A5::•(foo)
+    ;
+}
+class B5 extends core::Object {
+  synthetic constructor •() → self::B5
+    ;
+}
+class A5 extends self::AA5 {
+  constructor •([core::int foo = 42]) → self::A5
+    ;
+}
+class AA5 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = 42]) → self::AA5
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..cf81c26
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.transformed.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int a;
+  constructor •(core::int a) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+}
+class C1 extends self::A1 implements self::B1 /*isEliminatedMixin*/  {
+  synthetic constructor •(core::int a) → self::C1
+    : super self::A1::•(a)
+    ;
+}
+class D1 extends self::C1 {
+  constructor •(core::int a) → self::D1
+    : super self::C1::•(a)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int a;
+  constructor •({core::int a = #C1}) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+}
+class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+}
+class C2 extends self::A2 implements self::B2 /*isEliminatedMixin*/  {
+  synthetic constructor •({core::int a = #C1}) → self::C2
+    : super self::A2::•(a: a)
+    ;
+}
+class D2 extends self::C2 {
+  constructor •({core::int a = #C1}) → self::D2
+    : super self::C2::•(a: a)
+    ;
+}
+class A3 extends core::Object {
+  final field core::int a;
+  constructor •([core::int a = #C1]) → self::A3
+    : self::A3::a = a, super core::Object::•()
+    ;
+}
+class B3 extends core::Object {
+  synthetic constructor •() → self::B3
+    : super core::Object::•()
+    ;
+}
+class C3 extends self::A3 implements self::B3 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int a = #C1]) → self::C3
+    : super self::A3::•(a)
+    ;
+}
+class D3 extends self::C3 {
+  constructor •([core::int a = #C1]) → self::D3
+    : super self::C3::•(a)
+    ;
+}
+class D4 extends self::C4 {
+  constructor •([core::int foo = #C2]) → self::D4
+    : super self::C4::•(foo)
+    ;
+}
+class C4 extends self::A4 implements self::B4 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C4
+    : super self::A4::•(foo)
+    ;
+}
+class B4 extends core::Object {
+  synthetic constructor •() → self::B4
+    : super core::Object::•()
+    ;
+}
+class A4 extends self::AA4 {
+  constructor •([core::int foo = #C2]) → self::A4
+    : super self::AA4::•(foo)
+    ;
+}
+class AA4 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA4
+    : self::AA4::foo = foo, super core::Object::•()
+    ;
+}
+class D5 extends self::C5c {
+  constructor •([core::int foo = #C2]) → self::D5
+    : super self::C5c::•(foo)
+    ;
+}
+class C5c extends self::C5b implements self::B5 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C5c
+    : super self::C5b::•(foo)
+    ;
+}
+class C5b extends self::C5a implements self::B5 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C5b
+    : super self::C5a::•(foo)
+    ;
+}
+class C5a extends self::A5 implements self::B5 /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int foo = #C2]) → self::C5a
+    : super self::A5::•(foo)
+    ;
+}
+class B5 extends core::Object {
+  synthetic constructor •() → self::B5
+    : super core::Object::•()
+    ;
+}
+class A5 extends self::AA5 {
+  constructor •([core::int foo = #C2]) → self::A5
+    : super self::AA5::•(foo)
+    ;
+}
+class AA5 extends core::Object {
+  final field core::int foo;
+  constructor •([core::int foo = #C2]) → self::AA5
+    : self::AA5::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart
new file mode 100644
index 0000000..efa62e9
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart
@@ -0,0 +1,81 @@
+// 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.
+
+// 1. The base case.
+
+class A1 {
+  final String foo;
+  A1(this.foo);
+}
+
+typedef TA1 = A1;
+
+typedef TTA1 = TA1;
+
+typedef TTTA1 = TTA1;
+
+typedef TTTTA1 = TTTA1;
+
+class D1 extends TTTTA1 {
+  D1(super.foo);
+}
+
+// 2. The case of named parameters.
+
+class A2 {
+  final String foo;
+  A2({this.foo = "bar"});
+}
+
+typedef TA2 = A2;
+
+typedef TTA2 = TA2;
+
+typedef TTTA2 = TTA2;
+
+typedef TTTTA2 = TTTA2;
+
+class D2 extends TTTTA2 {
+  D2({super.foo});
+}
+
+// 3. The case of optional positional parameters.
+
+class A3 {
+  final String foo;
+  A3([this.foo = "bar"]);
+}
+
+typedef TA3 = A3;
+
+typedef TTA3 = TA3;
+
+typedef TTTA3 = TTA3;
+
+typedef TTTTA3 = TTTA3;
+
+class D3 extends TTTTA3 {
+  D3([super.foo]);
+}
+
+// 4. The case of the inverted order of declarations.
+
+class D4 extends TTTTA4 {
+  D4([super.foo]);
+}
+
+typedef TTTTA4 = TTTA4;
+
+typedef TTTA4 = TTA4;
+
+typedef TTA4 = TA4;
+
+typedef TA4 = A4;
+
+class A4 {
+  final String foo;
+  A4([this.foo = "bar"]);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class D1 extends self::A1 {
+  constructor •(core::String foo) → self::D1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::String foo;
+  constructor •({core::String foo = #C1}) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class D2 extends self::A2 {
+  constructor •({core::String foo = #C1}) → self::D2
+    : super self::A2::•(foo: foo)
+    ;
+}
+class A3 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class D3 extends self::A3 {
+  constructor •([core::String foo = #C1]) → self::D3
+    : super self::A3::•(foo)
+    ;
+}
+class D4 extends self::A4 {
+  constructor •([core::String foo = #C1]) → self::D4
+    : super self::A4::•(foo)
+    ;
+}
+class A4 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A4
+    : self::A4::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.transformed.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class D1 extends self::A1 {
+  constructor •(core::String foo) → self::D1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::String foo;
+  constructor •({core::String foo = #C1}) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class D2 extends self::A2 {
+  constructor •({core::String foo = #C1}) → self::D2
+    : super self::A2::•(foo: foo)
+    ;
+}
+class A3 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class D3 extends self::A3 {
+  constructor •([core::String foo = #C1]) → self::D3
+    : super self::A3::•(foo)
+    ;
+}
+class D4 extends self::A4 {
+  constructor •([core::String foo = #C1]) → self::D4
+    : super self::A4::•(foo)
+    ;
+}
+class A4 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A4
+    : self::A4::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.textual_outline.expect
new file mode 100644
index 0000000..1e4deb1
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.textual_outline.expect
@@ -0,0 +1,45 @@
+class A1 {
+  final String foo;
+  A1(this.foo);
+}
+typedef TA1 = A1;
+typedef TTA1 = TA1;
+typedef TTTA1 = TTA1;
+typedef TTTTA1 = TTTA1;
+class D1 extends TTTTA1 {
+  D1(super.foo);
+}
+class A2 {
+  final String foo;
+  A2({this.foo = "bar"});
+}
+typedef TA2 = A2;
+typedef TTA2 = TA2;
+typedef TTTA2 = TTA2;
+typedef TTTTA2 = TTTA2;
+class D2 extends TTTTA2 {
+  D2({super.foo});
+}
+class A3 {
+  final String foo;
+  A3([this.foo = "bar"]);
+}
+typedef TA3 = A3;
+typedef TTA3 = TA3;
+typedef TTTA3 = TTA3;
+typedef TTTTA3 = TTTA3;
+class D3 extends TTTTA3 {
+  D3([super.foo]);
+}
+class D4 extends TTTTA4 {
+  D4([super.foo]);
+}
+typedef TTTTA4 = TTTA4;
+typedef TTTA4 = TTA4;
+typedef TTA4 = TA4;
+typedef TA4 = A4;
+class A4 {
+  final String foo;
+  A4([this.foo = "bar"]);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class D1 extends self::A1 {
+  constructor •(core::String foo) → self::D1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::String foo;
+  constructor •({core::String foo = #C1}) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class D2 extends self::A2 {
+  constructor •({core::String foo = #C1}) → self::D2
+    : super self::A2::•(foo: foo)
+    ;
+}
+class A3 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class D3 extends self::A3 {
+  constructor •([core::String foo = #C1]) → self::D3
+    : super self::A3::•(foo)
+    ;
+}
+class D4 extends self::A4 {
+  constructor •([core::String foo = #C1]) → self::D4
+    : super self::A4::•(foo)
+    ;
+}
+class A4 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A4
+    : self::A4::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.modular.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class D1 extends self::A1 {
+  constructor •(core::String foo) → self::D1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::String foo;
+  constructor •({core::String foo = #C1}) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class D2 extends self::A2 {
+  constructor •({core::String foo = #C1}) → self::D2
+    : super self::A2::•(foo: foo)
+    ;
+}
+class A3 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class D3 extends self::A3 {
+  constructor •([core::String foo = #C1]) → self::D3
+    : super self::A3::•(foo)
+    ;
+}
+class D4 extends self::A4 {
+  constructor •([core::String foo = #C1]) → self::D4
+    : super self::A4::•(foo)
+    ;
+}
+class A4 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A4
+    : self::A4::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.outline.expect
new file mode 100644
index 0000000..f4d87e2
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.outline.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A1
+    ;
+}
+class D1 extends self::A1 {
+  constructor •(core::String foo) → self::D1
+    ;
+}
+class A2 extends core::Object {
+  final field core::String foo;
+  constructor •({core::String foo = "bar"}) → self::A2
+    ;
+}
+class D2 extends self::A2 {
+  constructor •({core::String foo = "bar"}) → self::D2
+    ;
+}
+class A3 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = "bar"]) → self::A3
+    ;
+}
+class D3 extends self::A3 {
+  constructor •([core::String foo = "bar"]) → self::D3
+    ;
+}
+class D4 extends self::A4 {
+  constructor •([core::String foo = "bar"]) → self::D4
+    ;
+}
+class A4 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = "bar"]) → self::A4
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.transformed.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class D1 extends self::A1 {
+  constructor •(core::String foo) → self::D1
+    : super self::A1::•(foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::String foo;
+  constructor •({core::String foo = #C1}) → self::A2
+    : self::A2::foo = foo, super core::Object::•()
+    ;
+}
+class D2 extends self::A2 {
+  constructor •({core::String foo = #C1}) → self::D2
+    : super self::A2::•(foo: foo)
+    ;
+}
+class A3 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A3
+    : self::A3::foo = foo, super core::Object::•()
+    ;
+}
+class D3 extends self::A3 {
+  constructor •([core::String foo = #C1]) → self::D3
+    : super self::A3::•(foo)
+    ;
+}
+class D4 extends self::A4 {
+  constructor •([core::String foo = #C1]) → self::D4
+    : super self::A4::•(foo)
+    ;
+}
+class A4 extends core::Object {
+  final field core::String foo;
+  constructor •([core::String foo = #C1]) → self::A4
+    : self::A4::foo = foo, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 5ebd7e2..db22169c 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -201,9 +201,14 @@
 regress/issue_39091_1: FormatterCrash
 regress/issue_41265.crash: Crash
 regress/issue_41265.crash: FormatterCrash
+super_parameters/circular_dependency_inference: FormatterCrash
+super_parameters/default_values: FormatterCrash
 super_parameters/simple: FormatterCrash
+super_parameters/simple_inference: FormatterCrash
 super_parameters/simple_named_super_parameters: FormatterCrash
 super_parameters/simple_positional_super_parameters: FormatterCrash
+super_parameters/synthesized_super_constructor_with_parameters: FormatterCrash
+super_parameters/type_alias_in_supertype: FormatterCrash
 super_parameters/typed_super_parameter: FormatterCrash
 triple_shift/invalid_operator: FormatterCrash
 variance/class_type_parameter_modifier: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index 967b65e..a94e232 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 140
+PRERELEASE 141
 PRERELEASE_PATCH 0
\ No newline at end of file