[cfe] Copy default values into redirecting factories

Redirecting factories are not allowed to declare default values but
should instead inherit the default values from their target. Since
the current encoding of redirecting factories is a callable function
used as the tear-off by the VM, the default values should be copied
to the procedure representing the redirecting factory.

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

Change-Id: I0e601cd4920bc1059c9bf99e4a4c9c0e20c183e6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/237160
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
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 edf0831..8665c23 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
@@ -462,34 +462,51 @@
           new RedirectingFactoryBody(target, typeArguments, function);
       function.body!.parent = function;
     }
-    if (_factoryTearOff != null) {
-      Set<Procedure> seenTargets = {};
-      while (target is Procedure && target.isRedirectingFactory) {
-        if (!seenTargets.add(target)) {
-          // Cyclic dependency.
-          target = null;
-          break;
-        }
-        RedirectingFactoryBody body =
-            target.function.body as RedirectingFactoryBody;
-        if (typeArguments != null) {
-          Substitution substitution = Substitution.fromPairs(
-              target.function.typeParameters, typeArguments);
-          typeArguments =
-              body.typeArguments?.map(substitution.substituteType).toList();
-        } else {
-          typeArguments = body.typeArguments;
-        }
-        target = body.target;
+
+    Set<Procedure> seenTargets = {};
+    while (target is Procedure && target.isRedirectingFactory) {
+      if (!seenTargets.add(target)) {
+        // Cyclic dependency.
+        target = null;
+        break;
       }
-      if (target is Constructor || target is Procedure && target.isFactory) {
+      RedirectingFactoryBody body =
+          target.function.body as RedirectingFactoryBody;
+      if (typeArguments != null) {
+        Substitution substitution = Substitution.fromPairs(
+            target.function.typeParameters, typeArguments);
+        typeArguments =
+            body.typeArguments?.map(substitution.substituteType).toList();
+      } else {
+        typeArguments = body.typeArguments;
+      }
+      target = body.target;
+    }
+
+    if (target is Constructor || target is Procedure && target.isFactory) {
+      typeArguments ??= [];
+      if (_factoryTearOff != null) {
         synthesizedFunctionNodes.add(buildRedirectingFactoryTearOffBody(
             _factoryTearOff!,
             target!,
-            typeArguments ?? [],
+            typeArguments,
             _tearOffTypeParameters!,
             library));
       }
+      Map<TypeParameter, DartType> substitutionMap;
+      if (function.typeParameters.length == typeArguments.length) {
+        substitutionMap = new Map<TypeParameter, DartType>.fromIterables(
+            function.typeParameters, typeArguments);
+      } else {
+        // Error case: Substitute type parameters with `dynamic`.
+        substitutionMap = new Map<TypeParameter, DartType>.fromIterables(
+            function.typeParameters,
+            new List<DartType>.generate(function.typeParameters.length,
+                (int index) => const DynamicType()));
+      }
+      synthesizedFunctionNodes.add(new SynthesizedFunctionNode(
+          substitutionMap, target!.function!, function,
+          libraryBuilder: library, identicalSignatures: false));
     }
     if (isConst && isPatch) {
       _finishPatch();
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 4acef90..a55684b 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
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(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 e793729..149333a 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
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(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 841838c..7093a76 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
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(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 841838c..7093a76 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
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(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 742d873..0b49573 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
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
index 8c398fe..00b5a13 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
index cc59901..f707639 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
index 8c398fe..00b5a13 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
index 8c398fe..00b5a13 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
index cc59901..f707639 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
index aa8c2df..f53573a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
index aa4af4d..80d7fd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
index aa8c2df..f53573a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
index aa8c2df..f53573a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
index aa4af4d..80d7fd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
index 713b894..3175a4a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
index e1f62d1..9913373 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
index 911cbda..2a8a57e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
index 911cbda..2a8a57e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
index ec985b8..7444b65 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
index 0cdd47c..ec986d0 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
@@ -37,7 +37,7 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
     return throw "unsupported";
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
index 0cdd47c..ec986d0 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
@@ -37,7 +37,7 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
     return throw "unsupported";
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
index 0cdd47c..ec986d0 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
@@ -37,7 +37,7 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
     return throw "unsupported";
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.expect
index 706562c..0be5e5b 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.expect
@@ -10,17 +10,17 @@
 }
 class Settings extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
-  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+  static factory •({@#C3 self::Sidebar sidebar = #C2}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C2}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
@@ -30,7 +30,7 @@
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -45,10 +45,9 @@
   #C1 = constructor-tearoff self::Settings::•
   #C2 = self::_$_SSidebar {}
   #C3 = self::Default {defaultValue:#C2}
-  #C4 = null
-  #C5 = constructor-tearoff self::Sidebar::•
-  #C6 = constructor-tearoff self::_SSettings::•
-  #C7 = constructor-tearoff self::_SSidebar::•
+  #C4 = constructor-tearoff self::Sidebar::•
+  #C5 = constructor-tearoff self::_SSettings::•
+  #C6 = constructor-tearoff self::_SSidebar::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
index 706562c..0be5e5b 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
@@ -10,17 +10,17 @@
 }
 class Settings extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
-  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+  static factory •({@#C3 self::Sidebar sidebar = #C2}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C2}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
@@ -30,7 +30,7 @@
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -45,10 +45,9 @@
   #C1 = constructor-tearoff self::Settings::•
   #C2 = self::_$_SSidebar {}
   #C3 = self::Default {defaultValue:#C2}
-  #C4 = null
-  #C5 = constructor-tearoff self::Sidebar::•
-  #C6 = constructor-tearoff self::_SSettings::•
-  #C7 = constructor-tearoff self::_SSidebar::•
+  #C4 = constructor-tearoff self::Sidebar::•
+  #C5 = constructor-tearoff self::_SSettings::•
+  #C6 = constructor-tearoff self::_SSidebar::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
index 706562c..0be5e5b 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
@@ -10,17 +10,17 @@
 }
 class Settings extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
-  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+  static factory •({@#C3 self::Sidebar sidebar = #C2}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C2}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
@@ -30,7 +30,7 @@
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -45,10 +45,9 @@
   #C1 = constructor-tearoff self::Settings::•
   #C2 = self::_$_SSidebar {}
   #C3 = self::Default {defaultValue:#C2}
-  #C4 = null
-  #C5 = constructor-tearoff self::Sidebar::•
-  #C6 = constructor-tearoff self::_SSettings::•
-  #C7 = constructor-tearoff self::_SSidebar::•
+  #C4 = constructor-tearoff self::Sidebar::•
+  #C5 = constructor-tearoff self::_SSettings::•
+  #C6 = constructor-tearoff self::_SSidebar::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue48548.dart b/pkg/front_end/testcases/general/issue48548.dart
new file mode 100644
index 0000000..52be292
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class A {
+  int get value;
+  factory A({int value}) = _AImpl;
+}
+
+class _AImpl implements A {
+  final int value;
+  _AImpl({this.value = 0});
+}
+
+const _new = A.new;
+const _newImpl = _AImpl.new;
+
+void main(List<String> args) {
+  expect(0, A().value);
+  expect(0, A.new().value);
+  expect(0, _new().value);
+  expect(0, (A.new)().value);
+  expect(0, _AImpl().value);
+  expect(0, _AImpl.new().value);
+  expect(0, _newImpl().value);
+  expect(0, (_AImpl.new)().value);
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue48548.dart.textual_outline.expect
new file mode 100644
index 0000000..a9c9cef
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+abstract class A {
+  int get value;
+  factory A({int value}) = _AImpl;
+}
+
+class _AImpl implements A {
+  final int value;
+  _AImpl({this.value = 0});
+}
+
+const _new = A.new;
+const _newImpl = _AImpl.new;
+void main(List<String> args) {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue48548.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0c47551
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+abstract class A {
+  factory A({int value}) = _AImpl;
+  int get value;
+}
+
+class _AImpl implements A {
+  _AImpl({this.value = 0});
+  final int value;
+}
+
+const _new = A.new;
+const _newImpl = _AImpl.new;
+expect(expected, actual) {}
+void main(List<String> args) {}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.expect
new file mode 100644
index 0000000..5077524
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value = #C2}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = #C2}) → self::_AImpl
+    : self::_AImpl::value = value, super core::Object::•()
+    ;
+}
+static const field ({value: core::int}) → self::A _new = #C3;
+static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
+static method main(core::List<core::String> args) → void {
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = 0
+  #C3 = redirecting-factory-tearoff self::A::•
+  #C4 = constructor-tearoff self::_AImpl::•
+}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.modular.expect
new file mode 100644
index 0000000..5077524
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value = #C2}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = #C2}) → self::_AImpl
+    : self::_AImpl::value = value, super core::Object::•()
+    ;
+}
+static const field ({value: core::int}) → self::A _new = #C3;
+static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
+static method main(core::List<core::String> args) → void {
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = 0
+  #C3 = redirecting-factory-tearoff self::A::•
+  #C4 = constructor-tearoff self::_AImpl::•
+}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
new file mode 100644
index 0000000..3119c74
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = 0}) → self::_AImpl
+    ;
+}
+static const field ({value: core::int}) → self::A _new = self::A::•;
+static const field ({value: core::int}) → self::_AImpl _newImpl = self::_AImpl::•;
+static method main(core::List<core::String> args) → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue48548.dart:5:16 -> ConstructorTearOffConstant(A.)
+Evaluated: RedirectingFactoryTearOff @ org-dartlang-testcase:///issue48548.dart:15:14 -> RedirectingFactoryTearOffConstant(A.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue48548.dart:16:18 -> ConstructorTearOffConstant(_AImpl.)
+Extra constant evaluation: evaluated: 6, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.transformed.expect
new file mode 100644
index 0000000..5077524
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value = #C2}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = #C2}) → self::_AImpl
+    : self::_AImpl::value = value, super core::Object::•()
+    ;
+}
+static const field ({value: core::int}) → self::A _new = #C3;
+static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
+static method main(core::List<core::String> args) → void {
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = 0
+  #C3 = redirecting-factory-tearoff self::A::•
+  #C4 = constructor-tearoff self::_AImpl::•
+}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart b/pkg/front_end/testcases/general/redirecting_default_values.dart
new file mode 100644
index 0000000..322fc25
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, 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 Class {
+  Class.positional([int a = 0, int b = 42]);
+  factory Class.redirect1a() = Class.positional;
+  factory Class.redirect2a(int a) = Class.positional;
+  factory Class.redirect3a([int a]) = Class.positional;
+  factory Class.redirect4a(int a, [int b]) = Class.positional;
+  factory Class.redirect5a([int a, int b]) = Class.positional;
+  factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+
+  Class.named({int a = 0, int b = 42});
+  factory Class.redirect1b() = Class.named;
+  factory Class.redirect2b({int a}) = Class.named;
+  factory Class.redirect3b({int b}) = Class.named;
+  factory Class.redirect4b({int a, int b}) = Class.named;
+  factory Class.redirect5b({int b, int a}) = Class.named;
+  factory Class.redirect6b({int a = 1, int b}) = Class.named;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline.expect
new file mode 100644
index 0000000..85004fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+class Class {
+  Class.positional([int a = 0, int b = 42]);
+  factory Class.redirect1a() = Class.positional;
+  factory Class.redirect2a(int a) = Class.positional;
+  factory Class.redirect3a([int a]) = Class.positional;
+  factory Class.redirect4a(int a, [int b]) = Class.positional;
+  factory Class.redirect5a([int a, int b]) = Class.positional;
+  factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+  Class.named({int a = 0, int b = 42});
+  factory Class.redirect1b() = Class.named;
+  factory Class.redirect2b({int a}) = Class.named;
+  factory Class.redirect3b({int b}) = Class.named;
+  factory Class.redirect4b({int a, int b}) = Class.named;
+  factory Class.redirect5b({int b, int a}) = Class.named;
+  factory Class.redirect6b({int a = 1, int b}) = Class.named;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c7ca7ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+class Class {
+  Class.named({int a = 0, int b = 42});
+  Class.positional([int a = 0, int b = 42]);
+  factory Class.redirect1a() = Class.positional;
+  factory Class.redirect1b() = Class.named;
+  factory Class.redirect2a(int a) = Class.positional;
+  factory Class.redirect2b({int a}) = Class.named;
+  factory Class.redirect3a([int a]) = Class.positional;
+  factory Class.redirect3b({int b}) = Class.named;
+  factory Class.redirect4a(int a, [int b]) = Class.positional;
+  factory Class.redirect4b({int a, int b}) = Class.named;
+  factory Class.redirect5a([int a, int b]) = Class.positional;
+  factory Class.redirect5b({int b, int a}) = Class.named;
+  factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+  factory Class.redirect6b({int a = 1, int b}) = Class.named;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.expect
new file mode 100644
index 0000000..f08d181
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:12:44: Error: Can't have a default value here because any default values of 'Class.positional' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+//                                            ^
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:20:37: Error: Can't have a default value here because any default values of 'Class.named' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6b({int a = 1, int b}) = Class.named;
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C10, #C11, #C12]/*isLegacy*/;
+  constructor positional([core::int a = #C13, core::int b = #C14]) → self::Class
+    : super core::Object::•()
+    ;
+  constructor named({core::int a = #C13, core::int b = #C14}) → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a = #C13) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a = #C13]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a = #C13, [core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a = #C13}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b = #C14}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b = #C14, core::int a = #C13}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect1a
+  #C2 = constructor-tearoff self::Class::redirect2a
+  #C3 = constructor-tearoff self::Class::redirect3a
+  #C4 = constructor-tearoff self::Class::redirect4a
+  #C5 = constructor-tearoff self::Class::redirect5a
+  #C6 = constructor-tearoff self::Class::redirect6a
+  #C7 = constructor-tearoff self::Class::redirect1b
+  #C8 = constructor-tearoff self::Class::redirect2b
+  #C9 = constructor-tearoff self::Class::redirect3b
+  #C10 = constructor-tearoff self::Class::redirect4b
+  #C11 = constructor-tearoff self::Class::redirect5b
+  #C12 = constructor-tearoff self::Class::redirect6b
+  #C13 = 0
+  #C14 = 42
+}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..f08d181
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:12:44: Error: Can't have a default value here because any default values of 'Class.positional' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+//                                            ^
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:20:37: Error: Can't have a default value here because any default values of 'Class.named' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6b({int a = 1, int b}) = Class.named;
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C10, #C11, #C12]/*isLegacy*/;
+  constructor positional([core::int a = #C13, core::int b = #C14]) → self::Class
+    : super core::Object::•()
+    ;
+  constructor named({core::int a = #C13, core::int b = #C14}) → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a = #C13) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a = #C13]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a = #C13, [core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a = #C13}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b = #C14}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b = #C14, core::int a = #C13}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect1a
+  #C2 = constructor-tearoff self::Class::redirect2a
+  #C3 = constructor-tearoff self::Class::redirect3a
+  #C4 = constructor-tearoff self::Class::redirect4a
+  #C5 = constructor-tearoff self::Class::redirect5a
+  #C6 = constructor-tearoff self::Class::redirect6a
+  #C7 = constructor-tearoff self::Class::redirect1b
+  #C8 = constructor-tearoff self::Class::redirect2b
+  #C9 = constructor-tearoff self::Class::redirect3b
+  #C10 = constructor-tearoff self::Class::redirect4b
+  #C11 = constructor-tearoff self::Class::redirect5b
+  #C12 = constructor-tearoff self::Class::redirect6b
+  #C13 = 0
+  #C14 = 42
+}
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
new file mode 100644
index 0000000..cbca85f
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect1a, self::Class::redirect2a, self::Class::redirect3a, self::Class::redirect4a, self::Class::redirect5a, self::Class::redirect6a, self::Class::redirect1b, self::Class::redirect2b, self::Class::redirect3b, self::Class::redirect4b, self::Class::redirect5b, self::Class::redirect6b]/*isLegacy*/;
+  constructor positional([core::int a = 0, core::int b = 42]) → self::Class
+    ;
+  constructor named({core::int a = 0, core::int b = 42}) → self::Class
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a, [core::int b]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a, core::int b]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a, core::int b]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a, core::int b}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b, core::int a}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a, core::int b}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect1a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect2a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect3a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect4a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect5a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect6a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect1b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect2b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect3b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect4b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect5b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect6b)
+Extra constant evaluation: evaluated: 41, effectively constant: 12
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.transformed.expect
new file mode 100644
index 0000000..f08d181
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:12:44: Error: Can't have a default value here because any default values of 'Class.positional' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+//                                            ^
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:20:37: Error: Can't have a default value here because any default values of 'Class.named' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6b({int a = 1, int b}) = Class.named;
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C10, #C11, #C12]/*isLegacy*/;
+  constructor positional([core::int a = #C13, core::int b = #C14]) → self::Class
+    : super core::Object::•()
+    ;
+  constructor named({core::int a = #C13, core::int b = #C14}) → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a = #C13) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a = #C13]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a = #C13, [core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a = #C13}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b = #C14}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b = #C14, core::int a = #C13}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect1a
+  #C2 = constructor-tearoff self::Class::redirect2a
+  #C3 = constructor-tearoff self::Class::redirect3a
+  #C4 = constructor-tearoff self::Class::redirect4a
+  #C5 = constructor-tearoff self::Class::redirect5a
+  #C6 = constructor-tearoff self::Class::redirect6a
+  #C7 = constructor-tearoff self::Class::redirect1b
+  #C8 = constructor-tearoff self::Class::redirect2b
+  #C9 = constructor-tearoff self::Class::redirect3b
+  #C10 = constructor-tearoff self::Class::redirect4b
+  #C11 = constructor-tearoff self::Class::redirect5b
+  #C12 = constructor-tearoff self::Class::redirect6b
+  #C13 = 0
+  #C14 = 42
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
index 4a74b87..1dd09f3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
@@ -16,7 +16,7 @@
   constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
-  static factory redirect([core::int field]) → self::A
+  static factory redirect([core::int field = #C2]) → self::A
     return new self::A::•(field);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
index 4a74b87..1dd09f3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
@@ -16,7 +16,7 @@
   constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
-  static factory redirect([core::int field]) → self::A
+  static factory redirect([core::int field = #C2]) → self::A
     return new self::A::•(field);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
index 4a74b87..1dd09f3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
@@ -16,7 +16,7 @@
   constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
-  static factory redirect([core::int field]) → self::A
+  static factory redirect([core::int field = #C2]) → self::A
     return new self::A::•(field);
 }
 static method main() → dynamic {