[beta] [cfe] Ensure default values in synthesized function nodes

Closes https://github.com/dart-lang/sdk/issues/55529

Cherry-pick: https://dart-review.googlesource.com/c/sdk/+/364325
Cherry-pick-request: https://github.com/dart-lang/sdk/issues/55656
Change-Id: If352b8f2f2d09deb2805d4279177fb16941af873
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365580
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index 4ed0bd6..f387b61 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -250,13 +250,15 @@
     // and named parameters in several cases:
     // * for const constructors to enable constant evaluation,
     // * for instance methods because these might be needed to generated
-    //   noSuchMethod forwarders, and
+    //   noSuchMethod forwarders,
     // * for generative constructors to support forwarding constructors
-    //   in mixin applications.
+    //   in mixin applications, and
+    // * for factories, to uphold the invariant that optional parameters always
+    //   have default values, even during modular compilation.
     if (parent is ConstructorBuilder) {
       return true;
     } else if (parent is SourceFactoryBuilder) {
-      return parent!.isFactory && parent!.isConst;
+      return parent!.isFactory;
     } else {
       return parent!.isClassInstanceMember;
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
index 0fc0e29..8d86039 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
@@ -79,7 +79,7 @@
 /// The [declarationConstructor] is the origin constructor and
 /// [implementationConstructor] is the augmentation constructor, if augmented,
 /// otherwise it is the [declarationConstructor].
-void buildConstructorTearOffProcedure(
+DelayedDefaultValueCloner buildConstructorTearOffProcedure(
     {required Procedure tearOff,
     required Member declarationConstructor,
     required Member implementationConstructor,
@@ -118,12 +118,17 @@
 
   List<DartType> typeArguments = freshTypeParameters.freshTypeArguments;
   Substitution substitution = freshTypeParameters.substitution;
-  _createParameters(tearOff, implementationConstructor, function, substitution,
+  DelayedDefaultValueCloner delayedDefaultValueCloner = _createParameters(
+      tearOff,
+      implementationConstructor,
+      function,
+      substitution,
       libraryBuilder);
   Arguments arguments = _createArguments(tearOff, typeArguments, fileOffset);
   _createTearOffBody(tearOff, declarationConstructor, arguments);
   tearOff.function.fileOffset = tearOff.fileOffset;
   tearOff.function.fileEndOffset = tearOff.fileOffset;
+  return delayedDefaultValueCloner;
 }
 
 /// Creates the parameters and body for [tearOff] for a typedef tearoff of
@@ -134,7 +139,7 @@
 /// The [declarationConstructor] is the origin constructor and
 /// [implementationConstructor] is the augmentation constructor, if augmented,
 /// otherwise it is the [declarationConstructor].
-void buildTypedefTearOffProcedure(
+DelayedDefaultValueCloner buildTypedefTearOffProcedure(
     {required Procedure tearOff,
     required Member declarationConstructor,
     required Member implementationConstructor,
@@ -185,7 +190,7 @@
           (int index) => substitution.substituteType(typeArguments[index]));
     }
   }
-  _createParameters(
+  DelayedDefaultValueCloner delayedDefaultValueCloner = _createParameters(
       tearOff,
       implementationConstructor,
       function,
@@ -195,6 +200,7 @@
   _createTearOffBody(tearOff, declarationConstructor, arguments);
   tearOff.function.fileOffset = tearOff.fileOffset;
   tearOff.function.fileEndOffset = tearOff.fileOffset;
+  return delayedDefaultValueCloner;
 }
 
 /// Creates the parameters for the redirecting factory [tearOff] based on the
@@ -207,13 +213,19 @@
 FreshTypeParameters buildRedirectingFactoryTearOffProcedureParameters(
     {required Procedure tearOff,
     required Procedure implementationConstructor,
-    required SourceLibraryBuilder libraryBuilder}) {
+    required SourceLibraryBuilder libraryBuilder,
+    List<DelayedDefaultValueCloner>? delayedDefaultValueCloners}) {
   FunctionNode function = implementationConstructor.function;
   FreshTypeParameters freshTypeParameters =
       _createFreshTypeParameters(function.typeParameters, tearOff.function);
   Substitution substitution = freshTypeParameters.substitution;
-  _createParameters(tearOff, implementationConstructor, function, substitution,
+  DelayedDefaultValueCloner delayedDefaultValueCloner = _createParameters(
+      tearOff,
+      implementationConstructor,
+      function,
+      substitution,
       libraryBuilder);
+  delayedDefaultValueCloners?.add(delayedDefaultValueCloner);
   tearOff.function.fileOffset = tearOff.fileOffset;
   tearOff.function.fileEndOffset = tearOff.fileOffset;
   return freshTypeParameters;
@@ -295,7 +307,7 @@
 /// Creates the parameters for the [tearOff] lowering based of the parameters
 /// in [constructor] and using the [substitution] to compute the parameter and
 /// return types.
-void _createParameters(
+DelayedDefaultValueCloner _createParameters(
     Procedure tearOff,
     Member constructor,
     FunctionNode function,
@@ -326,6 +338,8 @@
       tearOff,
       new TypeDependency(tearOff, constructor, substitution,
           copyReturnType: true));
+  return new DelayedDefaultValueCloner(constructor, tearOff,
+      identicalSignatures: true, libraryBuilder: libraryBuilder);
 }
 
 /// Creates the [Arguments] for passing the parameters from [tearOff] to its
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 7dde01b..cfdbc20 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
@@ -131,7 +131,9 @@
             VariableDeclaration synthesizedParameter =
                 _synthesized.positionalParameters[superParameterIndex];
             _cloneDefaultValueForSuperParameters(
-                originalParameter, synthesizedParameter, typeEnvironment);
+                originalParameter, synthesizedParameter, typeEnvironment,
+                isOptional:
+                    superParameterIndex >= _synthesized.requiredParameterCount);
           }
         }
       }
@@ -162,7 +164,8 @@
             VariableDeclaration synthesizedParameter =
                 _synthesized.namedParameters[i];
             _cloneDefaultValueForSuperParameters(
-                originalParameter, synthesizedParameter, typeEnvironment);
+                originalParameter, synthesizedParameter, typeEnvironment,
+                isOptional: !synthesizedParameter.isRequired);
           } else {
             // TODO(cstefantsova): Handle the erroneous case of missing names.
           }
@@ -218,7 +221,8 @@
   void _cloneDefaultValueForSuperParameters(
       VariableDeclaration originalParameter,
       VariableDeclaration synthesizedParameter,
-      TypeEnvironment typeEnvironment) {
+      TypeEnvironment typeEnvironment,
+      {required bool isOptional}) {
     Expression? originalParameterInitializer = originalParameter.initializer;
     DartType? originalParameterInitializerType = originalParameterInitializer
         ?.getStaticType(new StaticTypeContext(synthesized, typeEnvironment));
@@ -227,6 +231,9 @@
         typeEnvironment.isSubtypeOf(originalParameterInitializerType,
             synthesizedParameterType, SubtypeCheckMode.withNullabilities)) {
       _cloneInitializer(originalParameter, synthesizedParameter);
+    } else if (originalParameterInitializer == null && isOptional) {
+      synthesizedParameter.initializer = new NullLiteral()
+        ..parent = synthesizedParameter;
     } else {
       synthesizedParameter.hasDeclaredInitializer = false;
       if (synthesizedParameterType.isPotentiallyNonNullable) {
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 5994069..ce58dfc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -521,7 +521,11 @@
       loader.computeShowHideElements();
 
       benchmarker?.enterPhase(BenchmarkPhases.outline_installTypedefTearOffs);
-      loader.installTypedefTearOffs();
+      List<DelayedDefaultValueCloner>?
+          typedefTearOffsDelayedDefaultValueCloners =
+          loader.installTypedefTearOffs();
+      typedefTearOffsDelayedDefaultValueCloners
+          ?.forEach(registerDelayedDefaultValueCloner);
 
       benchmarker
           ?.enterPhase(BenchmarkPhases.outline_computeFieldPromotability);
@@ -1111,12 +1115,15 @@
         forAbstractClassOrEnumOrMixin: classBuilder.isAbstract);
 
     if (constructorTearOff != null) {
-      buildConstructorTearOffProcedure(
-          tearOff: constructorTearOff,
-          declarationConstructor: constructor,
-          implementationConstructor: constructor,
-          enclosingDeclarationTypeParameters: classBuilder.cls.typeParameters,
-          libraryBuilder: libraryBuilder);
+      DelayedDefaultValueCloner delayedDefaultValueCloner =
+          buildConstructorTearOffProcedure(
+              tearOff: constructorTearOff,
+              declarationConstructor: constructor,
+              implementationConstructor: constructor,
+              enclosingDeclarationTypeParameters:
+                  classBuilder.cls.typeParameters,
+              libraryBuilder: libraryBuilder);
+      registerDelayedDefaultValueCloner(delayedDefaultValueCloner);
     }
     SyntheticSourceConstructorBuilder constructorBuilder =
         new SyntheticSourceConstructorBuilder(
@@ -1135,9 +1142,10 @@
   }
 
   void registerDelayedDefaultValueCloner(DelayedDefaultValueCloner cloner) {
-    assert(!_delayedDefaultValueCloners.containsKey(cloner.synthesized),
-        "Default cloner already registered for ${cloner.synthesized}.");
-    _delayedDefaultValueCloners[cloner.synthesized] = cloner;
+    // TODO(cstefantsova): Investigate the reason for the assumption breakage
+    // and uncomment the following line.
+    // assert(!_delayedDefaultValueCloners.containsKey(cloner.synthesized));
+    _delayedDefaultValueCloners[cloner.synthesized] ??= cloner;
   }
 
   void finishSynthesizedParameters({bool forOutline = false}) {
@@ -1190,12 +1198,15 @@
         forAbstractClassOrEnumOrMixin:
             enclosingClass.isAbstract || enclosingClass.isEnum);
     if (constructorTearOff != null) {
-      buildConstructorTearOffProcedure(
-          tearOff: constructorTearOff,
-          declarationConstructor: constructor,
-          implementationConstructor: constructor,
-          enclosingDeclarationTypeParameters: classBuilder.cls.typeParameters,
-          libraryBuilder: libraryBuilder);
+      DelayedDefaultValueCloner delayedDefaultValueCloner =
+          buildConstructorTearOffProcedure(
+              tearOff: constructorTearOff,
+              declarationConstructor: constructor,
+              implementationConstructor: constructor,
+              enclosingDeclarationTypeParameters:
+                  classBuilder.cls.typeParameters,
+              libraryBuilder: libraryBuilder);
+      registerDelayedDefaultValueCloner(delayedDefaultValueCloner);
     }
     return new SyntheticSourceConstructorBuilder(
         classBuilder, constructor, constructorTearOff);
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 7fdd715..11a823d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -544,12 +544,15 @@
       _constructor.isExternal = isExternal;
 
       if (_constructorTearOff != null) {
-        buildConstructorTearOffProcedure(
-            tearOff: _constructorTearOff,
-            declarationConstructor: constructor,
-            implementationConstructor: _constructor,
-            enclosingDeclarationTypeParameters: classBuilder.cls.typeParameters,
-            libraryBuilder: libraryBuilder);
+        DelayedDefaultValueCloner delayedDefaultValueCloners =
+            buildConstructorTearOffProcedure(
+                tearOff: _constructorTearOff,
+                declarationConstructor: constructor,
+                implementationConstructor: _constructor,
+                enclosingDeclarationTypeParameters:
+                    classBuilder.cls.typeParameters,
+                libraryBuilder: libraryBuilder);
+        _delayedDefaultValueCloners.add(delayedDefaultValueCloners);
       }
 
       _hasBeenBuilt = true;
@@ -616,7 +619,7 @@
 
   final bool _hasSuperInitializingFormals;
 
-  final List<DelayedDefaultValueCloner> _superParameterDefaultValueCloners =
+  final List<DelayedDefaultValueCloner> _delayedDefaultValueCloners =
       <DelayedDefaultValueCloner>[];
 
   @override
@@ -634,7 +637,7 @@
             doFinishConstructor: false);
       }
       finalizeSuperInitializingFormals(
-          hierarchy, _superParameterDefaultValueCloners, initializers);
+          hierarchy, _delayedDefaultValueCloners, initializers);
     }
   }
 
@@ -824,8 +827,8 @@
           .addSuperParameterDefaultValueCloners(delayedDefaultValueCloners);
     }
 
-    delayedDefaultValueCloners.addAll(_superParameterDefaultValueCloners);
-    _superParameterDefaultValueCloners.clear();
+    delayedDefaultValueCloners.addAll(_delayedDefaultValueCloners);
+    _delayedDefaultValueCloners.clear();
   }
 
   @override
@@ -1085,6 +1088,8 @@
 
   final MemberName _memberName;
 
+  DelayedDefaultValueCloner? _delayedDefaultValueCloner;
+
   SourceExtensionTypeConstructorBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
@@ -1194,6 +1199,10 @@
       _buildBody();
     }
     beginInitializers = null;
+
+    if (_delayedDefaultValueCloner != null) {
+      delayedDefaultValueCloners.add(_delayedDefaultValueCloner!);
+    }
   }
 
   bool _hasBuiltBody = false;
@@ -1268,7 +1277,7 @@
       _constructor.isExtensionTypeMember = true;
 
       if (_constructorTearOff != null) {
-        buildConstructorTearOffProcedure(
+        _delayedDefaultValueCloner = buildConstructorTearOffProcedure(
             tearOff: _constructorTearOff,
             declarationConstructor: _constructor,
             implementationConstructor: _constructor,
diff --git a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
index 6f1c983..47de292 100644
--- a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
@@ -64,6 +64,8 @@
 
   final MemberName _memberName;
 
+  DelayedDefaultValueCloner? _delayedDefaultValueCloner;
+
   SourceFactoryBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
@@ -185,7 +187,7 @@
     _procedureInternal.isStatic = isStatic;
 
     if (_factoryTearOff != null) {
-      buildConstructorTearOffProcedure(
+      _delayedDefaultValueCloner = buildConstructorTearOffProcedure(
           tearOff: _factoryTearOff,
           declarationConstructor: _procedure,
           implementationConstructor: _procedureInternal,
@@ -201,6 +203,9 @@
       List<DelayedActionPerformer> delayedActionPerformers,
       List<DelayedDefaultValueCloner> delayedDefaultValueCloners) {
     if (_hasBuiltOutlines) return;
+    if (_delayedDefaultValueCloner != null) {
+      delayedDefaultValueCloners.add(_delayedDefaultValueCloner!);
+    }
     super.buildOutlineExpressions(
         classHierarchy, delayedActionPerformers, delayedDefaultValueCloners);
     _hasBuiltOutlines = true;
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 c04b2ab..6b0e8fc 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
@@ -5489,25 +5489,39 @@
     }
   }
 
-  void installTypedefTearOffs() {
+  List<DelayedDefaultValueCloner>? installTypedefTearOffs() {
+    List<DelayedDefaultValueCloner>? delayedDefaultValueCloners;
+
     Iterable<SourceLibraryBuilder>? augmentationLibraries =
         this.augmentationLibraries;
     if (augmentationLibraries != null) {
       for (SourceLibraryBuilder augmentationLibrary in augmentationLibraries) {
-        augmentationLibrary.installTypedefTearOffs();
+        List<DelayedDefaultValueCloner>?
+            augmentationLibraryDelayedDefaultValueCloners =
+            augmentationLibrary.installTypedefTearOffs();
+        if (augmentationLibraryDelayedDefaultValueCloners != null) {
+          (delayedDefaultValueCloners ??= [])
+              .addAll(augmentationLibraryDelayedDefaultValueCloners);
+        }
       }
     }
 
     Iterator<SourceTypeAliasBuilder> iterator = localMembersIteratorOfType();
     while (iterator.moveNext()) {
       SourceTypeAliasBuilder declaration = iterator.current;
-      declaration.buildTypedefTearOffs(this, (Procedure procedure) {
+      DelayedDefaultValueCloner? delayedDefaultValueCloner =
+          declaration.buildTypedefTearOffs(this, (Procedure procedure) {
         procedure.isStatic = true;
         if (!declaration.isAugmenting && !declaration.isDuplicate) {
           library.addProcedure(procedure);
         }
       });
+      if (delayedDefaultValueCloner != null) {
+        (delayedDefaultValueCloners ??= []).add(delayedDefaultValueCloner);
+      }
     }
+
+    return delayedDefaultValueCloners;
   }
 }
 
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 494f4c6..a0d48af 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1772,12 +1772,19 @@
     ticker.logMs("Resolved $count constructors");
   }
 
-  void installTypedefTearOffs() {
+  List<DelayedDefaultValueCloner>? installTypedefTearOffs() {
+    List<DelayedDefaultValueCloner>? delayedDefaultValueCloners;
     if (target.backendTarget.isTypedefTearOffLoweringEnabled) {
       for (SourceLibraryBuilder library in sourceLibraryBuilders) {
-        library.installTypedefTearOffs();
+        List<DelayedDefaultValueCloner>? libraryDelayedDefaultValueCloners =
+            library.installTypedefTearOffs();
+        if (libraryDelayedDefaultValueCloners != null) {
+          (delayedDefaultValueCloners ??= [])
+              .addAll(libraryDelayedDefaultValueCloners);
+        }
       }
     }
+    return delayedDefaultValueCloners;
   }
 
   void finishTypeVariables(Iterable<SourceLibraryBuilder> libraryBuilders,
diff --git a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
index 5e7b378..8902880 100644
--- a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
@@ -410,7 +410,8 @@
       VariableDeclaration newParameter = new VariableDeclaration(parameter.name,
           type: type,
           isFinal: parameter.isFinal,
-          isLowered: parameter.isLowered)
+          isLowered: parameter.isLowered,
+          isRequired: parameter.isRequired)
         ..fileOffset = parameter.fileOffset;
       _extensionTearOffParameterMap![parameter] = newParameter;
       return newParameter;
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 bb163cc..af462a6 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
@@ -362,10 +362,11 @@
 
   Map<Procedure, Member>? _tearOffDependencies;
 
-  void buildTypedefTearOffs(
+  DelayedDefaultValueCloner? buildTypedefTearOffs(
       SourceLibraryBuilder libraryBuilder, void Function(Procedure) f) {
     TypeDeclarationBuilder? declaration = unaliasDeclaration(null);
     DartType? targetType = typedef.type;
+    DelayedDefaultValueCloner? delayedDefaultValueCloner;
     switch (declaration) {
       case ClassBuilder():
         if (targetType is InterfaceType &&
@@ -411,7 +412,7 @@
                       tearOffReference);
               _tearOffDependencies![tearOff] = target;
 
-              buildTypedefTearOffProcedure(
+              delayedDefaultValueCloner = buildTypedefTearOffProcedure(
                   tearOff: tearOff,
                   declarationConstructor: target,
                   // TODO(johnniwinther): Handle augmented constructors.
@@ -464,7 +465,7 @@
                       tearOffReference);
               _tearOffDependencies![tearOff] = target;
 
-              buildTypedefTearOffProcedure(
+              delayedDefaultValueCloner = buildTypedefTearOffProcedure(
                   tearOff: tearOff,
                   declarationConstructor: target,
                   // TODO(johnniwinther): Handle augmented constructors.
@@ -488,5 +489,7 @@
       case OmittedTypeDeclarationBuilder():
       case null:
     }
+
+    return delayedDefaultValueCloner;
   }
 }
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 9c4a8b7..cd55faa 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -339,6 +339,7 @@
 branched
 branches
 break
+breakage
 breaking
 breakpoint
 breaks
@@ -3341,6 +3342,7 @@
 updaters
 updates
 updating
+uphold
 upon
 upper
 uppercase
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.outline.expect
index fee8235..46f47cc 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.outline.expect
@@ -39,7 +39,7 @@
     ;
   static method _#_#tearOff([core::int? field]) → self::Class4
     return new self::Class4::_(field);
-  static factory •([core::int? field]) → self::Class4
+  static factory •([core::int? field = null]) → self::Class4
     ;
   static method _#new#tearOff([core::int? field]) → self::Class4
     return self::Class4::•(field);
@@ -51,7 +51,7 @@
     ;
   static method _#_#tearOff(core::int field1, [core::int? field2]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static factory •(core::int field1, [core::int? field2]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = null]) → self::Class5
     ;
   static method _#new#tearOff(core::int field1, [core::int? field2]) → self::Class5
     return self::Class5::•(field1, field2);
@@ -64,7 +64,7 @@
     ;
   static method _#_#tearOff(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static factory •(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = null, required core::int field3}) → self::Class6
     ;
   static method _#new#tearOff(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     return self::Class6::•(field1, field2: field2, field3: field3);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.outline.expect
index 41c5082..2dab0be 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.outline.expect
@@ -8,7 +8,7 @@
     ;
   static method _#_#tearOff(core::int field) → self::Class1
     return new self::Class1::_(field);
-  static factory •([has-declared-initializer core::int field]) → self::Class1
+  static factory •([core::int field = 42]) → self::Class1
     ;
   static method _#new#tearOff([has-declared-initializer core::int field]) → self::Class1
     return self::Class1::•(field);
@@ -19,7 +19,7 @@
     ;
   static method _#_#tearOff(core::int field) → self::Class2
     return new self::Class2::_(field);
-  static factory •({has-declared-initializer core::int field}) → self::Class2
+  static factory •({core::int field = 42}) → self::Class2
     ;
   static method _#new#tearOff({has-declared-initializer core::int field}) → self::Class2
     return self::Class2::•(field: field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.weak.outline.expect
index 4e1e1d3..85d0288 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.weak.outline.expect
@@ -61,7 +61,7 @@
  - 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
   factory Link.create3(int i) = LinkFactory.create;
                                 ^";
-  static factory create4<T extends core::Object? = dynamic>({core::int i}) → self::Link<self::Link::create4::T%>
+  static factory create4<T extends core::Object? = dynamic>({core::int i = null}) → self::Link<self::Link::create4::T%>
     return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
  - 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
  - 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue52763.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue52763.dart.weak.outline.expect
index ea90d14..031af54 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue52763.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue52763.dart.weak.outline.expect
@@ -34,14 +34,14 @@
   const constructor •(core::int c, {core::bool a = true, core::bool b = false}) → self::P1
     : self::P1::c = c, super self::C::•(a: a, b: b)
     ;
-  static method _#new#tearOff(core::int c, {core::bool a = true, core::bool b = false}) → self::P1
+  static method _#new#tearOff(core::int c, {has-declared-initializer core::bool a, has-declared-initializer core::bool b}) → self::P1
     return new self::P1::•(c, a: a, b: b);
 }
 class P2 extends self::C /*hasConstConstructor*/  {
   const constructor •({core::bool b = false, core::bool a = true}) → self::P2
     : super self::C::•(b: b, a: a)
     ;
-  static method _#new#tearOff({core::bool b = false, core::bool a = true}) → self::P2
+  static method _#new#tearOff({has-declared-initializer core::bool b, has-declared-initializer core::bool a}) → self::P2
     return new self::P2::•(b: b, a: a);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
index 30d39f4..c5ef007 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
@@ -77,7 +77,7 @@
   synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::redirectingGenerative(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([has-declared-initializer core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
     return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
     return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
index ab2d842..21724e2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
@@ -77,7 +77,7 @@
   synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::redirectingGenerative(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([has-declared-initializer core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
     return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
     return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
index 18fb1bd..5aa3ab3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
@@ -77,7 +77,7 @@
   synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::redirectingGenerative(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([has-declared-initializer core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
     return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
     return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
index 18fb1bd..5aa3ab3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
@@ -77,7 +77,7 @@
   synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::redirectingGenerative(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([has-declared-initializer core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
     return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
     return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
index 95eef55..842b802d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
@@ -77,7 +77,7 @@
   synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::redirectingGenerative(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([has-declared-initializer core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
     return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
     return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
index d7bca17..31bffd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
@@ -43,7 +43,7 @@
     ;
   static method _#_#tearOff([core::int? field]) → self::Class4
     return new self::Class4::_(field);
-  static factory •([core::int? field]) → self::Class4 /* redirection-target: self::Class4::_ */
+  static factory •([core::int? field = null]) → self::Class4 /* redirection-target: self::Class4::_ */
     return new self::Class4::_(field);
   static method _#new#tearOff([core::int? field]) → self::Class4
     return new self::Class4::_(field);
@@ -55,7 +55,7 @@
     ;
   static method _#_#tearOff(core::int field1, [core::int? field2]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static factory •(core::int field1, [core::int? field2]) → self::Class5 /* redirection-target: self::Class5::_ */
+  static factory •(core::int field1, [core::int? field2 = null]) → self::Class5 /* redirection-target: self::Class5::_ */
     return new self::Class5::_(field1, field2);
   static method _#new#tearOff(core::int field1, [core::int? field2]) → self::Class5
     return new self::Class5::_(field1, field2);
@@ -68,7 +68,7 @@
     ;
   static method _#_#tearOff(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static factory •(core::int field1, {core::int? field2, required core::int field3}) → self::Class6 /* redirection-target: self::Class6::_ */
+  static factory •(core::int field1, {core::int? field2 = null, required core::int field3}) → self::Class6 /* redirection-target: self::Class6::_ */
     return new self::Class6::_(field1, field2: field2, field3: field3);
   static method _#new#tearOff(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
index a20154a..1d28aec 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
@@ -8,7 +8,7 @@
     ;
   static method _#_#tearOff([has-declared-initializer core::int field]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field]) → self::Class1 /* redirection-target: self::Class1::_ */
+  static factory •([core::int field = null]) → self::Class1 /* redirection-target: self::Class1::_ */
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field]) → self::Class1
     return new self::Class1::_(field);
@@ -19,7 +19,7 @@
     ;
   static method _#_#tearOff({has-declared-initializer core::int field}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field}) → self::Class2 /* redirection-target: self::Class2::_ */
+  static factory •({core::int field = null}) → self::Class2 /* redirection-target: self::Class2::_ */
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field}) → self::Class2
     return new self::Class2::_(field: field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
index 2041713..340ac0c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
@@ -11,11 +11,11 @@
     ;
   static method _#positional#tearOff([has-declared-initializer core::int field1, has-declared-initializer core::int field2]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1, core::int field2]) → self::Class1 /* redirection-target: self::Class1::positional */
+  static factory redirectPositionalSame([core::int field1 = null, core::int field2 = null]) → self::Class1 /* redirection-target: self::Class1::positional */
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1, core::int field2]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1]) → self::Class1 /* redirection-target: self::Class1::positional */
+  static factory redirectPositionalFewer1([core::int field1 = null]) → self::Class1 /* redirection-target: self::Class1::positional */
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1]) → self::Class1
     return new self::Class1::positional(field1);
@@ -25,19 +25,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({has-declared-initializer core::int field1, has-declared-initializer core::int field2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1, core::int field2}) → self::Class1 /* redirection-target: self::Class1::named */
+  static factory redirectNamedSame({core::int field1 = null, core::int field2 = null}) → self::Class1 /* redirection-target: self::Class1::named */
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1, core::int field2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2, core::int field1}) → self::Class1 /* redirection-target: self::Class1::named */
+  static factory redirectNamedReorder({core::int field2 = null, core::int field1 = null}) → self::Class1 /* redirection-target: self::Class1::named */
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2, core::int field1}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1}) → self::Class1 /* redirection-target: self::Class1::named */
+  static factory redirectNamedFewer1({core::int field1 = null}) → self::Class1 /* redirection-target: self::Class1::named */
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2}) → self::Class1 /* redirection-target: self::Class1::named */
+  static factory redirectNamedFewer2({core::int field2 = null}) → self::Class1 /* redirection-target: self::Class1::named */
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2}) → self::Class1
     return new self::Class1::named(field2: field2);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
index 5a82591..2a2ef26 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
@@ -15,7 +15,7 @@
     return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
   static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b, has-declared-initializer core::int c]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
-  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b, has-declared-initializer core::int c}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = null, core::int c = 42}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
     ;
   static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b, has-declared-initializer core::int c}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect
index ce73e4a..ada4fe9 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect
@@ -68,7 +68,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b, has-declared-initializer core::int c}) → mai::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
   return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
 static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
@@ -87,4 +87,5 @@
   #C7 = static-tearoff mai::_#F#fact#tearOff
   #C8 = static-tearoff mai::_#F#redirect#tearOff
   #C9 = null
+  #C10 = 42
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
index 7228e14..7572dc5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
@@ -42,7 +42,7 @@
     return new mai::A::•<mai::A::_#new#tearOff::T%>();
   static method _#named#tearOff<T extends core::Object? = dynamic>(mai::A::_#named#tearOff::T% a, [core::int? b]) → mai::A<mai::A::_#named#tearOff::T%>
     return new mai::A::named<mai::A::_#named#tearOff::T%>(a, b);
-  static factory fact<T extends core::Object? = dynamic>(mai::A::fact::T% a, {core::int? b, has-declared-initializer core::int c}) → mai::A<mai::A::fact::T%>
+  static factory fact<T extends core::Object? = dynamic>(mai::A::fact::T% a, {core::int? b = #C1, core::int c = #C2}) → mai::A<mai::A::fact::T%>
     ;
   static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b, has-declared-initializer core::int c}) → mai::A<mai::A::_#fact#tearOff::T%>
     return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
@@ -78,4 +78,5 @@
 
 constants  {
   #C1 = null
+  #C2 = 42
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
index 1481c06..997ef74 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
@@ -42,7 +42,7 @@
     return new typ::A::•<typ::A::_#new#tearOff::T%>();
   static method _#named#tearOff<T extends core::Object? = dynamic>(typ::A::_#named#tearOff::T% a, [core::int? b]) → typ::A<typ::A::_#named#tearOff::T%>
     return new typ::A::named<typ::A::_#named#tearOff::T%>(a, b);
-  static factory fact<T extends core::Object? = dynamic>(typ::A::fact::T% a, {core::int? b, has-declared-initializer core::int c}) → typ::A<typ::A::fact::T%>
+  static factory fact<T extends core::Object? = dynamic>(typ::A::fact::T% a, {core::int? b = null, core::int c = 42}) → typ::A<typ::A::fact::T%>
     ;
   static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b, has-declared-initializer core::int c}) → typ::A<typ::A::_#fact#tearOff::T%>
     return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
index e4781f1..9f57ebd 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
@@ -27,7 +27,7 @@
   final field core::int? field;
   constructor _([core::int? field = null]) → self::Class4
     ;
-  static factory •([core::int? field]) → self::Class4 /* redirection-target: self::Class4::_ */
+  static factory •([core::int? field = null]) → self::Class4 /* redirection-target: self::Class4::_ */
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
@@ -35,7 +35,7 @@
   final field core::int? field2;
   constructor _(core::int field1, [core::int? field2 = null]) → self::Class5
     ;
-  static factory •(core::int field1, [core::int? field2]) → self::Class5 /* redirection-target: self::Class5::_ */
+  static factory •(core::int field1, [core::int? field2 = null]) → self::Class5 /* redirection-target: self::Class5::_ */
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
@@ -44,7 +44,7 @@
   final field core::int field3;
   constructor _(core::int field1, {core::int? field2 = null, required core::int field3}) → self::Class6
     ;
-  static factory •(core::int field1, {core::int? field2, required core::int field3}) → self::Class6 /* redirection-target: self::Class6::_ */
+  static factory •(core::int field1, {core::int? field2 = null, required core::int field3}) → self::Class6 /* redirection-target: self::Class6::_ */
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
diff --git a/pkg/front_end/testcases/dart2js/issue52763.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/issue52763.dart.weak.outline.expect
index ea90d14..031af54 100644
--- a/pkg/front_end/testcases/dart2js/issue52763.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/issue52763.dart.weak.outline.expect
@@ -34,14 +34,14 @@
   const constructor •(core::int c, {core::bool a = true, core::bool b = false}) → self::P1
     : self::P1::c = c, super self::C::•(a: a, b: b)
     ;
-  static method _#new#tearOff(core::int c, {core::bool a = true, core::bool b = false}) → self::P1
+  static method _#new#tearOff(core::int c, {has-declared-initializer core::bool a, has-declared-initializer core::bool b}) → self::P1
     return new self::P1::•(c, a: a, b: b);
 }
 class P2 extends self::C /*hasConstConstructor*/  {
   const constructor •({core::bool b = false, core::bool a = true}) → self::P2
     : super self::C::•(b: b, a: a)
     ;
-  static method _#new#tearOff({core::bool b = false, core::bool a = true}) → self::P2
+  static method _#new#tearOff({has-declared-initializer core::bool b, has-declared-initializer core::bool a}) → self::P2
     return new self::P2::•(b: b, a: a);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect
index c4e0928..274ff60 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect
@@ -73,9 +73,9 @@
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect
index f76c662..7d14635 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect
@@ -73,9 +73,9 @@
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.expect
index c4e0928..274ff60 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.expect
@@ -73,9 +73,9 @@
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.modular.expect
index c4e0928..274ff60 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.modular.expect
@@ -73,9 +73,9 @@
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.outline.expect
index f9cd7be..8ef59c7 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.outline.expect
@@ -22,16 +22,16 @@
   static method _#new#tearOff<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::_#new#tearOff::T% value}) → self2::Class<self2::Class::_#new#tearOff::T%>
     return new self2::Class::•<self2::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
   @_in::patch
-  external static factory fact<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>;
+  external static factory fact<T extends core::Object? = dynamic>({core::bool defaultValue = true, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>;
   static method _#fact#tearOff<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::_#fact#tearOff::T% value}) → self2::Class<self2::Class::_#fact#tearOff::T%>
     return self2::Class::fact<self2::Class::_#fact#tearOff::T%>(defaultValue: defaultValue, value: value);
   @_in::patch
-  external static factory redirect<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
+  external static factory redirect<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
     return new self2::ClassImpl::•<self2::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   static method _#redirect#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::_#redirect#tearOff::T% value}) → self2::Class<self2::Class::_#redirect#tearOff::T%>
     return self2::Class::redirect<self2::Class::_#redirect#tearOff::T%>(defaultValue: defaultValue, value: value);
   @_in::patch
-  external static factory redirect2<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
+  external static factory redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
     return new self2::ClassImpl::patched<self2::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
   static method _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::_#redirect2#tearOff::T% value}) → self2::Class<self2::Class::_#redirect2#tearOff::T%>
     return self2::Class::redirect2<self2::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.transformed.expect
index f76c662..7d14635 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.weak.transformed.expect
@@ -73,9 +73,9 @@
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C15, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
diff --git a/pkg/front_end/testcases/dart2wasm/issue55529.dart b/pkg/front_end/testcases/dart2wasm/issue55529.dart
new file mode 100644
index 0000000..0b4890c
--- /dev/null
+++ b/pkg/front_end/testcases/dart2wasm/issue55529.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2024, 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 Object? a;
+
+  A1({required this.a});
+}
+
+class B1 extends A1 {
+  B1({super.a}) {}
+}
+
+class A2 {
+  final Object? a;
+
+  A2(this.a);
+}
+
+class B2 extends A2 {
+  B2([super.a]);
+}
+
+void main() {
+  var f1 = B1.new;
+  var f2 = B2.new;
+}
diff --git a/pkg/front_end/testcases/dart2wasm/issue55529.dart.strong.expect b/pkg/front_end/testcases/dart2wasm/issue55529.dart.strong.expect
new file mode 100644
index 0000000..cac766a
--- /dev/null
+++ b/pkg/front_end/testcases/dart2wasm/issue55529.dart.strong.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::Object? a;
+  constructor •({required core::Object? a}) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+  static method _#new#tearOff({required core::Object? a}) → self::A1
+    return new self::A1::•(a: a);
+}
+class B1 extends self::A1 {
+  constructor •({core::Object? a = #C1}) → self::B1
+    : super self::A1::•(a: a) {}
+  static method _#new#tearOff({core::Object? a = #C1}) → self::B1
+    return new self::B1::•(a: a);
+}
+class A2 extends core::Object {
+  final field core::Object? a;
+  constructor •(core::Object? a) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::Object? a) → self::A2
+    return new self::A2::•(a);
+}
+class B2 extends self::A2 {
+  constructor •([core::Object? a = #C1]) → self::B2
+    : super self::A2::•(a)
+    ;
+  static method _#new#tearOff([core::Object? a = #C1]) → self::B2
+    return new self::B2::•(a);
+}
+static method main() → void {
+  ({a: core::Object?}) → self::B1 f1 = #C2;
+  ([core::Object?]) → self::B2 f2 = #C3;
+}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::B1::_#new#tearOff
+  #C3 = static-tearoff self::B2::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2wasm/issue55529.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2wasm/issue55529.dart.strong.transformed.expect
new file mode 100644
index 0000000..cac766a
--- /dev/null
+++ b/pkg/front_end/testcases/dart2wasm/issue55529.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::Object? a;
+  constructor •({required core::Object? a}) → self::A1
+    : self::A1::a = a, super core::Object::•()
+    ;
+  static method _#new#tearOff({required core::Object? a}) → self::A1
+    return new self::A1::•(a: a);
+}
+class B1 extends self::A1 {
+  constructor •({core::Object? a = #C1}) → self::B1
+    : super self::A1::•(a: a) {}
+  static method _#new#tearOff({core::Object? a = #C1}) → self::B1
+    return new self::B1::•(a: a);
+}
+class A2 extends core::Object {
+  final field core::Object? a;
+  constructor •(core::Object? a) → self::A2
+    : self::A2::a = a, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::Object? a) → self::A2
+    return new self::A2::•(a);
+}
+class B2 extends self::A2 {
+  constructor •([core::Object? a = #C1]) → self::B2
+    : super self::A2::•(a)
+    ;
+  static method _#new#tearOff([core::Object? a = #C1]) → self::B2
+    return new self::B2::•(a);
+}
+static method main() → void {
+  ({a: core::Object?}) → self::B1 f1 = #C2;
+  ([core::Object?]) → self::B2 f2 = #C3;
+}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::B1::_#new#tearOff
+  #C3 = static-tearoff self::B2::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2wasm/issue55529.dart.textual_outline.expect b/pkg/front_end/testcases/dart2wasm/issue55529.dart.textual_outline.expect
new file mode 100644
index 0000000..6fd4f5a
--- /dev/null
+++ b/pkg/front_end/testcases/dart2wasm/issue55529.dart.textual_outline.expect
@@ -0,0 +1,19 @@
+class A1 {
+  final Object? a;
+  A1({required this.a});
+}
+
+class B1 extends A1 {
+  B1({super.a}) {}
+}
+
+class A2 {
+  final Object? a;
+  A2(this.a);
+}
+
+class B2 extends A2 {
+  B2([super.a]);
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/dart2wasm/issue55529.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2wasm/issue55529.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7264753
--- /dev/null
+++ b/pkg/front_end/testcases/dart2wasm/issue55529.dart.textual_outline_modelled.expect
@@ -0,0 +1,19 @@
+class A1 {
+  A1({required this.a});
+  final Object? a;
+}
+
+class A2 {
+  A2(this.a);
+  final Object? a;
+}
+
+class B1 extends A1 {
+  B1({super.a}) {}
+}
+
+class B2 extends A2 {
+  B2([super.a]);
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.outline.expect
index c309efe..7bfb695 100644
--- a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.outline.expect
@@ -20,7 +20,7 @@
     : self2::Class::defaultValue = defaultValue, super core::Object::•()
     ;
   @_in::patch
-  external static factory fact({has-declared-initializer core::bool defaultValue}) → self2::Class;
+  external static factory fact({core::bool defaultValue = true}) → self2::Class;
   static method _#fact#tearOff({has-declared-initializer core::bool defaultValue}) → self2::Class
     return self2::Class::fact(defaultValue: defaultValue);
   @_in::patch
diff --git a/pkg/front_end/testcases/extension_types/issue53209.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/issue53209.dart.weak.outline.expect
index 3e736e9..5027c3a 100644
--- a/pkg/front_end/testcases/extension_types/issue53209.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/issue53209.dart.weak.outline.expect
@@ -100,7 +100,7 @@
   return invalid-expression "pkg/front_end/testcases/extension_types/issue53209.dart:9:59: Error: The constructor function type 'E Function(int)' isn't a subtype of 'E Function(int, String, num)'.
   factory E.redirTooMany2(int foo, String bar, num baz) = E; // Error.
                                                           ^";
-static extension-type-member method E|constructor#redirTooMany3(core::int foo, [dynamic bar]) → self::E% /* erasure=core::int, declared=! */
+static extension-type-member method E|constructor#redirTooMany3(core::int foo, [dynamic bar = null]) → self::E% /* erasure=core::int, declared=! */
   return invalid-expression "pkg/front_end/testcases/extension_types/issue53209.dart:10:53: Error: The constructor function type 'E Function(int)' isn't a subtype of 'E Function(int, [dynamic])'.
   factory E.redirTooMany3(int foo, [dynamic bar]) = E; // Error.
                                                     ^";
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.strong.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.strong.expect
index 108c0da..0cc4089 100644
--- a/pkg/front_end/testcases/general/bounds_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.strong.expect
@@ -264,6 +264,6 @@
   (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → Null {};
 }
 static extension-member method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void {}
-static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
-  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {required s1: self::G<self::Class<dynamic>>, required s2: self::G<dynamic>, required s3: self::G<self::Class<dynamic>>, required s4: self::G<self::Class<dynamic>>, required s5: self::G<self::ConcreteClass>, required s6: self::G<self::Class<self::ConcreteClass>>, required s7: self::G<core::Object>, required s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.strong.transformed.expect
index 108c0da..0cc4089 100644
--- a/pkg/front_end/testcases/general/bounds_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.strong.transformed.expect
@@ -264,6 +264,6 @@
   (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → Null {};
 }
 static extension-member method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void {}
-static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
-  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {required s1: self::G<self::Class<dynamic>>, required s2: self::G<dynamic>, required s3: self::G<self::Class<dynamic>>, required s4: self::G<self::Class<dynamic>>, required s5: self::G<self::ConcreteClass>, required s6: self::G<self::Class<self::ConcreteClass>>, required s7: self::G<core::Object>, required s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect
index 108c0da..0cc4089 100644
--- a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect
@@ -264,6 +264,6 @@
   (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → Null {};
 }
 static extension-member method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void {}
-static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
-  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {required s1: self::G<self::Class<dynamic>>, required s2: self::G<dynamic>, required s3: self::G<self::Class<dynamic>>, required s4: self::G<self::Class<dynamic>>, required s5: self::G<self::ConcreteClass>, required s6: self::G<self::Class<self::ConcreteClass>>, required s7: self::G<core::Object>, required s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect
index 108c0da..0cc4089 100644
--- a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect
@@ -264,6 +264,6 @@
   (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → Null {};
 }
 static extension-member method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void {}
-static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
-  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {required s1: self::G<self::Class<dynamic>>, required s2: self::G<dynamic>, required s3: self::G<self::Class<dynamic>>, required s4: self::G<self::Class<dynamic>>, required s5: self::G<self::ConcreteClass>, required s6: self::G<self::Class<self::ConcreteClass>>, required s7: self::G<core::Object>, required s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect
index f4262c1..4ec5a0d 100644
--- a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect
@@ -184,7 +184,7 @@
   ;
 static extension-member method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void
   ;
-static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
-  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {required s1: self::G<self::Class<dynamic>>, required s2: self::G<dynamic>, required s3: self::G<self::Class<dynamic>>, required s4: self::G<self::Class<dynamic>>, required s5: self::G<self::ConcreteClass>, required s6: self::G<self::Class<self::ConcreteClass>>, required s7: self::G<core::Object>, required s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect
index 108c0da..0cc4089 100644
--- a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect
@@ -264,6 +264,6 @@
   (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → Null {};
 }
 static extension-member method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void {}
-static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
-  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static extension-member method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {required s1: self::G<self::Class<dynamic>>, required s2: self::G<dynamic>, required s3: self::G<self::Class<dynamic>>, required s4: self::G<self::Class<dynamic>>, required s5: self::G<self::ConcreteClass>, required s6: self::G<self::Class<self::ConcreteClass>>, required s7: self::G<core::Object>, required s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.expect
index 7ee8265..9796958 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.transformed.expect
index 7ee8265..9796958 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.strong.transformed.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.expect
index 7ee8265..9796958 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.modular.expect
index 7ee8265..9796958 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.modular.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.outline.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.outline.expect
index 114b78c..6eb88de 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.outline.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   ;
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic
   ;
 
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.transformed.expect
index 7ee8265..9796958 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure.dart.weak.transformed.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.expect
index bf3388f..766b6b7 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.transformed.expect
index bf3388f..766b6b7 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.strong.transformed.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.expect
index bf3388f..766b6b7 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.modular.expect
index bf3388f..766b6b7 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.modular.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.outline.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.outline.expect
index 86dccdd..32f7946 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.outline.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   ;
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic
   ;
 
diff --git a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.transformed.expect
index bf3388f..766b6b7 100644
--- a/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/weekly_bot_91_failure_variation_1.dart.weak.transformed.expect
@@ -10,8 +10,8 @@
 }
 static extension-member method _extension#0|_foo<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_foo::T%) → void x, {required self::_extension#0|_foo::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_foo(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_foo<T%>(#this, x, a: a);
 static method main() → dynamic {}
 
 library;
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
index b175e2a..2d33898 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
@@ -20,7 +20,7 @@
     : self2::Class::defaultValue = defaultValue, super core::Object::•()
     ;
   @_in::patch
-  external static factory fact({has-declared-initializer core::bool defaultValue}) → self2::Class;
+  external static factory fact({core::bool defaultValue = true}) → self2::Class;
   @_in::patch
   external static factory constFact({core::bool defaultValue = true}) → self2::Class;
   @_in::patch
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
index ffa1c0c..1619ece 100644
--- a/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
@@ -4,7 +4,7 @@
 
 abstract class A extends core::Object {
   abstract get value() → core::int;
-  static factory •({core::int value}) → self::A /* redirection-target: self::_AImpl::• */
+  static factory •({core::int value = null}) → self::A /* redirection-target: self::_AImpl::• */
     return new self::_AImpl::•(value: value);
 }
 class _AImpl extends core::Object implements self::A {
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect
index 3dac0d4..3641175 100644
--- a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect
@@ -11,25 +11,25 @@
     return new self::Class::positional();
   static factory redirect2a(core::int a) → self::Class /* redirection-target: self::Class::positional */
     return new self::Class::positional(a);
-  static factory redirect3a([core::int a]) → self::Class /* redirection-target: self::Class::positional */
+  static factory redirect3a([core::int a = null]) → self::Class /* redirection-target: self::Class::positional */
     return new self::Class::positional(a);
-  static factory redirect4a(core::int a, [core::int b]) → self::Class /* redirection-target: self::Class::positional */
+  static factory redirect4a(core::int a, [core::int b = null]) → self::Class /* redirection-target: self::Class::positional */
     return new self::Class::positional(a, b);
-  static factory redirect5a([core::int a, core::int b]) → self::Class /* redirection-target: self::Class::positional */
+  static factory redirect5a([core::int a = null, core::int b = null]) → self::Class /* redirection-target: self::Class::positional */
     return new self::Class::positional(a, b);
-  static factory redirect6a([core::int a, has-declared-initializer core::int b]) → self::Class /* redirection-target: self::Class::positional */
+  static factory redirect6a([core::int a = null, core::int b = 2]) → self::Class /* redirection-target: self::Class::positional */
     return new self::Class::positional(a, b);
   static factory redirect1b() → self::Class /* redirection-target: self::Class::named */
     return new self::Class::named();
-  static factory redirect2b({core::int a}) → self::Class /* redirection-target: self::Class::named */
+  static factory redirect2b({core::int a = null}) → self::Class /* redirection-target: self::Class::named */
     return new self::Class::named(a: a);
-  static factory redirect3b({core::int b}) → self::Class /* redirection-target: self::Class::named */
+  static factory redirect3b({core::int b = null}) → self::Class /* redirection-target: self::Class::named */
     return new self::Class::named(b: b);
-  static factory redirect4b({core::int a, core::int b}) → self::Class /* redirection-target: self::Class::named */
+  static factory redirect4b({core::int a = null, core::int b = null}) → self::Class /* redirection-target: self::Class::named */
     return new self::Class::named(a: a, b: b);
-  static factory redirect5b({core::int b, core::int a}) → self::Class /* redirection-target: self::Class::named */
+  static factory redirect5b({core::int b = null, core::int a = null}) → self::Class /* redirection-target: self::Class::named */
     return new self::Class::named(b: b, a: a);
-  static factory redirect6b({has-declared-initializer core::int a, core::int b}) → self::Class /* redirection-target: self::Class::named */
+  static factory redirect6b({core::int a = 1, core::int b = null}) → self::Class /* redirection-target: self::Class::named */
     return new self::Class::named(a: a, b: b);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
index 54b1142..e57dbb8 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
@@ -6,7 +6,7 @@
   final field core::int field;
   constructor •([core::int field = 42]) → self::A
     ;
-  static factory redirect([has-declared-initializer core::int field]) → self::A /* redirection-target: self::A::• */
+  static factory redirect([core::int field = 87]) → self::A /* redirection-target: self::A::• */
     return new self::A::•(field);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/tear_off_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/tear_off_patch/main.dart.weak.outline.expect
index 524d598d..20e5b577 100644
--- a/pkg/front_end/testcases/general/tear_off_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/tear_off_patch/main.dart.weak.outline.expect
@@ -20,12 +20,12 @@
   @_in::patch
   external constructor •({core::bool defaultValue = true, required self2::Class::T% value}) → self2::Class<self2::Class::T%>;
   @_in::patch
-  external static factory fact<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>;
+  external static factory fact<T extends core::Object? = dynamic>({core::bool defaultValue = true, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>;
   @_in::patch
-  external static factory redirect<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
+  external static factory redirect<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
     return new self2::ClassImpl::•<self2::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   @_in::patch
-  external static factory redirect2<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
+  external static factory redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
     return new self2::ClassImpl::patched<self2::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
 }
 @_in::patch
diff --git a/pkg/front_end/testcases/general/top_level_vs_local_inference.dart.weak.outline.expect b/pkg/front_end/testcases/general/top_level_vs_local_inference.dart.weak.outline.expect
index 093d365..d18b7d1 100644
--- a/pkg/front_end/testcases/general/top_level_vs_local_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/top_level_vs_local_inference.dart.weak.outline.expect
@@ -25,7 +25,7 @@
 class TableSchema<F extends self::Column, C extends self::TableContext> extends core::Object {
   constructor _() → self::TableSchema<self::TableSchema::F, self::TableSchema::C>
     ;
-  static factory •<F extends self::Column, C extends self::TableContext>({required core::Iterable<self::TableSchema::•::F> fields, self::TableSchema::•::C? context}) → self::TableSchema<self::TableSchema::•::F, self::TableSchema::•::C>
+  static factory •<F extends self::Column, C extends self::TableContext>({required core::Iterable<self::TableSchema::•::F> fields, self::TableSchema::•::C? context = null}) → self::TableSchema<self::TableSchema::•::F, self::TableSchema::•::C>
     ;
 }
 static field self::TableSchema<dynamic, self::TableContext> schema;
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect
index d2ec188..63c7343 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect
@@ -147,24 +147,24 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
 static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
 static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
   return throw "";
 static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
   return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
-static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
-  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void
+  return <T extends core::Object? = dynamic>({required (T%) → void a, required T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
   return throw "";
 static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
+static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>(T% b, {required (T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
 static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
   return throw "";
 static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
@@ -215,16 +215,16 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
   return throw "";
 static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect
index 51fa5c4..f0c73f9 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect
@@ -147,24 +147,24 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
 static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
 static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
   return throw "";
 static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
   return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
-static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
-  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void
+  return <T extends core::Object? = dynamic>({required (T%) → void a, required T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
   return throw "";
 static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
+static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>(T% b, {required (T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
 static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
   return throw "";
 static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
@@ -215,16 +215,16 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
   return throw "";
 static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.expect
index d2ec188..63c7343 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.expect
@@ -147,24 +147,24 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
 static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
 static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
   return throw "";
 static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
   return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
-static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
-  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void
+  return <T extends core::Object? = dynamic>({required (T%) → void a, required T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
   return throw "";
 static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
+static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>(T% b, {required (T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
 static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
   return throw "";
 static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
@@ -215,16 +215,16 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
   return throw "";
 static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.modular.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.modular.expect
index d2ec188..63c7343 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.modular.expect
@@ -147,24 +147,24 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
 static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
 static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
   return throw "";
 static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
   return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
-static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
-  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void
+  return <T extends core::Object? = dynamic>({required (T%) → void a, required T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
   return throw "";
 static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
+static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>(T% b, {required (T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
 static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
   return throw "";
 static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
@@ -215,16 +215,16 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
   return throw "";
 static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.outline.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.outline.expect
index ba03313..c7e2cf1 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.outline.expect
@@ -94,24 +94,24 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
 static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
   ;
-static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
 static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
   ;
 static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
   return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
-static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
   ;
-static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
-  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void
+  return <T extends core::Object? = dynamic>({required (T%) → void a, required T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
   ;
 static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
   ;
-static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
+static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>(T% b, {required (T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
 static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
   ;
 static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
@@ -162,15 +162,15 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
   ;
-static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
   ;
 static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
   ;
-static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.transformed.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.transformed.expect
index 51fa5c4..f0c73f9 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.weak.transformed.expect
@@ -147,24 +147,24 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
 static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
   return throw "";
-static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
-  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
+static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void
+  return <T extends core::Object? = dynamic>((T%) → void x, {required T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
 static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
   return throw "";
 static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
   return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
-static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
-  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void
+  return <T extends core::Object? = dynamic>({required (T%) → void a, required T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
   return throw "";
 static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
   return throw "";
-static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
+static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>(T% b, {required (T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
 static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
   return throw "";
 static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
@@ -215,16 +215,16 @@
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
 static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
   return throw "";
 static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
   return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
 static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
   return throw "";
-static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
-  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
+static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void
+  return <T extends core::Object? = dynamic>({required T% a, required (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
index 5f42b5f..2731adf 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
@@ -103,19 +103,19 @@
     ;
   external constructor constructor8([core::int i = null]) → self::A;
   external constructor constructor9({core::int i = null}) → self::A;
-  static factory factory3([core::int i]) → self::A /* redirection-target: self::A::constructor3 */
+  static factory factory3([core::int i = null]) → self::A /* redirection-target: self::A::constructor3 */
     return new self::A::constructor3(i);
-  static factory factory4({core::int i}) → self::A /* redirection-target: self::A::constructor4 */
+  static factory factory4({core::int i = null}) → self::A /* redirection-target: self::A::constructor4 */
     return new self::A::constructor4(i: i);
-  static factory factory5([core::int? i]) → self::A /* redirection-target: self::A::constructor5 */
+  static factory factory5([core::int? i = null]) → self::A /* redirection-target: self::A::constructor5 */
     return new self::A::constructor5(i);
-  static factory factory6({core::int? i}) → self::A /* redirection-target: self::A::constructor6 */
+  static factory factory6({core::int? i = null}) → self::A /* redirection-target: self::A::constructor6 */
     return new self::A::constructor6(i: i);
   static factory factory7({required core::int i}) → self::A /* redirection-target: self::A::constructor7 */
     return new self::A::constructor7(i: i);
-  static factory factory8([core::int i]) → self::A
+  static factory factory8([core::int i = null]) → self::A
     ;
-  static factory factory9({core::int i}) → self::A
+  static factory factory9({core::int i = null}) → self::A
     ;
   method method3([core::int i = null]) → dynamic
     ;
@@ -156,19 +156,19 @@
     ;
   constructor constructor7({required core::int i}) → self::C
     ;
-  static factory factory3([core::int i]) → self::C /* redirection-target: self::C::constructor3 */
+  static factory factory3([core::int i = null]) → self::C /* redirection-target: self::C::constructor3 */
     return new self::C::constructor3(i);
-  static factory factory4({core::int i}) → self::C /* redirection-target: self::C::constructor4 */
+  static factory factory4({core::int i = null}) → self::C /* redirection-target: self::C::constructor4 */
     return new self::C::constructor4(i: i);
-  static factory factory5([core::int? i]) → self::C /* redirection-target: self::C::constructor5 */
+  static factory factory5([core::int? i = null]) → self::C /* redirection-target: self::C::constructor5 */
     return new self::C::constructor5(i);
-  static factory factory6({core::int? i}) → self::C /* redirection-target: self::C::constructor6 */
+  static factory factory6({core::int? i = null}) → self::C /* redirection-target: self::C::constructor6 */
     return new self::C::constructor6(i: i);
   static factory factory7({required core::int i}) → self::C /* redirection-target: self::C::constructor7 */
     return new self::C::constructor7(i: i);
-  static factory factory8([core::int i]) → self::C
+  static factory factory8([core::int i = null]) → self::C
     ;
-  static factory factory9({core::int i}) → self::C
+  static factory factory9({core::int i = null}) → self::C
     ;
   method method3([core::int i = null]) → dynamic
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
index bbe1162..cd81133 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
@@ -18,9 +18,9 @@
 class C extends core::Object {
   constructor gen({core::int i = null}) → self::C
     ;
-  static factory fact({core::int i}) → self::C
+  static factory fact({core::int i = null}) → self::C
     ;
-  static factory redirect({core::int i}) → self::C /* redirection-target: self::C::gen */
+  static factory redirect({core::int i = null}) → self::C /* redirection-target: self::C::gen */
     return new self::C::gen(i: i);
 }
 class D extends core::Object {
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index bf10220..d7fb52b 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -814,11 +814,42 @@
     bool savedInCatchBlock = inCatchBlock;
     AsyncMarker savedAsyncMarker = currentAsyncMarker;
     currentAsyncMarker = node.asyncMarker;
-    if (!isOutline &&
-        node.asyncMarker == AsyncMarker.Async &&
-        node.emittedValueType == null) {
-      problem(node,
-          "No future value type set for async function in opt-in library.");
+    if (!isOutline) {
+      if (node.asyncMarker == AsyncMarker.Async &&
+          node.emittedValueType == null) {
+        problem(node,
+            "No future value type set for async function in opt-in library.");
+      }
+
+      TreeNode? parent = node.parent;
+      if (parent is! Procedure ||
+          !parent.isAbstract &&
+              !parent.isSynthetic &&
+              !parent.isSyntheticForwarder) {
+        for (int positionalIndex = 0;
+            positionalIndex < node.positionalParameters.length;
+            positionalIndex++) {
+          if (positionalIndex >= node.requiredParameterCount) {
+            VariableDeclaration positionalParameter =
+                node.positionalParameters[positionalIndex];
+            if (positionalParameter.initializer == null) {
+              problem(
+                  positionalParameter,
+                  "An optional positional parameter is expected to have a "
+                  "default value initializer, defined or synthesized.");
+            }
+          }
+        }
+        for (VariableDeclaration namedParameter in node.namedParameters) {
+          if (!namedParameter.isRequired &&
+              namedParameter.initializer == null) {
+            problem(
+                namedParameter,
+                "An optional named parameter is expected to have a default "
+                "value initializer, defined or synthesized.");
+          }
+        }
+      }
     }
     inCatchBlock = false;
     visitWithLocalScope(node);