Version 2.15.0-254.0.dev

Merge commit '25ef052cfcff4bf67d878b85df9852bcf04f8df5' into 'dev'
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 6e68327..ed6fa697 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -8,8 +8,7 @@
 import 'dart:convert';
 import 'dart:math' show max, min;
 
-import 'package:front_end/src/fasta/kernel/constructor_tearoff_lowering.dart'
-    show isTearOffLowering;
+import 'package:front_end/src/api_unstable/ddc.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
@@ -1319,7 +1318,7 @@
   /// otherwise define them as lazy properties.
   void _emitStaticFields(Class c, List<js_ast.Statement> body) {
     var fields = c.fields
-        .where((f) => f.isStatic && getRedirectingFactories(f) == null)
+        .where((f) => f.isStatic && !isRedirectingFactoryField(f))
         .toList();
     if (c.isEnum) {
       // We know enum fields can be safely emitted as const fields, as long
@@ -1853,7 +1852,9 @@
     Set<Member> redirectingFactories;
     for (var m in c.fields) {
       if (m.isStatic) {
-        redirectingFactories ??= getRedirectingFactories(m)?.toSet();
+        if (isRedirectingFactoryField(m)) {
+          redirectingFactories = getRedirectingFactories(m).toSet();
+        }
       } else if (_extensionTypes.isNativeClass(c)) {
         jsMethods.addAll(_emitNativeFieldAccessors(m));
       } else if (virtualFields.containsKey(m)) {
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 958e4af..44fe33a 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -4,7 +4,6 @@
 
 import 'dart:collection';
 import 'package:collection/collection.dart';
-import 'package:front_end/src/api_unstable/ddc.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 
@@ -246,18 +245,6 @@
   return false;
 }
 
-/// Returns the redirecting factory constructors for the enclosing class,
-/// if the field [f] is storing that information, otherwise returns `null`.
-Iterable<Member>? getRedirectingFactories(Field f) {
-  // TODO(jmesserly): this relies on implementation details in Kernel
-  if (isRedirectingFactoryField(f)) {
-    assert(f.isStatic);
-    var list = f.initializer as ListLiteral;
-    return list.expressions.map((e) => (e as StaticGet).target);
-  }
-  return null;
-}
-
 /// Gets the real supertype of [c] and the list of [mixins] in reverse
 /// application order (mixins will appear before ones they override).
 ///
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 23e1784..0d7c334 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -64,8 +64,15 @@
 
 export '../fasta/incremental_compiler.dart' show IncrementalCompiler;
 
+export '../fasta/kernel/constructor_tearoff_lowering.dart'
+    show isTearOffLowering;
+
 export '../fasta/kernel/redirecting_factory_body.dart'
-    show RedirectingFactoryBody, isRedirectingFactoryField, redirectingName;
+    show
+        getRedirectingFactories,
+        RedirectingFactoryBody,
+        isRedirectingFactoryField,
+        redirectingName;
 
 export '../fasta/type_inference/type_schema_environment.dart'
     show TypeSchemaEnvironment;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index edf5ede..b367503 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -29,7 +29,10 @@
 
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/redirecting_factory_body.dart'
-    show RedirectingFactoryBody, isRedirectingFactoryField;
+    show
+        RedirectingFactoryBody,
+        getRedirectingFactories,
+        isRedirectingFactoryField;
 
 import '../problems.dart' show internalProblem, unhandled, unimplemented;
 
@@ -190,10 +193,8 @@
     }
     for (Field field in cls.fields) {
       if (isRedirectingFactoryField(field)) {
-        ListLiteral initializer = field.initializer as ListLiteral;
-        for (Expression expression in initializer.expressions) {
-          StaticGet get = expression as StaticGet;
-          RedirectingFactoryBody.restoreFromDill(get.target as Procedure);
+        for (Procedure target in getRedirectingFactories(field)) {
+          RedirectingFactoryBody.restoreFromDill(target);
         }
       } else {
         classBuilder.addField(field);
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index af63914..4b2244d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -7092,11 +7092,6 @@
   }
 
   @override
-  StaticGet makeStaticGet(Member readTarget, Token token) {
-    return new StaticGet(readTarget)..fileOffset = offsetForToken(token);
-  }
-
-  @override
   Expression wrapInDeferredCheck(
       Expression expression, PrefixBuilder prefix, int charOffset) {
     VariableDeclaration check = new VariableDeclaration.forValue(
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 90961d6..bc2af8b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -35,7 +35,6 @@
 import '../fasta_codes.dart';
 
 import 'constant_int_folder.dart';
-import 'constructor_tearoff_lowering.dart';
 
 part 'constant_collection_builders.dart';
 
@@ -701,34 +700,6 @@
     if (expression is ConstantExpression) {
       if (result.typeArguments.every(isInstantiated)) {
         return evaluateAndTransformWithContext(node, result);
-      } else if (enableConstructorTearOff) {
-        Constant constant = expression.constant;
-        if (constant is TypedefTearOffConstant) {
-          Substitution substitution =
-              Substitution.fromPairs(constant.parameters, node.typeArguments);
-          return new Instantiation(
-              new ConstantExpression(constant.tearOffConstant,
-                  constant.tearOffConstant.getType(_staticTypeContext!))
-                ..fileOffset = expression.fileOffset,
-              constant.types.map(substitution.substituteType).toList());
-        } else {
-          LoweredTypedefTearOff? loweredTypedefTearOff =
-              LoweredTypedefTearOff.fromConstant(constant);
-          if (loweredTypedefTearOff != null) {
-            Constant tearOffConstant = constantEvaluator
-                .canonicalize(loweredTypedefTearOff.targetTearOffConstant);
-            Substitution substitution = Substitution.fromPairs(
-                loweredTypedefTearOff.typedefTearOff.function.typeParameters,
-                node.typeArguments);
-            return new Instantiation(
-                new ConstantExpression(tearOffConstant,
-                    tearOffConstant.getType(_staticTypeContext!))
-                  ..fileOffset = expression.fileOffset,
-                loweredTypedefTearOff.typeArguments
-                    .map(substitution.substituteType)
-                    .toList());
-          }
-        }
       }
     }
     return node;
@@ -3364,29 +3335,8 @@
         // ignore: unnecessary_null_comparison
         assert(types != null);
 
-        List<DartType> typeArguments = types;
-        if (constant is TypedefTearOffConstant) {
-          Substitution substitution =
-              Substitution.fromPairs(constant.parameters, typeArguments);
-          typeArguments =
-              constant.types.map(substitution.substituteType).toList();
-          constant = constant.tearOffConstant;
-        } else {
-          LoweredTypedefTearOff? loweredTypedefTearOff =
-              LoweredTypedefTearOff.fromConstant(constant);
-          if (loweredTypedefTearOff != null) {
-            constant =
-                canonicalize(loweredTypedefTearOff.targetTearOffConstant);
-            Substitution substitution = Substitution.fromPairs(
-                loweredTypedefTearOff.typedefTearOff.function.typeParameters,
-                node.typeArguments);
-            typeArguments = loweredTypedefTearOff.typeArguments
-                .map(substitution.substituteType)
-                .toList();
-          }
-        }
         return canonicalize(
-            new InstantiationConstant(constant, convertTypes(typeArguments)));
+            new InstantiationConstant(constant, convertTypes(types)));
       } else {
         // Probably unreachable.
         return createEvaluationErrorConstant(
diff --git a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
index e3dd8b1..244a71d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
@@ -428,19 +428,18 @@
 /// Reverse engineered typedef tear off information.
 class LoweredTypedefTearOff {
   Procedure typedefTearOff;
-  Constant targetTearOffConstant;
+  Expression targetTearOff;
   List<DartType> typeArguments;
 
   LoweredTypedefTearOff(
-      this.typedefTearOff, this.targetTearOffConstant, this.typeArguments);
+      this.typedefTearOff, this.targetTearOff, this.typeArguments);
 
-  /// Reverse engineers [constant] to a [LoweredTypedefTearOff] if [constant] is
-  /// the encoding of a lowered typedef tear off.
-  // TODO(johnniwinther): Check that this works with outlines.
-  static LoweredTypedefTearOff? fromConstant(Constant constant) {
-    if (constant is StaticTearOffConstant &&
-        isTypedefTearOffLowering(constant.target)) {
-      Procedure typedefTearOff = constant.target;
+  /// Reverse engineers [expression] to a [LoweredTypedefTearOff] if
+  /// [expression] is the encoding of a lowered typedef tear off.
+  static LoweredTypedefTearOff? fromExpression(Expression expression) {
+    if (expression is StaticTearOff &&
+        isTypedefTearOffLowering(expression.target)) {
+      Procedure typedefTearOff = expression.target;
       Statement? body = typedefTearOff.function.body;
       if (body is ReturnStatement) {
         Expression? constructorInvocation = body.expression;
@@ -463,15 +462,15 @@
               break;
             }
           }
-          Constant tearOffConstant;
+          Expression targetTearOff;
           if (target is Constructor ||
               target is Procedure && target.isFactory) {
-            tearOffConstant = new ConstructorTearOffConstant(target!);
+            targetTearOff = new ConstructorTearOff(target!);
           } else {
-            tearOffConstant = new StaticTearOffConstant(target as Procedure);
+            targetTearOff = new StaticTearOff(target as Procedure);
           }
           return new LoweredTypedefTearOff(
-              typedefTearOff, tearOffConstant, typeArguments!);
+              typedefTearOff, targetTearOff, typeArguments!);
         }
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index b5acdef..9347efa 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1438,11 +1438,16 @@
 
   Expression _createRead() {
     Expression read;
+    Member? readTarget = this.readTarget;
     if (readTarget == null) {
       read = _makeInvalidRead(UnresolvedKind.Getter);
     } else {
       _reportNonNullableInNullAwareWarningIfNeeded();
-      read = _helper.makeStaticGet(readTarget!, token);
+      if (readTarget is Procedure && readTarget.kind == ProcedureKind.Method) {
+        read = _helper.forest.createStaticTearOff(fileOffset, readTarget);
+      } else {
+        read = _helper.forest.createStaticGet(fileOffset, readTarget);
+      }
     }
     return read;
   }
@@ -3221,6 +3226,9 @@
               if (tearOff.isRedirectingFactory) {
                 tearOffExpression = _helper.forest
                     .createRedirectingFactoryTearOff(token.charOffset, tearOff);
+              } else if (tearOff.isFactory) {
+                tearOffExpression = _helper.forest
+                    .createConstructorTearOff(token.charOffset, tearOff);
               } else {
                 tearOffExpression = _helper.forest
                     .createStaticTearOff(token.charOffset, tearOff);
@@ -3264,8 +3272,13 @@
                     aliasBuilder.findConstructorOrFactory(
                         name.text, nameOffset, _uri, _helper.libraryBuilder);
                 if (tearOffLowering != null) {
-                  return _helper.forest
-                      .createStaticTearOff(token.charOffset, tearOffLowering);
+                  if (tearOffLowering.isFactory) {
+                    return _helper.forest.createConstructorTearOff(
+                        token.charOffset, tearOffLowering);
+                  } else {
+                    return _helper.forest
+                        .createStaticTearOff(token.charOffset, tearOffLowering);
+                  }
                 }
                 FreshTypeParameters freshTypeParameters =
                     getFreshTypeParameters(aliasBuilder.typedef.typeParameters);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 0bd29ce..3d52030 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -107,8 +107,6 @@
   LocatedMessage? checkArgumentsForFunction(FunctionNode function,
       Arguments arguments, int offset, List<TypeParameter> typeParameters);
 
-  StaticGet makeStaticGet(Member readTarget, Token token);
-
   Expression wrapInDeferredCheck(
       Expression expression, PrefixBuilder prefix, int charOffset);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 8e7b3b9..9ce125d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -833,24 +833,36 @@
     return new ParenthesizedExpression(expression)..fileOffset = fileOffset;
   }
 
-  ConstructorTearOff createConstructorTearOff(
-      int fileOffset, Constructor constructor) {
+  ConstructorTearOff createConstructorTearOff(int fileOffset, Member target) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
-    return new ConstructorTearOff(constructor)..fileOffset = fileOffset;
+    assert(target is Constructor || (target is Procedure && target.isFactory),
+        "Unexpected constructor tear off target: $target");
+    return new ConstructorTearOff(target)..fileOffset = fileOffset;
   }
 
   StaticTearOff createStaticTearOff(int fileOffset, Procedure procedure) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
-    assert(!procedure.isRedirectingFactory);
+    assert(procedure.kind == ProcedureKind.Method,
+        "Unexpected static tear off target: $procedure");
+    assert(!procedure.isRedirectingFactory,
+        "Unexpected static tear off target: $procedure");
     return new StaticTearOff(procedure)..fileOffset = fileOffset;
   }
 
+  StaticGet createStaticGet(int fileOffset, Member target) {
+    // ignore: unnecessary_null_comparison
+    assert(fileOffset != null);
+    assert(target is Field || (target is Procedure && target.isGetter));
+    return new StaticGet(target)..fileOffset = fileOffset;
+  }
+
   RedirectingFactoryTearOff createRedirectingFactoryTearOff(
       int fileOffset, Procedure procedure) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
+    assert(procedure.isRedirectingFactory);
     return new RedirectingFactoryTearOff(procedure)..fileOffset = fileOffset;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 4e18e23..57f6519 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -6851,7 +6851,7 @@
         inferrer.typeSchemaEnvironment
             .futureType(const DynamicType(), inferrer.library.nonNullable),
         inferrer.library.nonNullable);
-    Expression replacement = new StaticGet(node.target)
+    Expression replacement = new StaticTearOff(node.target)
       ..fileOffset = node.fileOffset;
     return new ExpressionInferenceResult(inferredType, replacement);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 3697827..c363409 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -23,6 +23,29 @@
       member.name.text == redirectingName;
 }
 
+/// Returns the redirecting factory constructors for the enclosing class from
+/// [field].
+///
+/// `isRedirectingFactoryField(field)` is assumed to be true.
+Iterable<Procedure> getRedirectingFactories(Field field) {
+  assert(isRedirectingFactoryField(field));
+  List<Procedure> redirectingFactories = [];
+  ListLiteral initializer = field.initializer as ListLiteral;
+  for (Expression expression in initializer.expressions) {
+    Procedure target;
+    if (expression is ConstantExpression) {
+      ConstructorTearOffConstant constant =
+          expression.constant as ConstructorTearOffConstant;
+      target = constant.target as Procedure;
+    } else {
+      ConstructorTearOff get = expression as ConstructorTearOff;
+      target = get.target as Procedure;
+    }
+    redirectingFactories.add(target);
+  }
+  return redirectingFactories;
+}
+
 /// Name used for a synthesized let variable used to encode redirecting factory
 /// information in a factory method body.
 const String letName = "#redirecting_factory";
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 91fa5d8..a7d6ce8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -908,8 +908,8 @@
     }
     Field field = constructorsField.field;
     ListLiteral literal = field.initializer as ListLiteral;
-    literal.expressions
-        .add(new StaticGet(constructorBuilder.member)..parent = literal);
+    literal.expressions.add(
+        new ConstructorTearOff(constructorBuilder.member)..parent = literal);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 3fcba19..7e9d30a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -36,6 +36,7 @@
 import '../fasta_codes.dart';
 
 import '../kernel/class_hierarchy_builder.dart' show ClassMember;
+import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/inference_visitor.dart';
 import '../kernel/internal_ast.dart';
@@ -4065,14 +4066,33 @@
       DartType tearOffType,
       Expression expression) {
     if (implicitInstantiation != null) {
+      List<DartType> typeArguments = implicitInstantiation.typeArguments;
       if (!isTopLevel) {
         checkBoundsInInstantiation(implicitInstantiation.functionType,
-            implicitInstantiation.typeArguments, expression.fileOffset,
+            typeArguments, expression.fileOffset,
             inferred: true);
       }
-      expression =
-          new Instantiation(expression, implicitInstantiation.typeArguments)
-            ..fileOffset = expression.fileOffset;
+      if (expression is TypedefTearOff) {
+        Substitution substitution =
+            Substitution.fromPairs(expression.typeParameters, typeArguments);
+        typeArguments =
+            expression.typeArguments.map(substitution.substituteType).toList();
+        expression = expression.expression;
+      } else {
+        LoweredTypedefTearOff? loweredTypedefTearOff =
+            LoweredTypedefTearOff.fromExpression(expression);
+        if (loweredTypedefTearOff != null) {
+          Substitution substitution = Substitution.fromPairs(
+              loweredTypedefTearOff.typedefTearOff.function.typeParameters,
+              typeArguments);
+          typeArguments = loweredTypedefTearOff.typeArguments
+              .map(substitution.substituteType)
+              .toList();
+          expression = loweredTypedefTearOff.targetTearOff;
+        }
+      }
+      expression = new Instantiation(expression, typeArguments)
+        ..fileOffset = expression.fileOffset;
       tearOffType = implicitInstantiation.instantiatedType;
     }
     return new ExpressionInferenceResult(tearOffType, expression);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect
index 107b186..ace8876 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect
@@ -5,7 +5,7 @@
 typedef B<T extends core::Object? = dynamic> = self::A<T%>;
 typedef C<unrelated T extends core::Object? = dynamic> = self::A<core::int>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -14,54 +14,55 @@
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
     return new self::A::•<self::A::redirect::T%>();
 }
-static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-static const field () → self::A<core::int> b = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-static const field () → self::A<core::int> d = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-static const field () → self::A<core::int> f = #C6;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-static const field () → self::A<core::int> h = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-static const field () → self::A<core::int> j = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-static const field () → self::A<core::int> l = #C6;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-static const field () → self::A<core::int> n = #C2;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-static const field () → self::A<core::int> p = #C4;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-static const field () → self::A<core::int> r = #C6;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+static const field () → self::A<core::int> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+static const field () → self::A<core::int> d = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+static const field () → self::A<core::int> f = #C7;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+static const field () → self::A<core::int> h = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+static const field () → self::A<core::int> j = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+static const field () → self::A<core::int> l = #C7;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+static const field () → self::A<core::int> n = #C3;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+static const field () → self::A<core::int> p = #C5;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+static const field () → self::A<core::int> r = #C7;
 static method test() → dynamic {
-  <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-  () → self::A<core::int> b = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-  () → self::A<core::int> d = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-  () → self::A<core::int> f = #C6;
-  <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-  () → self::A<core::int> h = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-  () → self::A<core::int> j = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-  () → self::A<core::int> l = #C6;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-  () → self::A<core::int> n = #C2;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-  () → self::A<core::int> p = #C4;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-  () → self::A<core::int> r = #C6;
+  <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+  () → self::A<core::int> b = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+  () → self::A<core::int> d = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+  () → self::A<core::int> f = #C7;
+  <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+  () → self::A<core::int> h = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+  () → self::A<core::int> j = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+  () → self::A<core::int> l = #C7;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+  () → self::A<core::int> n = #C3;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+  () → self::A<core::int> p = #C5;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+  () → self::A<core::int> r = #C7;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int>
-  #C3 = static-tearoff self::A::fact
-  #C4 = instantiation self::A::fact <core::int>
-  #C5 = redirecting-factory-tearoff self::A::redirect
-  #C6 = instantiation self::A::redirect <core::int>
-  #C7 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C1<core::int>)
-  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C3<core::int>)
-  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C5<core::int>)
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = constructor-tearoff self::A::•
+  #C3 = instantiation #C2 <core::int>
+  #C4 = constructor-tearoff self::A::fact
+  #C5 = instantiation #C4 <core::int>
+  #C6 = redirecting-factory-tearoff self::A::redirect
+  #C7 = instantiation #C6 <core::int>
+  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C2<core::int>)
+  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C4<core::int>)
+  #C10 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C6<core::int>)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect
index 107b186..ace8876 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 typedef B<T extends core::Object? = dynamic> = self::A<T%>;
 typedef C<unrelated T extends core::Object? = dynamic> = self::A<core::int>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -14,54 +14,55 @@
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
     return new self::A::•<self::A::redirect::T%>();
 }
-static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-static const field () → self::A<core::int> b = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-static const field () → self::A<core::int> d = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-static const field () → self::A<core::int> f = #C6;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-static const field () → self::A<core::int> h = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-static const field () → self::A<core::int> j = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-static const field () → self::A<core::int> l = #C6;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-static const field () → self::A<core::int> n = #C2;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-static const field () → self::A<core::int> p = #C4;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-static const field () → self::A<core::int> r = #C6;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+static const field () → self::A<core::int> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+static const field () → self::A<core::int> d = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+static const field () → self::A<core::int> f = #C7;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+static const field () → self::A<core::int> h = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+static const field () → self::A<core::int> j = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+static const field () → self::A<core::int> l = #C7;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+static const field () → self::A<core::int> n = #C3;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+static const field () → self::A<core::int> p = #C5;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+static const field () → self::A<core::int> r = #C7;
 static method test() → dynamic {
-  <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-  () → self::A<core::int> b = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-  () → self::A<core::int> d = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-  () → self::A<core::int> f = #C6;
-  <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-  () → self::A<core::int> h = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-  () → self::A<core::int> j = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-  () → self::A<core::int> l = #C6;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-  () → self::A<core::int> n = #C2;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-  () → self::A<core::int> p = #C4;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-  () → self::A<core::int> r = #C6;
+  <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+  () → self::A<core::int> b = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+  () → self::A<core::int> d = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+  () → self::A<core::int> f = #C7;
+  <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+  () → self::A<core::int> h = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+  () → self::A<core::int> j = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+  () → self::A<core::int> l = #C7;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+  () → self::A<core::int> n = #C3;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+  () → self::A<core::int> p = #C5;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+  () → self::A<core::int> r = #C7;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int>
-  #C3 = static-tearoff self::A::fact
-  #C4 = instantiation self::A::fact <core::int>
-  #C5 = redirecting-factory-tearoff self::A::redirect
-  #C6 = instantiation self::A::redirect <core::int>
-  #C7 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C1<core::int>)
-  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C3<core::int>)
-  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C5<core::int>)
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = constructor-tearoff self::A::•
+  #C3 = instantiation #C2 <core::int>
+  #C4 = constructor-tearoff self::A::fact
+  #C5 = instantiation #C4 <core::int>
+  #C6 = redirecting-factory-tearoff self::A::redirect
+  #C7 = instantiation #C6 <core::int>
+  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C2<core::int>)
+  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C4<core::int>)
+  #C10 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C6<core::int>)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect
index fad0d55..fc95e6e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect
@@ -5,7 +5,7 @@
 typedef B<T extends core::Object? = dynamic> = self::A<T%>;
 typedef C<unrelated T extends core::Object? = dynamic> = self::A<core::int>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -14,54 +14,55 @@
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
     return new self::A::•<self::A::redirect::T%>();
 }
-static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-static const field () → self::A<core::int> b = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-static const field () → self::A<core::int> d = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-static const field () → self::A<core::int> f = #C6;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-static const field () → self::A<core::int> h = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-static const field () → self::A<core::int> j = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-static const field () → self::A<core::int> l = #C6;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-static const field () → self::A<core::int> n = #C2;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-static const field () → self::A<core::int> p = #C4;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-static const field () → self::A<core::int> r = #C6;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+static const field () → self::A<core::int> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+static const field () → self::A<core::int> d = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+static const field () → self::A<core::int> f = #C7;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+static const field () → self::A<core::int> h = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+static const field () → self::A<core::int> j = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+static const field () → self::A<core::int> l = #C7;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+static const field () → self::A<core::int> n = #C3;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+static const field () → self::A<core::int> p = #C5;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+static const field () → self::A<core::int> r = #C7;
 static method test() → dynamic {
-  <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-  () → self::A<core::int> b = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-  () → self::A<core::int> d = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-  () → self::A<core::int> f = #C6;
-  <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-  () → self::A<core::int> h = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-  () → self::A<core::int> j = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-  () → self::A<core::int> l = #C6;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-  () → self::A<core::int> n = #C2;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-  () → self::A<core::int> p = #C4;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-  () → self::A<core::int> r = #C6;
+  <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+  () → self::A<core::int> b = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+  () → self::A<core::int> d = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+  () → self::A<core::int> f = #C7;
+  <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+  () → self::A<core::int> h = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+  () → self::A<core::int> j = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+  () → self::A<core::int> l = #C7;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+  () → self::A<core::int> n = #C3;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+  () → self::A<core::int> p = #C5;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+  () → self::A<core::int> r = #C7;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int*>
-  #C3 = static-tearoff self::A::fact
-  #C4 = instantiation self::A::fact <core::int*>
-  #C5 = redirecting-factory-tearoff self::A::redirect
-  #C6 = instantiation self::A::redirect <core::int*>
-  #C7 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C1<core::int>)
-  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C3<core::int>)
-  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C5<core::int>)
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = constructor-tearoff self::A::•
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = constructor-tearoff self::A::fact
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = redirecting-factory-tearoff self::A::redirect
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C2<core::int>)
+  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C4<core::int>)
+  #C10 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C6<core::int>)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect
index 2e30650..a68155b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect
@@ -38,15 +38,16 @@
 
 
 Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_tear_off.dart:5:7 -> ConstructorTearOffConstant(A.redirect)
 Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_tear_off.dart:14:11 -> ConstructorTearOffConstant(A.)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:15:11 -> InstantiationConstant(A.<int*>)
-Evaluated: StaticTearOff @ org-dartlang-testcase:///const_tear_off.dart:16:11 -> StaticTearOffConstant(A.fact)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_tear_off.dart:16:11 -> ConstructorTearOffConstant(A.fact)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:17:11 -> InstantiationConstant(A.fact<int*>)
 Evaluated: RedirectingFactoryTearOff @ org-dartlang-testcase:///const_tear_off.dart:18:11 -> RedirectingFactoryTearOffConstant(A.redirect)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:19:11 -> InstantiationConstant(A.redirect<int*>)
 Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_tear_off.dart:20:11 -> ConstructorTearOffConstant(A.)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:21:11 -> InstantiationConstant(A.<int*>)
-Evaluated: StaticTearOff @ org-dartlang-testcase:///const_tear_off.dart:22:11 -> StaticTearOffConstant(A.fact)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_tear_off.dart:22:11 -> ConstructorTearOffConstant(A.fact)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:23:11 -> InstantiationConstant(A.fact<int*>)
 Evaluated: RedirectingFactoryTearOff @ org-dartlang-testcase:///const_tear_off.dart:24:11 -> RedirectingFactoryTearOffConstant(A.redirect)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:25:11 -> InstantiationConstant(A.redirect<int*>)
@@ -56,4 +57,4 @@
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:29:11 -> InstantiationConstant(A.fact<int*>)
 Evaluated: TypedefTearOff @ org-dartlang-testcase:///const_tear_off.dart:30:11 -> TypedefTearOffConstant(<T>A.redirect<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:31:11 -> InstantiationConstant(A.redirect<int*>)
-Extra constant evaluation: evaluated: 21, effectively constant: 18
+Extra constant evaluation: evaluated: 21, effectively constant: 19
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect
index fad0d55..fc95e6e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 typedef B<T extends core::Object? = dynamic> = self::A<T%>;
 typedef C<unrelated T extends core::Object? = dynamic> = self::A<core::int>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -14,54 +14,55 @@
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
     return new self::A::•<self::A::redirect::T%>();
 }
-static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-static const field () → self::A<core::int> b = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-static const field () → self::A<core::int> d = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-static const field () → self::A<core::int> f = #C6;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-static const field () → self::A<core::int> h = #C2;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-static const field () → self::A<core::int> j = #C4;
-static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-static const field () → self::A<core::int> l = #C6;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-static const field () → self::A<core::int> n = #C2;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-static const field () → self::A<core::int> p = #C4;
-static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-static const field () → self::A<core::int> r = #C6;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+static const field () → self::A<core::int> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+static const field () → self::A<core::int> d = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+static const field () → self::A<core::int> f = #C7;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+static const field () → self::A<core::int> h = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+static const field () → self::A<core::int> j = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+static const field () → self::A<core::int> l = #C7;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+static const field () → self::A<core::int> n = #C3;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+static const field () → self::A<core::int> p = #C5;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+static const field () → self::A<core::int> r = #C7;
 static method test() → dynamic {
-  <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
-  () → self::A<core::int> b = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> c = #C3;
-  () → self::A<core::int> d = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> e = #C5;
-  () → self::A<core::int> f = #C6;
-  <T extends core::Object? = dynamic>() → self::A<T%> g = #C1;
-  () → self::A<core::int> h = #C2;
-  <T extends core::Object? = dynamic>() → self::A<T%> i = #C3;
-  () → self::A<core::int> j = #C4;
-  <T extends core::Object? = dynamic>() → self::A<T%> k = #C5;
-  () → self::A<core::int> l = #C6;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C7;
-  () → self::A<core::int> n = #C2;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C8;
-  () → self::A<core::int> p = #C4;
-  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C9;
-  () → self::A<core::int> r = #C6;
+  <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+  () → self::A<core::int> b = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+  () → self::A<core::int> d = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+  () → self::A<core::int> f = #C7;
+  <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+  () → self::A<core::int> h = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+  () → self::A<core::int> j = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+  () → self::A<core::int> l = #C7;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+  () → self::A<core::int> n = #C3;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+  () → self::A<core::int> p = #C5;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+  () → self::A<core::int> r = #C7;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int*>
-  #C3 = static-tearoff self::A::fact
-  #C4 = instantiation self::A::fact <core::int*>
-  #C5 = redirecting-factory-tearoff self::A::redirect
-  #C6 = instantiation self::A::redirect <core::int*>
-  #C7 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C1<core::int>)
-  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C3<core::int>)
-  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C5<core::int>)
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = constructor-tearoff self::A::•
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = constructor-tearoff self::A::fact
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = redirecting-factory-tearoff self::A::redirect
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C2<core::int>)
+  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C4<core::int>)
+  #C10 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C6<core::int>)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.expect
index eb48965..a949112 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.expect
@@ -317,5 +317,5 @@
   #C2 = TypeLiteralConstant(self::Class<dynamic>)
   #C3 = TypeLiteralConstant(core::int)
   #C4 = constructor-tearoff self::Class::named
-  #C5 = instantiation self::Class::named <core::int>
+  #C5 = instantiation #C4 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.transformed.expect
index de6a5ab..1f927ba 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.strong.transformed.expect
@@ -317,5 +317,5 @@
   #C2 = TypeLiteralConstant(self::Class<dynamic>)
   #C3 = TypeLiteralConstant(core::int)
   #C4 = constructor-tearoff self::Class::named
-  #C5 = instantiation self::Class::named <core::int>
+  #C5 = instantiation #C4 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.expect
index 117593c..25718f4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.expect
@@ -317,5 +317,5 @@
   #C2 = TypeLiteralConstant(self::Class<dynamic>*)
   #C3 = TypeLiteralConstant(core::int*)
   #C4 = constructor-tearoff self::Class::named
-  #C5 = instantiation self::Class::named <core::int*>
+  #C5 = instantiation #C4 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.transformed.expect
index 0f1d41c..682fc04 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.transformed.expect
@@ -317,5 +317,5 @@
   #C2 = TypeLiteralConstant(self::Class<dynamic>*)
   #C3 = TypeLiteralConstant(core::int*)
   #C4 = constructor-tearoff self::Class::named
-  #C5 = instantiation self::Class::named <core::int*>
+  #C5 = instantiation #C4 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.expect
index 03be5de..ab94d94 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.expect
@@ -93,11 +93,11 @@
 
 constants  {
   #C1 = static-tearoff self::C::stat
-  #C2 = instantiation self::C::stat <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = static-tearoff self::M::mstat
-  #C4 = instantiation self::M::mstat <core::int>
+  #C4 = instantiation #C3 <core::int>
   #C5 = static-tearoff self::Ext|estat
-  #C6 = instantiation self::Ext|estat <core::int>
+  #C6 = instantiation #C5 <core::int>
   #C7 = TypeLiteralConstant(core::List<core::int>)
   #C8 = TypeLiteralConstant(core::List<core::List<core::int>>)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect
index 5b832f3..55e49d3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect
@@ -101,11 +101,11 @@
 
 constants  {
   #C1 = static-tearoff self::C::stat
-  #C2 = instantiation self::C::stat <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = static-tearoff self::M::mstat
-  #C4 = instantiation self::M::mstat <core::int>
+  #C4 = instantiation #C3 <core::int>
   #C5 = static-tearoff self::Ext|estat
-  #C6 = instantiation self::Ext|estat <core::int>
+  #C6 = instantiation #C5 <core::int>
   #C7 = TypeLiteralConstant(core::List<core::int>)
   #C8 = TypeLiteralConstant(core::List<core::List<core::int>>)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.expect
index f9f2d98..63427ae 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.expect
@@ -93,11 +93,11 @@
 
 constants  {
   #C1 = static-tearoff self::C::stat
-  #C2 = instantiation self::C::stat <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::M::mstat
-  #C4 = instantiation self::M::mstat <core::int*>
+  #C4 = instantiation #C3 <core::int*>
   #C5 = static-tearoff self::Ext|estat
-  #C6 = instantiation self::Ext|estat <core::int*>
+  #C6 = instantiation #C5 <core::int*>
   #C7 = TypeLiteralConstant(core::List<core::int*>*)
   #C8 = TypeLiteralConstant(core::List<core::List<core::int*>*>*)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.transformed.expect
index c8aedc8..7ee3322 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.transformed.expect
@@ -101,11 +101,11 @@
 
 constants  {
   #C1 = static-tearoff self::C::stat
-  #C2 = instantiation self::C::stat <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::M::mstat
-  #C4 = instantiation self::M::mstat <core::int*>
+  #C4 = instantiation #C3 <core::int*>
   #C5 = static-tearoff self::Ext|estat
-  #C6 = instantiation self::Ext|estat <core::int*>
+  #C6 = instantiation #C5 <core::int*>
   #C7 = TypeLiteralConstant(core::List<core::int*>*)
   #C8 = TypeLiteralConstant(core::List<core::List<core::int*>*>*)
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.expect
index 630fe40..1622d94 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.expect
@@ -106,7 +106,7 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = static-tearoff self::boundedMethod
-  #C4 = instantiation self::boundedMethod <core::String>
+  #C4 = instantiation #C3 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.transformed.expect
index 630fe40..1622d94 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.strong.transformed.expect
@@ -106,7 +106,7 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = static-tearoff self::boundedMethod
-  #C4 = instantiation self::boundedMethod <core::String>
+  #C4 = instantiation #C3 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.expect
index 2e9d2db..8ed55ac 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.expect
@@ -106,7 +106,7 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::boundedMethod
-  #C4 = instantiation self::boundedMethod <core::String*>
+  #C4 = instantiation #C3 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.transformed.expect
index 2e9d2db..8ed55ac 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.transformed.expect
@@ -106,7 +106,7 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::boundedMethod
-  #C4 = instantiation self::boundedMethod <core::String*>
+  #C4 = instantiation #C3 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
index 8954e19..13d3f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
@@ -91,7 +91,7 @@
     ;
 }
 class E4 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::E4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::E4
     : super core::Object::•()
     ;
@@ -99,3 +99,7 @@
     return new self::E4::_();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::E4::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
index 8954e19..13d3f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
@@ -91,7 +91,7 @@
     ;
 }
 class E4 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::E4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::E4
     : super core::Object::•()
     ;
@@ -99,3 +99,7 @@
     return new self::E4::_();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::E4::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
index 8954e19..13d3f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
@@ -91,7 +91,7 @@
     ;
 }
 class E4 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::E4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::E4
     : super core::Object::•()
     ;
@@ -99,3 +99,7 @@
     return new self::E4::_();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::E4::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
index d7f841c..969f9d2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
@@ -90,3 +90,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///explicit_new_as_unnamed.dart:41:7 -> ConstructorTearOffConstant(E4.)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
index 8954e19..13d3f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
@@ -91,7 +91,7 @@
     ;
 }
 class E4 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::E4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::E4
     : super core::Object::•()
     ;
@@ -99,3 +99,7 @@
     return new self::E4::_();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::E4::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
index cd74ac1..eb866ee 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
@@ -132,9 +132,9 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int>
-  #C5 = instantiation self::A::foo1 <core::int>
-  #C6 = instantiation self::A::foo2 <core::int>
-  #C7 = static-tearoff self::A::bar1
-  #C8 = instantiation self::A::bar1 <core::int>
+  #C4 = instantiation #C3 <core::int>
+  #C5 = instantiation #C1 <core::int>
+  #C6 = instantiation #C2 <core::int>
+  #C7 = constructor-tearoff self::A::bar1
+  #C8 = instantiation #C7 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
index cd74ac1..eb866ee 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
@@ -132,9 +132,9 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int>
-  #C5 = instantiation self::A::foo1 <core::int>
-  #C6 = instantiation self::A::foo2 <core::int>
-  #C7 = static-tearoff self::A::bar1
-  #C8 = instantiation self::A::bar1 <core::int>
+  #C4 = instantiation #C3 <core::int>
+  #C5 = instantiation #C1 <core::int>
+  #C6 = instantiation #C2 <core::int>
+  #C7 = constructor-tearoff self::A::bar1
+  #C8 = instantiation #C7 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
index 40ac9f8..d91a515 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
@@ -132,9 +132,9 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int*>
-  #C5 = instantiation self::A::foo1 <core::int*>
-  #C6 = instantiation self::A::foo2 <core::int*>
-  #C7 = static-tearoff self::A::bar1
-  #C8 = instantiation self::A::bar1 <core::int*>
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = instantiation #C1 <core::int*>
+  #C6 = instantiation #C2 <core::int*>
+  #C7 = constructor-tearoff self::A::bar1
+  #C8 = instantiation #C7 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
index 40ac9f8..d91a515 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
@@ -132,9 +132,9 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int*>
-  #C5 = instantiation self::A::foo1 <core::int*>
-  #C6 = instantiation self::A::foo2 <core::int*>
-  #C7 = static-tearoff self::A::bar1
-  #C8 = instantiation self::A::bar1 <core::int*>
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = instantiation #C1 <core::int*>
+  #C6 = instantiation #C2 <core::int*>
+  #C7 = constructor-tearoff self::A::bar1
+  #C8 = instantiation #C7 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
index 8aa8628..3b2be98 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
@@ -94,9 +94,9 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int>
-  #C5 = static-tearoff self::A::bar
-  #C6 = instantiation self::A::bar <core::int>
+  #C4 = instantiation #C3 <core::int>
+  #C5 = constructor-tearoff self::A::bar
+  #C6 = instantiation #C5 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
index 8aa8628..3b2be98 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
@@ -94,9 +94,9 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int>
-  #C5 = static-tearoff self::A::bar
-  #C6 = instantiation self::A::bar <core::int>
+  #C4 = instantiation #C3 <core::int>
+  #C5 = constructor-tearoff self::A::bar
+  #C6 = instantiation #C5 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
index c49c929..a5cdb82 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
@@ -94,9 +94,9 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int*>
-  #C5 = static-tearoff self::A::bar
-  #C6 = instantiation self::A::bar <core::int*>
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = constructor-tearoff self::A::bar
+  #C6 = instantiation #C5 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
index c49c929..a5cdb82 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
@@ -94,9 +94,9 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = constructor-tearoff self::A::•
-  #C4 = instantiation self::A::• <core::int*>
-  #C5 = static-tearoff self::A::bar
-  #C6 = instantiation self::A::bar <core::int*>
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = constructor-tearoff self::A::bar
+  #C6 = instantiation #C5 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.expect
index 5edad1d..9d3de3b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.expect
@@ -47,6 +47,6 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int>
-  #C3 = instantiation self::id <core::String>
+  #C2 = instantiation #C1 <core::int>
+  #C3 = instantiation #C1 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.transformed.expect
index f2e9fea..6058516 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.strong.transformed.expect
@@ -47,8 +47,8 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int>
-  #C3 = instantiation self::id <core::String>
+  #C2 = instantiation #C1 <core::int>
+  #C3 = instantiation #C1 <core::String>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.expect
index 7061d34..5abed3e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.expect
@@ -47,6 +47,6 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
-  #C3 = instantiation self::id <core::String*>
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
index 8923c73..f62d68a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
@@ -47,8 +47,8 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
-  #C3 = instantiation self::id <core::String*>
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::String*>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.expect
index ce055a4..8fa4479 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.expect
@@ -52,5 +52,5 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int>
+  #C2 = instantiation #C1 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.transformed.expect
index 0f0953f..ca0ea1f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.strong.transformed.expect
@@ -52,7 +52,7 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int>
+  #C2 = instantiation #C1 <core::int>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.expect
index 1121885..5827e2a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.expect
@@ -52,5 +52,5 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.outline.expect
index ab09476..8f1f43b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.outline.expect
@@ -12,13 +12,13 @@
 static final field core::bool inSoundMode;
 static const field () → self::A<core::int> f1a = self::A::•<core::int>;
 static const field () → self::A<core::int> f1b = self::A::•<core::int>;
-static const field () → self::A<core::int> f1c = (<X extends core::num>.(self::A::•<X>))<core::int>;
+static const field () → self::A<core::int> f1c = self::A::•<core::int>;
 static const field () → self::A<core::int> g1a = self::A::•<core::int>;
 static const field () → self::A<core::int> g1b = self::A::•<core::int>;
-static const field () → self::A<core::int> g1c = (<unrelated Y extends core::Object? = dynamic>.(self::A::•<core::int>))<dynamic>;
+static const field () → self::A<core::int> g1c = self::A::•<core::int>;
 static const field () → self::A<core::int> h1a = self::A::•<core::int>;
 static const field () → self::A<core::int> h1b = self::A::•<core::int>;
-static const field () → self::A<core::int> h1c = (<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>.(self::A::•<X%>))<core::int, dynamic>;
+static const field () → self::A<core::int> h1c = self::A::•<core::int>;
 static method main() → dynamic
   ;
 static method test<T extends core::num>() → dynamic
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.transformed.expect
index 74079d8..e64d4e2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.transformed.expect
@@ -52,7 +52,7 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
index 547e506..0d61208 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
@@ -59,15 +59,15 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::num>
-  #C3 = instantiation self::A::foo <core::int>
+  #C2 = instantiation #C1 <core::num>
+  #C3 = instantiation #C1 <core::int>
   #C4 = constructor-tearoff self::A::•
-  #C5 = instantiation self::A::• <core::num>
-  #C6 = instantiation self::A::• <core::int>
-  #C7 = instantiation self::A::foo <core::String>
-  #C8 = instantiation self::A::• <core::String>
-  #C9 = static-tearoff self::A::bar
-  #C10 = instantiation self::A::bar <core::num>
-  #C11 = instantiation self::A::bar <core::int>
-  #C12 = instantiation self::A::bar <core::String>
+  #C5 = instantiation #C4 <core::num>
+  #C6 = instantiation #C4 <core::int>
+  #C7 = instantiation #C1 <core::String>
+  #C8 = instantiation #C4 <core::String>
+  #C9 = constructor-tearoff self::A::bar
+  #C10 = instantiation #C9 <core::num>
+  #C11 = instantiation #C9 <core::int>
+  #C12 = instantiation #C9 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
index 547e506..0d61208 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
@@ -59,15 +59,15 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::num>
-  #C3 = instantiation self::A::foo <core::int>
+  #C2 = instantiation #C1 <core::num>
+  #C3 = instantiation #C1 <core::int>
   #C4 = constructor-tearoff self::A::•
-  #C5 = instantiation self::A::• <core::num>
-  #C6 = instantiation self::A::• <core::int>
-  #C7 = instantiation self::A::foo <core::String>
-  #C8 = instantiation self::A::• <core::String>
-  #C9 = static-tearoff self::A::bar
-  #C10 = instantiation self::A::bar <core::num>
-  #C11 = instantiation self::A::bar <core::int>
-  #C12 = instantiation self::A::bar <core::String>
+  #C5 = instantiation #C4 <core::num>
+  #C6 = instantiation #C4 <core::int>
+  #C7 = instantiation #C1 <core::String>
+  #C8 = instantiation #C4 <core::String>
+  #C9 = constructor-tearoff self::A::bar
+  #C10 = instantiation #C9 <core::num>
+  #C11 = instantiation #C9 <core::int>
+  #C12 = instantiation #C9 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
index 8f0ed57..ba34a7a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
@@ -59,15 +59,15 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::num*>
-  #C3 = instantiation self::A::foo <core::int*>
+  #C2 = instantiation #C1 <core::num*>
+  #C3 = instantiation #C1 <core::int*>
   #C4 = constructor-tearoff self::A::•
-  #C5 = instantiation self::A::• <core::num*>
-  #C6 = instantiation self::A::• <core::int*>
-  #C7 = instantiation self::A::foo <core::String*>
-  #C8 = instantiation self::A::• <core::String*>
-  #C9 = static-tearoff self::A::bar
-  #C10 = instantiation self::A::bar <core::num*>
-  #C11 = instantiation self::A::bar <core::int*>
-  #C12 = instantiation self::A::bar <core::String*>
+  #C5 = instantiation #C4 <core::num*>
+  #C6 = instantiation #C4 <core::int*>
+  #C7 = instantiation #C1 <core::String*>
+  #C8 = instantiation #C4 <core::String*>
+  #C9 = constructor-tearoff self::A::bar
+  #C10 = instantiation #C9 <core::num*>
+  #C11 = instantiation #C9 <core::int*>
+  #C12 = instantiation #C9 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
index 8f0ed57..ba34a7a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
@@ -59,15 +59,15 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::num*>
-  #C3 = instantiation self::A::foo <core::int*>
+  #C2 = instantiation #C1 <core::num*>
+  #C3 = instantiation #C1 <core::int*>
   #C4 = constructor-tearoff self::A::•
-  #C5 = instantiation self::A::• <core::num*>
-  #C6 = instantiation self::A::• <core::int*>
-  #C7 = instantiation self::A::foo <core::String*>
-  #C8 = instantiation self::A::• <core::String*>
-  #C9 = static-tearoff self::A::bar
-  #C10 = instantiation self::A::bar <core::num*>
-  #C11 = instantiation self::A::bar <core::int*>
-  #C12 = instantiation self::A::bar <core::String*>
+  #C5 = instantiation #C4 <core::num*>
+  #C6 = instantiation #C4 <core::int*>
+  #C7 = instantiation #C1 <core::String*>
+  #C8 = instantiation #C4 <core::String*>
+  #C9 = constructor-tearoff self::A::bar
+  #C10 = instantiation #C9 <core::num*>
+  #C11 = instantiation #C9 <core::int*>
+  #C12 = instantiation #C9 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.expect
index 980e111..99500cc 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.expect
@@ -46,11 +46,11 @@
 constants  {
   #C1 = <core::Symbol, dynamic>{)
   #C2 = constructor-tearoff self::A::named
-  #C3 = instantiation self::A::named <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = static-tearoff self::A::n
-  #C5 = instantiation self::A::n <core::int>
-  #C6 = instantiation self::A::n <core::String>
+  #C5 = instantiation #C4 <core::int>
+  #C6 = instantiation #C4 <core::String>
   #C7 = static-tearoff self::m
-  #C8 = instantiation self::m <core::int>
-  #C9 = instantiation self::m <core::String>
+  #C8 = instantiation #C7 <core::int>
+  #C9 = instantiation #C7 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.transformed.expect
index ae6ee29..4e41cb6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.strong.transformed.expect
@@ -46,11 +46,11 @@
 constants  {
   #C1 = <core::Symbol, dynamic>{)
   #C2 = constructor-tearoff self::A::named
-  #C3 = instantiation self::A::named <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = static-tearoff self::A::n
-  #C5 = instantiation self::A::n <core::int>
-  #C6 = instantiation self::A::n <core::String>
+  #C5 = instantiation #C4 <core::int>
+  #C6 = instantiation #C4 <core::String>
   #C7 = static-tearoff self::m
-  #C8 = instantiation self::m <core::int>
-  #C9 = instantiation self::m <core::String>
+  #C8 = instantiation #C7 <core::int>
+  #C9 = instantiation #C7 <core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.expect
index 4ad97c0..ce83852 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.expect
@@ -46,11 +46,11 @@
 constants  {
   #C1 = <core::Symbol*, dynamic>{)
   #C2 = constructor-tearoff self::A::named
-  #C3 = instantiation self::A::named <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = static-tearoff self::A::n
-  #C5 = instantiation self::A::n <core::int*>
-  #C6 = instantiation self::A::n <core::String*>
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = instantiation #C4 <core::String*>
   #C7 = static-tearoff self::m
-  #C8 = instantiation self::m <core::int*>
-  #C9 = instantiation self::m <core::String*>
+  #C8 = instantiation #C7 <core::int*>
+  #C9 = instantiation #C7 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.transformed.expect
index 516e952..cd0afe2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.transformed.expect
@@ -46,11 +46,11 @@
 constants  {
   #C1 = <core::Symbol*, dynamic>{)
   #C2 = constructor-tearoff self::A::named
-  #C3 = instantiation self::A::named <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = static-tearoff self::A::n
-  #C5 = instantiation self::A::n <core::int*>
-  #C6 = instantiation self::A::n <core::String*>
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = instantiation #C4 <core::String*>
   #C7 = static-tearoff self::m
-  #C8 = instantiation self::m <core::int*>
-  #C9 = instantiation self::m <core::String*>
+  #C8 = instantiation #C7 <core::int*>
+  #C9 = instantiation #C7 <core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.expect
index 1d51613..db96e49 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.expect
@@ -20,5 +20,5 @@
 constants  {
   #C1 = null
   #C2 = static-tearoff self::a
-  #C3 = instantiation self::a <core::int, core::String>
+  #C3 = instantiation #C2 <core::int, core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.transformed.expect
index 1d51613..db96e49 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.strong.transformed.expect
@@ -20,5 +20,5 @@
 constants  {
   #C1 = null
   #C2 = static-tearoff self::a
-  #C3 = instantiation self::a <core::int, core::String>
+  #C3 = instantiation #C2 <core::int, core::String>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.expect
index b1a240e..b032165 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.expect
@@ -20,5 +20,5 @@
 constants  {
   #C1 = null
   #C2 = static-tearoff self::a
-  #C3 = instantiation self::a <core::int*, core::String*>
+  #C3 = instantiation #C2 <core::int*, core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.transformed.expect
index b1a240e..b032165 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.transformed.expect
@@ -20,5 +20,5 @@
 constants  {
   #C1 = null
   #C2 = static-tearoff self::a
-  #C3 = instantiation self::a <core::int*, core::String*>
+  #C3 = instantiation #C2 <core::int*, core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.expect
index 837ac1a..b2c2a5b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class A<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::baz]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
   static factory bar<X extends core::Object? = dynamic>() → self::A<self::A::bar::X%>
@@ -35,7 +35,6 @@
     return self::A::bar<self::A::baz::X%>();
 }
 static method test() → dynamic {
-  #C1;
   #C2;
   #C3;
   #C4;
@@ -43,6 +42,7 @@
   #C6;
   #C7;
   #C8;
+  #C9;
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:22:14: Error: A constructor tear-off can't have type arguments after the constructor name.
 Try removing the type arguments or placing them after the class name.
   List.filled<int>; // Error.
@@ -63,12 +63,13 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = static-tearoff core::List::filled
-  #C2 = constructor-tearoff self::A::foo
-  #C3 = static-tearoff self::A::bar
-  #C4 = redirecting-factory-tearoff self::A::baz
-  #C5 = instantiation core::List::filled <core::int>
-  #C6 = instantiation self::A::foo <core::int>
-  #C7 = instantiation self::A::bar <core::int>
-  #C8 = instantiation self::A::baz <core::int>
+  #C1 = constructor-tearoff self::A::baz
+  #C2 = constructor-tearoff core::List::filled
+  #C3 = constructor-tearoff self::A::foo
+  #C4 = constructor-tearoff self::A::bar
+  #C5 = redirecting-factory-tearoff self::A::baz
+  #C6 = instantiation #C2 <core::int>
+  #C7 = instantiation #C3 <core::int>
+  #C8 = instantiation #C4 <core::int>
+  #C9 = instantiation #C5 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.transformed.expect
index 837ac1a..b2c2a5b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.strong.transformed.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class A<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::baz]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
   static factory bar<X extends core::Object? = dynamic>() → self::A<self::A::bar::X%>
@@ -35,7 +35,6 @@
     return self::A::bar<self::A::baz::X%>();
 }
 static method test() → dynamic {
-  #C1;
   #C2;
   #C3;
   #C4;
@@ -43,6 +42,7 @@
   #C6;
   #C7;
   #C8;
+  #C9;
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:22:14: Error: A constructor tear-off can't have type arguments after the constructor name.
 Try removing the type arguments or placing them after the class name.
   List.filled<int>; // Error.
@@ -63,12 +63,13 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = static-tearoff core::List::filled
-  #C2 = constructor-tearoff self::A::foo
-  #C3 = static-tearoff self::A::bar
-  #C4 = redirecting-factory-tearoff self::A::baz
-  #C5 = instantiation core::List::filled <core::int>
-  #C6 = instantiation self::A::foo <core::int>
-  #C7 = instantiation self::A::bar <core::int>
-  #C8 = instantiation self::A::baz <core::int>
+  #C1 = constructor-tearoff self::A::baz
+  #C2 = constructor-tearoff core::List::filled
+  #C3 = constructor-tearoff self::A::foo
+  #C4 = constructor-tearoff self::A::bar
+  #C5 = redirecting-factory-tearoff self::A::baz
+  #C6 = instantiation #C2 <core::int>
+  #C7 = instantiation #C3 <core::int>
+  #C8 = instantiation #C4 <core::int>
+  #C9 = instantiation #C5 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.expect
index 1d39c74..9459fcb 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class A<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::baz]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
   static factory bar<X extends core::Object? = dynamic>() → self::A<self::A::bar::X%>
@@ -35,7 +35,6 @@
     return self::A::bar<self::A::baz::X%>();
 }
 static method test() → dynamic {
-  #C1;
   #C2;
   #C3;
   #C4;
@@ -43,6 +42,7 @@
   #C6;
   #C7;
   #C8;
+  #C9;
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:22:14: Error: A constructor tear-off can't have type arguments after the constructor name.
 Try removing the type arguments or placing them after the class name.
   List.filled<int>; // Error.
@@ -63,12 +63,13 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = static-tearoff core::List::filled
-  #C2 = constructor-tearoff self::A::foo
-  #C3 = static-tearoff self::A::bar
-  #C4 = redirecting-factory-tearoff self::A::baz
-  #C5 = instantiation core::List::filled <core::int*>
-  #C6 = instantiation self::A::foo <core::int*>
-  #C7 = instantiation self::A::bar <core::int*>
-  #C8 = instantiation self::A::baz <core::int*>
+  #C1 = constructor-tearoff self::A::baz
+  #C2 = constructor-tearoff core::List::filled
+  #C3 = constructor-tearoff self::A::foo
+  #C4 = constructor-tearoff self::A::bar
+  #C5 = redirecting-factory-tearoff self::A::baz
+  #C6 = instantiation #C2 <core::int*>
+  #C7 = instantiation #C3 <core::int*>
+  #C8 = instantiation #C4 <core::int*>
+  #C9 = instantiation #C5 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.outline.expect
index e724719..9042de9e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.outline.expect
@@ -15,3 +15,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue46890.dart:5:7 -> ConstructorTearOffConstant(A.baz)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.transformed.expect
index 1d39c74..9459fcb 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.transformed.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class A<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::baz]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
   static factory bar<X extends core::Object? = dynamic>() → self::A<self::A::bar::X%>
@@ -35,7 +35,6 @@
     return self::A::bar<self::A::baz::X%>();
 }
 static method test() → dynamic {
-  #C1;
   #C2;
   #C3;
   #C4;
@@ -43,6 +42,7 @@
   #C6;
   #C7;
   #C8;
+  #C9;
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:22:14: Error: A constructor tear-off can't have type arguments after the constructor name.
 Try removing the type arguments or placing them after the class name.
   List.filled<int>; // Error.
@@ -63,12 +63,13 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = static-tearoff core::List::filled
-  #C2 = constructor-tearoff self::A::foo
-  #C3 = static-tearoff self::A::bar
-  #C4 = redirecting-factory-tearoff self::A::baz
-  #C5 = instantiation core::List::filled <core::int*>
-  #C6 = instantiation self::A::foo <core::int*>
-  #C7 = instantiation self::A::bar <core::int*>
-  #C8 = instantiation self::A::baz <core::int*>
+  #C1 = constructor-tearoff self::A::baz
+  #C2 = constructor-tearoff core::List::filled
+  #C3 = constructor-tearoff self::A::foo
+  #C4 = constructor-tearoff self::A::bar
+  #C5 = redirecting-factory-tearoff self::A::baz
+  #C6 = instantiation #C2 <core::int*>
+  #C7 = instantiation #C3 <core::int*>
+  #C8 = instantiation #C4 <core::int*>
+  #C9 = instantiation #C5 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.expect
index a23b6b4..6057dae 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.expect
@@ -19,7 +19,7 @@
 constants  {
   #C1 = static-tearoff self::id
   #C2 = static-tearoff self::other
-  #C3 = instantiation self::id <core::int>
+  #C3 = instantiation #C1 <core::int>
   #C4 = self::A {x:#C3}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.transformed.expect
index a23b6b4..6057dae 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 constants  {
   #C1 = static-tearoff self::id
   #C2 = static-tearoff self::other
-  #C3 = instantiation self::id <core::int>
+  #C3 = instantiation #C1 <core::int>
   #C4 = self::A {x:#C3}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.expect
index 55aaf0f..9af80b0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.expect
@@ -19,7 +19,7 @@
 constants  {
   #C1 = static-tearoff self::id
   #C2 = static-tearoff self::other
-  #C3 = instantiation self::id <core::int*>
+  #C3 = instantiation #C1 <core::int*>
   #C4 = self::A {x:#C3}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.transformed.expect
index 55aaf0f..9af80b0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
 constants  {
   #C1 = static-tearoff self::id
   #C2 = static-tearoff self::other
-  #C3 = instantiation self::id <core::int*>
+  #C3 = instantiation #C1 <core::int*>
   #C4 = self::A {x:#C3}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.expect
index 41ae260..03e2e51 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.expect
@@ -18,9 +18,9 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = static-tearoff self::other
-  #C4 = instantiation self::other <core::int>
+  #C4 = instantiation #C3 <core::int>
   #C5 = self::A {x:#C2}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.transformed.expect
index 41ae260..03e2e51 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.strong.transformed.expect
@@ -18,9 +18,9 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int>
+  #C2 = instantiation #C1 <core::int>
   #C3 = static-tearoff self::other
-  #C4 = instantiation self::other <core::int>
+  #C4 = instantiation #C3 <core::int>
   #C5 = self::A {x:#C2}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.expect
index 535ad97..a593732 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.expect
@@ -18,9 +18,9 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::other
-  #C4 = instantiation self::other <core::int*>
+  #C4 = instantiation #C3 <core::int*>
   #C5 = self::A {x:#C2}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.transformed.expect
index 535ad97..a593732 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.transformed.expect
@@ -18,9 +18,9 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::other
-  #C4 = instantiation self::other <core::int*>
+  #C4 = instantiation #C3 <core::int*>
   #C5 = self::A {x:#C2}
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect
index f4cf0df..0c4cff4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.expect
@@ -32,7 +32,7 @@
   #C2 = 1
   #C3 = <core::int>[#C2]
   #C4 = self::A<core::int> {x:#C3}
-  #C5 = instantiation self::m <core::String>
+  #C5 = instantiation #C1 <core::String>
   #C6 = self::B<core::String> {f:#C5}
   #C7 = self::C<core::String> {f:#C5}
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect
index f4cf0df..0c4cff4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.strong.transformed.expect
@@ -32,7 +32,7 @@
   #C2 = 1
   #C3 = <core::int>[#C2]
   #C4 = self::A<core::int> {x:#C3}
-  #C5 = instantiation self::m <core::String>
+  #C5 = instantiation #C1 <core::String>
   #C6 = self::B<core::String> {f:#C5}
   #C7 = self::C<core::String> {f:#C5}
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect
index 78d6475..691f3a6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.expect
@@ -32,7 +32,7 @@
   #C2 = 1
   #C3 = <core::int*>[#C2]
   #C4 = self::A<core::int*> {x:#C3}
-  #C5 = instantiation self::m <core::String*>
+  #C5 = instantiation #C1 <core::String*>
   #C6 = self::B<core::String*> {f:#C5}
   #C7 = self::C<core::String*> {f:#C5}
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect
index 78d6475..691f3a6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
   #C2 = 1
   #C3 = <core::int*>[#C2]
   #C4 = self::A<core::int*> {x:#C3}
-  #C5 = instantiation self::m <core::String*>
+  #C5 = instantiation #C1 <core::String*>
   #C6 = self::B<core::String*> {f:#C5}
   #C7 = self::C<core::String*> {f:#C5}
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart
new file mode 100644
index 0000000..91be77e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef MyList<T extends num> = List<T>;
+
+main() {}
+
+test() {
+  const c1 = MyList<num>.filled;
+  const c2 = MyList<num>.filled;
+  const c3 = (MyList.filled)<num>;
+
+  const c4 = identical(c1, c2);
+  const c5 = identical(c1, c3);
+
+  expect(true, c4);
+  expect(false, c5);
+
+  expect(true, identical(c1, c2));
+  expect(false, identical(c1, c3));
+
+  var v1 = MyList<num>.filled;
+  var v2 = MyList<num>.filled;
+  var v3 = (MyList.filled)<num>;
+
+  var v4 = identical(v1, v2);
+  var v5 = identical(v1, v3);
+
+  expect(true, v4);
+  expect(false, v5);
+
+  expect(true, identical(v1, v2));
+  expect(false, identical(v1, v3));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.strong.expect
new file mode 100644
index 0000000..313acc1
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.strong.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {}
+static method test() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num>
+  #C5 = typedef-tearoff <T extends core::num>.(#C3<T>)
+  #C6 = instantiation #C5 <core::num>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.strong.transformed.expect
new file mode 100644
index 0000000..b1acc2d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {}
+static method test() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num>
+  #C5 = typedef-tearoff <T extends core::num>.(#C3<T>)
+  #C6 = instantiation #C5 <core::num>
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:20:16 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:21:17 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 32, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.textual_outline.expect
new file mode 100644
index 0000000..3730164
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+typedef MyList<T extends num> = List<T>;
+main() {}
+test() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..10f9adf
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+expect(expected, actual) {}
+main() {}
+test() {}
+typedef MyList<T extends num> = List<T>;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.expect
new file mode 100644
index 0000000..ff4b5b0
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {}
+static method test() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = typedef-tearoff <T extends core::num>.(#C3<T>)
+  #C6 = instantiation #C5 <core::num*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.outline.expect
new file mode 100644
index 0000000..88959f9
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.outline.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.transformed.expect
new file mode 100644
index 0000000..285da40f
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {}
+static method test() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = typedef-tearoff <T extends core::num>.(#C3<T>)
+  #C6 = instantiation #C5 <core::num*>
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:20:16 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:21:17 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 32, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect
index c0c195f..df41444 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect
@@ -24,7 +24,7 @@
     return new self::Class::•(constants: constants);
 }
 abstract class Const extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Const::impl]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory impl() → self::Const
     return new self::_ConstImpl::•<dynamic>();
   static method _#impl#tearOff() → self::Const
@@ -45,6 +45,7 @@
   #C1 = self::_ConstImpl<dynamic> {}
   #C2 = self::_ConstImpl<core::String> {}
   #C3 = <self::Const>[#C1, #C1, #C2]
+  #C4 = constructor-tearoff self::Const::impl
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect
index c0c195f..df41444 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
     return new self::Class::•(constants: constants);
 }
 abstract class Const extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Const::impl]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory impl() → self::Const
     return new self::_ConstImpl::•<dynamic>();
   static method _#impl#tearOff() → self::Const
@@ -45,6 +45,7 @@
   #C1 = self::_ConstImpl<dynamic> {}
   #C2 = self::_ConstImpl<core::String> {}
   #C3 = <self::Const>[#C1, #C1, #C2]
+  #C4 = constructor-tearoff self::Const::impl
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect
index 94ca00a..38c6a94 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect
@@ -24,7 +24,7 @@
     return new self::Class::•(constants: constants);
 }
 abstract class Const extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Const::impl]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory impl() → self::Const
     return new self::_ConstImpl::•<dynamic>();
   static method _#impl#tearOff() → self::Const
@@ -45,6 +45,7 @@
   #C1 = self::_ConstImpl<dynamic> {}
   #C2 = self::_ConstImpl<core::String*> {}
   #C3 = <self::Const*>[#C1, #C1, #C2]
+  #C4 = constructor-tearoff self::Const::impl
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect
index f2eca4d..7fffaa8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect
@@ -29,3 +29,8 @@
   ;
 static method _#ImplAlias#new#tearOff<T extends core::num>() → self::_ConstImpl<self::_#ImplAlias#new#tearOff::T>
   return new self::_ConstImpl::•<self::_#ImplAlias#new#tearOff::T>();
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_redirect.dart:21:16 -> ConstructorTearOffConstant(Const.impl)
+Extra constant evaluation: evaluated: 8, effectively constant: 1
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect
index 94ca00a..38c6a94 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect
@@ -24,7 +24,7 @@
     return new self::Class::•(constants: constants);
 }
 abstract class Const extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Const::impl]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory impl() → self::Const
     return new self::_ConstImpl::•<dynamic>();
   static method _#impl#tearOff() → self::Const
@@ -45,6 +45,7 @@
   #C1 = self::_ConstImpl<dynamic> {}
   #C2 = self::_ConstImpl<core::String*> {}
   #C3 = <self::Const*>[#C1, #C1, #C2]
+  #C4 = constructor-tearoff self::Const::impl
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
index 287832b..992d24b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
@@ -187,7 +187,7 @@
     return new mai::Class1::•();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class2::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   constructor named() → mai::Class2
     : super core::Object::•()
     ;
@@ -207,7 +207,7 @@
     return new mai::Class3::•(field);
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class4::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C10]/*isLegacy*/;
   constructor _() → mai::Class4<mai::Class4::T%>
     : super core::Object::•()
     ;
@@ -243,4 +243,6 @@
   #C6 = static-tearoff mai::Class4::_#redirect#tearOff
   #C7 = static-tearoff mai::Class5::_#new#tearOff
   #C8 = false
+  #C9 = constructor-tearoff mai::Class2::redirect
+  #C10 = constructor-tearoff mai::Class4::redirect
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
index bcf1164..4920c00 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
@@ -187,7 +187,7 @@
     return new mai::Class1::•();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class2::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   constructor named() → mai::Class2
     : super core::Object::•()
     ;
@@ -207,7 +207,7 @@
     return new mai::Class3::•(field);
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class4::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C10]/*isLegacy*/;
   constructor _() → mai::Class4<mai::Class4::T%>
     : super core::Object::•()
     ;
@@ -243,4 +243,6 @@
   #C6 = static-tearoff mai::Class4::_#redirect#tearOff
   #C7 = static-tearoff mai::Class5::_#new#tearOff
   #C8 = false
+  #C9 = constructor-tearoff mai::Class2::redirect
+  #C10 = constructor-tearoff mai::Class4::redirect
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
index 287832b..992d24b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
@@ -187,7 +187,7 @@
     return new mai::Class1::•();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class2::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   constructor named() → mai::Class2
     : super core::Object::•()
     ;
@@ -207,7 +207,7 @@
     return new mai::Class3::•(field);
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class4::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C10]/*isLegacy*/;
   constructor _() → mai::Class4<mai::Class4::T%>
     : super core::Object::•()
     ;
@@ -243,4 +243,6 @@
   #C6 = static-tearoff mai::Class4::_#redirect#tearOff
   #C7 = static-tearoff mai::Class5::_#new#tearOff
   #C8 = false
+  #C9 = constructor-tearoff mai::Class2::redirect
+  #C10 = constructor-tearoff mai::Class4::redirect
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
index f714802..e737b01 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
@@ -23,7 +23,7 @@
     return new self2::Class1::•();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self2::Class2::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor named() → self2::Class2
     ;
   static method _#named#tearOff() → self2::Class2
@@ -41,7 +41,7 @@
     return new self2::Class3::•(field);
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self2::Class4::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor _() → self2::Class4<self2::Class4::T%>
     ;
   static method _#_#tearOff<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::_#_#tearOff::T%>
@@ -65,3 +65,8 @@
   static method _#new#tearOff<T extends core::num>() → self2::Class5<self2::Class5::_#new#tearOff::T>
     return self2::Class5::•<self2::Class5::_#new#tearOff::T>();
 }
+
+constants  {
+  #C1 = constructor-tearoff self2::Class2::redirect
+  #C2 = constructor-tearoff self2::Class4::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
index bcf1164..4920c00 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
@@ -187,7 +187,7 @@
     return new mai::Class1::•();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class2::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   constructor named() → mai::Class2
     : super core::Object::•()
     ;
@@ -207,7 +207,7 @@
     return new mai::Class3::•(field);
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::Class4::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C10]/*isLegacy*/;
   constructor _() → mai::Class4<mai::Class4::T%>
     : super core::Object::•()
     ;
@@ -243,4 +243,6 @@
   #C6 = static-tearoff mai::Class4::_#redirect#tearOff
   #C7 = static-tearoff mai::Class5::_#new#tearOff
   #C8 = false
+  #C9 = constructor-tearoff mai::Class2::redirect
+  #C10 = constructor-tearoff mai::Class4::redirect
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect
index 31fe515..81c7cd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect
@@ -35,7 +35,7 @@
 import "dart:core" as core;
 
 class Class1<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1<self::Class1::T%>
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
 class Class2<T extends core::num> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor _() → self::Class2<self::Class2::T>
     : super core::Object::•()
     ;
@@ -59,7 +59,7 @@
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
 class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _() → self::Class3<self::Class3::T%, self::Class3::S%>
     : super core::Object::•()
     ;
@@ -71,7 +71,7 @@
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
 class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   constructor _() → self::Class4<self::Class4::T>
     : super core::Object::•()
     ;
@@ -83,7 +83,7 @@
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
 class Class4int extends self::Class4<self::Class4int> {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4int::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
   constructor _() → self::Class4int
     : super self::Class4::_()
     ;
@@ -101,7 +101,7 @@
   self::testBounded();
 }
 static method testGeneric() → dynamic {
-  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C6;
   self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
@@ -122,14 +122,14 @@
     f1b<int>(); // error
        ^" in f1b{<inapplicable>}.<core::int>();
   };
-  dynamic f1c = #C1;
+  dynamic f1c = #C6;
   dynamic c1d = f1c{dynamic}.call();
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
   self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
 }
 static method testBounded() → dynamic {
-  <T extends core::num>() → self::Class2<T> f2a = #C2;
+  <T extends core::num>() → self::Class2<T> f2a = #C7;
   self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -142,7 +142,7 @@
     f2a<int, String>(); // error
        ^" in f2a{<inapplicable>}.<core::int, core::String>();
   };
-  dynamic f2b = #C2;
+  dynamic f2b = #C7;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -151,7 +151,7 @@
   self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
   self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
   self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
-  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C8;
   self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
   self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -161,7 +161,7 @@
   () → Null {
     f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
   };
-  dynamic f3b = #C3;
+  dynamic f3b = #C8;
   dynamic c3c = f3b{dynamic}.call();
   self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -169,11 +169,11 @@
   self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
   self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
   self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
-  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C9;
   () → Null {
     self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
   };
-  dynamic f4b = #C4;
+  dynamic f4b = #C9;
   self::throws(() → dynamic => f4b{dynamic}.call());
   dynamic c4b = f4b{dynamic}.call<self::Class4int>();
   self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
@@ -182,7 +182,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -197,9 +197,14 @@
 }
 
 constants  {
-  #C1 = static-tearoff self::Class1::_#new#tearOff
-  #C2 = static-tearoff self::Class2::_#new#tearOff
-  #C3 = static-tearoff self::Class3::_#new#tearOff
-  #C4 = static-tearoff self::Class4::_#new#tearOff
-  #C5 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = constructor-tearoff self::Class4int::•
+  #C6 = static-tearoff self::Class1::_#new#tearOff
+  #C7 = static-tearoff self::Class2::_#new#tearOff
+  #C8 = static-tearoff self::Class3::_#new#tearOff
+  #C9 = static-tearoff self::Class4::_#new#tearOff
+  #C10 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect
index 2b61e14..2a37cef 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
 import "dart:core" as core;
 
 class Class1<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1<self::Class1::T%>
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
 class Class2<T extends core::num> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor _() → self::Class2<self::Class2::T>
     : super core::Object::•()
     ;
@@ -59,7 +59,7 @@
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
 class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _() → self::Class3<self::Class3::T%, self::Class3::S%>
     : super core::Object::•()
     ;
@@ -71,7 +71,7 @@
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
 class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   constructor _() → self::Class4<self::Class4::T>
     : super core::Object::•()
     ;
@@ -83,7 +83,7 @@
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
 class Class4int extends self::Class4<self::Class4int> {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4int::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
   constructor _() → self::Class4int
     : super self::Class4::_()
     ;
@@ -101,7 +101,7 @@
   self::testBounded();
 }
 static method testGeneric() → dynamic {
-  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C6;
   self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
@@ -122,14 +122,14 @@
     f1b<int>(); // error
        ^" in f1b{<inapplicable>}.<core::int>();
   };
-  dynamic f1c = #C1;
+  dynamic f1c = #C6;
   dynamic c1d = f1c{dynamic}.call();
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
   self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
 }
 static method testBounded() → dynamic {
-  <T extends core::num>() → self::Class2<T> f2a = #C2;
+  <T extends core::num>() → self::Class2<T> f2a = #C7;
   self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -142,7 +142,7 @@
     f2a<int, String>(); // error
        ^" in f2a{<inapplicable>}.<core::int, core::String>();
   };
-  dynamic f2b = #C2;
+  dynamic f2b = #C7;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -151,7 +151,7 @@
   self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
   self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
   self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
-  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C8;
   self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
   self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -161,7 +161,7 @@
   () → Null {
     f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
   };
-  dynamic f3b = #C3;
+  dynamic f3b = #C8;
   dynamic c3c = f3b{dynamic}.call();
   self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -169,11 +169,11 @@
   self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
   self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
   self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
-  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C9;
   () → Null {
     self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
   };
-  dynamic f4b = #C4;
+  dynamic f4b = #C9;
   self::throws(() → dynamic => f4b{dynamic}.call());
   dynamic c4b = f4b{dynamic}.call<self::Class4int>();
   self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
@@ -182,7 +182,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -197,9 +197,14 @@
 }
 
 constants  {
-  #C1 = static-tearoff self::Class1::_#new#tearOff
-  #C2 = static-tearoff self::Class2::_#new#tearOff
-  #C3 = static-tearoff self::Class3::_#new#tearOff
-  #C4 = static-tearoff self::Class4::_#new#tearOff
-  #C5 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = constructor-tearoff self::Class4int::•
+  #C6 = static-tearoff self::Class1::_#new#tearOff
+  #C7 = static-tearoff self::Class2::_#new#tearOff
+  #C8 = static-tearoff self::Class3::_#new#tearOff
+  #C9 = static-tearoff self::Class4::_#new#tearOff
+  #C10 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect
index 31fe515..81c7cd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect
@@ -35,7 +35,7 @@
 import "dart:core" as core;
 
 class Class1<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1<self::Class1::T%>
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
 class Class2<T extends core::num> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor _() → self::Class2<self::Class2::T>
     : super core::Object::•()
     ;
@@ -59,7 +59,7 @@
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
 class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _() → self::Class3<self::Class3::T%, self::Class3::S%>
     : super core::Object::•()
     ;
@@ -71,7 +71,7 @@
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
 class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   constructor _() → self::Class4<self::Class4::T>
     : super core::Object::•()
     ;
@@ -83,7 +83,7 @@
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
 class Class4int extends self::Class4<self::Class4int> {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4int::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
   constructor _() → self::Class4int
     : super self::Class4::_()
     ;
@@ -101,7 +101,7 @@
   self::testBounded();
 }
 static method testGeneric() → dynamic {
-  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C6;
   self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
@@ -122,14 +122,14 @@
     f1b<int>(); // error
        ^" in f1b{<inapplicable>}.<core::int>();
   };
-  dynamic f1c = #C1;
+  dynamic f1c = #C6;
   dynamic c1d = f1c{dynamic}.call();
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
   self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
 }
 static method testBounded() → dynamic {
-  <T extends core::num>() → self::Class2<T> f2a = #C2;
+  <T extends core::num>() → self::Class2<T> f2a = #C7;
   self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -142,7 +142,7 @@
     f2a<int, String>(); // error
        ^" in f2a{<inapplicable>}.<core::int, core::String>();
   };
-  dynamic f2b = #C2;
+  dynamic f2b = #C7;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -151,7 +151,7 @@
   self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
   self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
   self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
-  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C8;
   self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
   self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -161,7 +161,7 @@
   () → Null {
     f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
   };
-  dynamic f3b = #C3;
+  dynamic f3b = #C8;
   dynamic c3c = f3b{dynamic}.call();
   self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -169,11 +169,11 @@
   self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
   self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
   self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
-  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C9;
   () → Null {
     self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
   };
-  dynamic f4b = #C4;
+  dynamic f4b = #C9;
   self::throws(() → dynamic => f4b{dynamic}.call());
   dynamic c4b = f4b{dynamic}.call<self::Class4int>();
   self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
@@ -182,7 +182,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -197,9 +197,14 @@
 }
 
 constants  {
-  #C1 = static-tearoff self::Class1::_#new#tearOff
-  #C2 = static-tearoff self::Class2::_#new#tearOff
-  #C3 = static-tearoff self::Class3::_#new#tearOff
-  #C4 = static-tearoff self::Class4::_#new#tearOff
-  #C5 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = constructor-tearoff self::Class4int::•
+  #C6 = static-tearoff self::Class1::_#new#tearOff
+  #C7 = static-tearoff self::Class2::_#new#tearOff
+  #C8 = static-tearoff self::Class3::_#new#tearOff
+  #C9 = static-tearoff self::Class4::_#new#tearOff
+  #C10 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect
index f1a60c8..eaa086d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect
@@ -68,3 +68,12 @@
   ;
 static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_redirecting_factory_tear_off.dart:13:7 -> ConstructorTearOffConstant(Class1.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_redirecting_factory_tear_off.dart:45:7 -> ConstructorTearOffConstant(Class2.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_redirecting_factory_tear_off.dart:50:7 -> ConstructorTearOffConstant(Class3.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_redirecting_factory_tear_off.dart:55:7 -> ConstructorTearOffConstant(Class4.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_redirecting_factory_tear_off.dart:60:7 -> ConstructorTearOffConstant(Class4int.)
+Extra constant evaluation: evaluated: 25, effectively constant: 5
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect
index 2b61e14..2a37cef 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
 import "dart:core" as core;
 
 class Class1<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1<self::Class1::T%>
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
 class Class2<T extends core::num> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor _() → self::Class2<self::Class2::T>
     : super core::Object::•()
     ;
@@ -59,7 +59,7 @@
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
 class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _() → self::Class3<self::Class3::T%, self::Class3::S%>
     : super core::Object::•()
     ;
@@ -71,7 +71,7 @@
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
 class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   constructor _() → self::Class4<self::Class4::T>
     : super core::Object::•()
     ;
@@ -83,7 +83,7 @@
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
 class Class4int extends self::Class4<self::Class4int> {
-  static final field dynamic _redirecting# = <dynamic>[self::Class4int::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
   constructor _() → self::Class4int
     : super self::Class4::_()
     ;
@@ -101,7 +101,7 @@
   self::testBounded();
 }
 static method testGeneric() → dynamic {
-  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C6;
   self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
@@ -122,14 +122,14 @@
     f1b<int>(); // error
        ^" in f1b{<inapplicable>}.<core::int>();
   };
-  dynamic f1c = #C1;
+  dynamic f1c = #C6;
   dynamic c1d = f1c{dynamic}.call();
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
   self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
   self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
 }
 static method testBounded() → dynamic {
-  <T extends core::num>() → self::Class2<T> f2a = #C2;
+  <T extends core::num>() → self::Class2<T> f2a = #C7;
   self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -142,7 +142,7 @@
     f2a<int, String>(); // error
        ^" in f2a{<inapplicable>}.<core::int, core::String>();
   };
-  dynamic f2b = #C2;
+  dynamic f2b = #C7;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
   self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
@@ -151,7 +151,7 @@
   self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
   self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
   self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
-  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C8;
   self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
   self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -161,7 +161,7 @@
   () → Null {
     f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
   };
-  dynamic f3b = #C3;
+  dynamic f3b = #C8;
   dynamic c3c = f3b{dynamic}.call();
   self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
   self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
@@ -169,11 +169,11 @@
   self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
   self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
   self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
-  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C9;
   () → Null {
     self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
   };
-  dynamic f4b = #C4;
+  dynamic f4b = #C9;
   self::throws(() → dynamic => f4b{dynamic}.call());
   dynamic c4b = f4b{dynamic}.call<self::Class4int>();
   self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
@@ -182,7 +182,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -197,9 +197,14 @@
 }
 
 constants  {
-  #C1 = static-tearoff self::Class1::_#new#tearOff
-  #C2 = static-tearoff self::Class2::_#new#tearOff
-  #C3 = static-tearoff self::Class3::_#new#tearOff
-  #C4 = static-tearoff self::Class4::_#new#tearOff
-  #C5 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = constructor-tearoff self::Class4int::•
+  #C6 = static-tearoff self::Class1::_#new#tearOff
+  #C7 = static-tearoff self::Class2::_#new#tearOff
+  #C8 = static-tearoff self::Class3::_#new#tearOff
+  #C9 = static-tearoff self::Class4::_#new#tearOff
+  #C10 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect
index abfa7c0..66ac229 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect
@@ -6,7 +6,7 @@
 typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
 typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -22,51 +22,51 @@
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
-static const field () → self::A<core::int> f1a = #C2;
-static const field () → self::A<core::int> f1b = #C2;
-static const field () → self::A<core::int> f1c = #C2;
-static const field () → self::A<core::int> f1d = #C4;
-static const field () → self::A<core::int> f1e = #C4;
-static const field () → self::A<core::int> f1f = #C4;
-static const field () → self::A<core::int> f1g = #C6;
-static const field () → self::A<core::int> f1h = #C6;
-static const field () → self::A<core::int> f1i = #C6;
-static const field () → self::A<core::int> g1a = #C2;
-static const field () → self::A<core::int> g1b = #C2;
-static const field () → self::A<core::int> g1c = #C2;
-static const field () → self::A<core::int> h1a = #C2;
-static const field () → self::A<core::int> h1b = #C2;
-static const field () → self::A<core::int> h1c = #C2;
+static const field () → self::A<core::int> f1a = #C3;
+static const field () → self::A<core::int> f1b = #C3;
+static const field () → self::A<core::int> f1c = #C3;
+static const field () → self::A<core::int> f1d = #C5;
+static const field () → self::A<core::int> f1e = #C5;
+static const field () → self::A<core::int> f1f = #C5;
+static const field () → self::A<core::int> f1g = #C7;
+static const field () → self::A<core::int> f1h = #C7;
+static const field () → self::A<core::int> f1i = #C7;
+static const field () → self::A<core::int> g1a = #C3;
+static const field () → self::A<core::int> g1b = #C3;
+static const field () → self::A<core::int> g1c = #C3;
+static const field () → self::A<core::int> h1a = #C3;
+static const field () → self::A<core::int> h1b = #C3;
+static const field () → self::A<core::int> h1c = #C3;
 static method main() → dynamic {
   self::test<core::int>();
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C4, #C4);
-  core::identical(#C4, #C4);
-  core::identical(#C6, #C6);
-  core::identical(#C6, #C6);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C5, #C5);
+  core::identical(#C5, #C5);
+  core::identical(#C7, #C7);
+  core::identical(#C7, #C7);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
 }
 static method test<T extends core::num>() → dynamic {
-  () → self::A<self::test::T> f2a = #C1<self::test::T>;
-  () → self::A<self::test::T> f2b = #C1<self::test::T>;
-  () → self::A<self::test::T> f2c = #C1<self::test::T>;
-  () → self::A<self::test::T> f2d = #C3<self::test::T>;
-  () → self::A<self::test::T> f2e = #C3<self::test::T>;
-  () → self::A<self::test::T> f2f = #C3<self::test::T>;
-  () → self::A<self::test::T> f2g = #C5<self::test::T>;
-  () → self::A<self::test::T> f2h = #C5<self::test::T>;
-  () → self::A<self::test::T> f2i = #C5<self::test::T>;
-  () → self::A<core::int> g2a = #C2;
-  () → self::A<core::int> g2b = #C2;
-  () → self::A<core::int> g2c = #C2;
-  () → self::A<self::test::T> h2a = #C1<self::test::T>;
-  () → self::A<self::test::T> h2b = #C1<self::test::T>;
-  () → self::A<self::test::T> h2c = #C1<self::test::T>;
-  self::expect(#C2, g2a);
+  () → self::A<self::test::T> f2a = #C2<self::test::T>;
+  () → self::A<self::test::T> f2b = #C2<self::test::T>;
+  () → self::A<self::test::T> f2c = #C2<self::test::T>;
+  () → self::A<self::test::T> f2d = #C4<self::test::T>;
+  () → self::A<self::test::T> f2e = #C4<self::test::T>;
+  () → self::A<self::test::T> f2f = #C4<self::test::T>;
+  () → self::A<self::test::T> f2g = #C6<self::test::T>;
+  () → self::A<self::test::T> f2h = #C6<self::test::T>;
+  () → self::A<self::test::T> f2i = #C6<self::test::T>;
+  () → self::A<core::int> g2a = #C3;
+  () → self::A<core::int> g2b = #C3;
+  () → self::A<core::int> g2c = #C3;
+  () → self::A<self::test::T> h2a = #C2<self::test::T>;
+  () → self::A<self::test::T> h2b = #C2<self::test::T>;
+  () → self::A<self::test::T> h2c = #C2<self::test::T>;
+  self::expect(#C3, g2a);
   self::expect(g2a, g2b);
   if(self::inSoundMode) {
     self::expect(g2a, g2c);
@@ -96,10 +96,11 @@
   return self::A::_#redirect#tearOff<self::_#H#redirect#tearOff::X%>();
 
 constants  {
-  #C1 = static-tearoff self::A::_#new#tearOff
-  #C2 = instantiation self::A::_#new#tearOff <core::int>
-  #C3 = static-tearoff self::A::_#fact#tearOff
-  #C4 = instantiation self::A::_#fact#tearOff <core::int>
-  #C5 = static-tearoff self::A::_#redirect#tearOff
-  #C6 = instantiation self::A::_#redirect#tearOff <core::int>
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = static-tearoff self::A::_#new#tearOff
+  #C3 = instantiation #C2 <core::int>
+  #C4 = static-tearoff self::A::_#fact#tearOff
+  #C5 = instantiation #C4 <core::int>
+  #C6 = static-tearoff self::A::_#redirect#tearOff
+  #C7 = instantiation #C6 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect
index e5c1801..6d90c84 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
 typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -22,51 +22,51 @@
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
-static const field () → self::A<core::int> f1a = #C2;
-static const field () → self::A<core::int> f1b = #C2;
-static const field () → self::A<core::int> f1c = #C2;
-static const field () → self::A<core::int> f1d = #C4;
-static const field () → self::A<core::int> f1e = #C4;
-static const field () → self::A<core::int> f1f = #C4;
-static const field () → self::A<core::int> f1g = #C6;
-static const field () → self::A<core::int> f1h = #C6;
-static const field () → self::A<core::int> f1i = #C6;
-static const field () → self::A<core::int> g1a = #C2;
-static const field () → self::A<core::int> g1b = #C2;
-static const field () → self::A<core::int> g1c = #C2;
-static const field () → self::A<core::int> h1a = #C2;
-static const field () → self::A<core::int> h1b = #C2;
-static const field () → self::A<core::int> h1c = #C2;
+static const field () → self::A<core::int> f1a = #C3;
+static const field () → self::A<core::int> f1b = #C3;
+static const field () → self::A<core::int> f1c = #C3;
+static const field () → self::A<core::int> f1d = #C5;
+static const field () → self::A<core::int> f1e = #C5;
+static const field () → self::A<core::int> f1f = #C5;
+static const field () → self::A<core::int> f1g = #C7;
+static const field () → self::A<core::int> f1h = #C7;
+static const field () → self::A<core::int> f1i = #C7;
+static const field () → self::A<core::int> g1a = #C3;
+static const field () → self::A<core::int> g1b = #C3;
+static const field () → self::A<core::int> g1c = #C3;
+static const field () → self::A<core::int> h1a = #C3;
+static const field () → self::A<core::int> h1b = #C3;
+static const field () → self::A<core::int> h1c = #C3;
 static method main() → dynamic {
   self::test<core::int>();
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C4, #C4);
-  core::identical(#C4, #C4);
-  core::identical(#C6, #C6);
-  core::identical(#C6, #C6);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C5, #C5);
+  core::identical(#C5, #C5);
+  core::identical(#C7, #C7);
+  core::identical(#C7, #C7);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
 }
 static method test<T extends core::num>() → dynamic {
-  () → self::A<self::test::T> f2a = #C1<self::test::T>;
-  () → self::A<self::test::T> f2b = #C1<self::test::T>;
-  () → self::A<self::test::T> f2c = #C1<self::test::T>;
-  () → self::A<self::test::T> f2d = #C3<self::test::T>;
-  () → self::A<self::test::T> f2e = #C3<self::test::T>;
-  () → self::A<self::test::T> f2f = #C3<self::test::T>;
-  () → self::A<self::test::T> f2g = #C5<self::test::T>;
-  () → self::A<self::test::T> f2h = #C5<self::test::T>;
-  () → self::A<self::test::T> f2i = #C5<self::test::T>;
-  () → self::A<core::int> g2a = #C2;
-  () → self::A<core::int> g2b = #C2;
-  () → self::A<core::int> g2c = #C2;
-  () → self::A<self::test::T> h2a = #C1<self::test::T>;
-  () → self::A<self::test::T> h2b = #C1<self::test::T>;
-  () → self::A<self::test::T> h2c = #C1<self::test::T>;
-  self::expect(#C2, g2a);
+  () → self::A<self::test::T> f2a = #C2<self::test::T>;
+  () → self::A<self::test::T> f2b = #C2<self::test::T>;
+  () → self::A<self::test::T> f2c = #C2<self::test::T>;
+  () → self::A<self::test::T> f2d = #C4<self::test::T>;
+  () → self::A<self::test::T> f2e = #C4<self::test::T>;
+  () → self::A<self::test::T> f2f = #C4<self::test::T>;
+  () → self::A<self::test::T> f2g = #C6<self::test::T>;
+  () → self::A<self::test::T> f2h = #C6<self::test::T>;
+  () → self::A<self::test::T> f2i = #C6<self::test::T>;
+  () → self::A<core::int> g2a = #C3;
+  () → self::A<core::int> g2b = #C3;
+  () → self::A<core::int> g2c = #C3;
+  () → self::A<self::test::T> h2a = #C2<self::test::T>;
+  () → self::A<self::test::T> h2b = #C2<self::test::T>;
+  () → self::A<self::test::T> h2c = #C2<self::test::T>;
+  self::expect(#C3, g2a);
   self::expect(g2a, g2b);
   if(self::inSoundMode) {
     self::expect(g2a, g2c);
@@ -96,12 +96,13 @@
   return self::A::_#redirect#tearOff<self::_#H#redirect#tearOff::X%>();
 
 constants  {
-  #C1 = static-tearoff self::A::_#new#tearOff
-  #C2 = instantiation self::A::_#new#tearOff <core::int>
-  #C3 = static-tearoff self::A::_#fact#tearOff
-  #C4 = instantiation self::A::_#fact#tearOff <core::int>
-  #C5 = static-tearoff self::A::_#redirect#tearOff
-  #C6 = instantiation self::A::_#redirect#tearOff <core::int>
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = static-tearoff self::A::_#new#tearOff
+  #C3 = instantiation #C2 <core::int>
+  #C4 = static-tearoff self::A::_#fact#tearOff
+  #C5 = instantiation #C4 <core::int>
+  #C6 = static-tearoff self::A::_#redirect#tearOff
+  #C7 = instantiation #C6 <core::int>
 }
 
 Extra constant evaluation status:
@@ -115,4 +116,4 @@
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:48:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:50:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:51:3 -> BoolConstant(true)
-Extra constant evaluation: evaluated: 59, effectively constant: 10
+Extra constant evaluation: evaluated: 58, effectively constant: 10
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect
index 942bbe6..6075c15 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect
@@ -6,7 +6,7 @@
 typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
 typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -22,51 +22,51 @@
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
-static const field () → self::A<core::int> f1a = #C2;
-static const field () → self::A<core::int> f1b = #C2;
-static const field () → self::A<core::int> f1c = #C2;
-static const field () → self::A<core::int> f1d = #C4;
-static const field () → self::A<core::int> f1e = #C4;
-static const field () → self::A<core::int> f1f = #C4;
-static const field () → self::A<core::int> f1g = #C6;
-static const field () → self::A<core::int> f1h = #C6;
-static const field () → self::A<core::int> f1i = #C6;
-static const field () → self::A<core::int> g1a = #C2;
-static const field () → self::A<core::int> g1b = #C2;
-static const field () → self::A<core::int> g1c = #C2;
-static const field () → self::A<core::int> h1a = #C2;
-static const field () → self::A<core::int> h1b = #C2;
-static const field () → self::A<core::int> h1c = #C2;
+static const field () → self::A<core::int> f1a = #C3;
+static const field () → self::A<core::int> f1b = #C3;
+static const field () → self::A<core::int> f1c = #C3;
+static const field () → self::A<core::int> f1d = #C5;
+static const field () → self::A<core::int> f1e = #C5;
+static const field () → self::A<core::int> f1f = #C5;
+static const field () → self::A<core::int> f1g = #C7;
+static const field () → self::A<core::int> f1h = #C7;
+static const field () → self::A<core::int> f1i = #C7;
+static const field () → self::A<core::int> g1a = #C3;
+static const field () → self::A<core::int> g1b = #C3;
+static const field () → self::A<core::int> g1c = #C3;
+static const field () → self::A<core::int> h1a = #C3;
+static const field () → self::A<core::int> h1b = #C3;
+static const field () → self::A<core::int> h1c = #C3;
 static method main() → dynamic {
   self::test<core::int>();
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C4, #C4);
-  core::identical(#C4, #C4);
-  core::identical(#C6, #C6);
-  core::identical(#C6, #C6);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C5, #C5);
+  core::identical(#C5, #C5);
+  core::identical(#C7, #C7);
+  core::identical(#C7, #C7);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
 }
 static method test<T extends core::num>() → dynamic {
-  () → self::A<self::test::T> f2a = #C1<self::test::T>;
-  () → self::A<self::test::T> f2b = #C1<self::test::T>;
-  () → self::A<self::test::T> f2c = #C1<self::test::T>;
-  () → self::A<self::test::T> f2d = #C3<self::test::T>;
-  () → self::A<self::test::T> f2e = #C3<self::test::T>;
-  () → self::A<self::test::T> f2f = #C3<self::test::T>;
-  () → self::A<self::test::T> f2g = #C5<self::test::T>;
-  () → self::A<self::test::T> f2h = #C5<self::test::T>;
-  () → self::A<self::test::T> f2i = #C5<self::test::T>;
-  () → self::A<core::int> g2a = #C2;
-  () → self::A<core::int> g2b = #C2;
-  () → self::A<core::int> g2c = #C2;
-  () → self::A<self::test::T> h2a = #C1<self::test::T>;
-  () → self::A<self::test::T> h2b = #C1<self::test::T>;
-  () → self::A<self::test::T> h2c = #C1<self::test::T>;
-  self::expect(#C2, g2a);
+  () → self::A<self::test::T> f2a = #C2<self::test::T>;
+  () → self::A<self::test::T> f2b = #C2<self::test::T>;
+  () → self::A<self::test::T> f2c = #C2<self::test::T>;
+  () → self::A<self::test::T> f2d = #C4<self::test::T>;
+  () → self::A<self::test::T> f2e = #C4<self::test::T>;
+  () → self::A<self::test::T> f2f = #C4<self::test::T>;
+  () → self::A<self::test::T> f2g = #C6<self::test::T>;
+  () → self::A<self::test::T> f2h = #C6<self::test::T>;
+  () → self::A<self::test::T> f2i = #C6<self::test::T>;
+  () → self::A<core::int> g2a = #C3;
+  () → self::A<core::int> g2b = #C3;
+  () → self::A<core::int> g2c = #C3;
+  () → self::A<self::test::T> h2a = #C2<self::test::T>;
+  () → self::A<self::test::T> h2b = #C2<self::test::T>;
+  () → self::A<self::test::T> h2c = #C2<self::test::T>;
+  self::expect(#C3, g2a);
   self::expect(g2a, g2b);
   if(self::inSoundMode) {
     self::expect(g2a, g2c);
@@ -96,10 +96,11 @@
   return self::A::_#redirect#tearOff<self::_#H#redirect#tearOff::X%>();
 
 constants  {
-  #C1 = static-tearoff self::A::_#new#tearOff
-  #C2 = instantiation self::A::_#new#tearOff <core::int*>
-  #C3 = static-tearoff self::A::_#fact#tearOff
-  #C4 = instantiation self::A::_#fact#tearOff <core::int*>
-  #C5 = static-tearoff self::A::_#redirect#tearOff
-  #C6 = instantiation self::A::_#redirect#tearOff <core::int*>
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = static-tearoff self::A::_#new#tearOff
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = static-tearoff self::A::_#fact#tearOff
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = static-tearoff self::A::_#redirect#tearOff
+  #C7 = instantiation #C6 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect
index feba408..1d3da75 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect
@@ -23,19 +23,19 @@
 static final field core::bool inSoundMode;
 static const field () → self::A<core::int> f1a = self::A::_#new#tearOff<core::int>;
 static const field () → self::A<core::int> f1b = self::A::_#new#tearOff<core::int>;
-static const field () → self::A<core::int> f1c = self::_#F#new#tearOff<core::int>;
+static const field () → self::A<core::int> f1c = self::A::_#new#tearOff<core::int>;
 static const field () → self::A<core::int> f1d = self::A::_#fact#tearOff<core::int>;
 static const field () → self::A<core::int> f1e = self::A::_#fact#tearOff<core::int>;
-static const field () → self::A<core::int> f1f = self::_#F#fact#tearOff<core::int>;
+static const field () → self::A<core::int> f1f = self::A::_#fact#tearOff<core::int>;
 static const field () → self::A<core::int> f1g = self::A::_#redirect#tearOff<core::int>;
 static const field () → self::A<core::int> f1h = self::A::_#redirect#tearOff<core::int>;
-static const field () → self::A<core::int> f1i = self::_#F#redirect#tearOff<core::int>;
+static const field () → self::A<core::int> f1i = self::A::_#redirect#tearOff<core::int>;
 static const field () → self::A<core::int> g1a = self::A::_#new#tearOff<core::int>;
 static const field () → self::A<core::int> g1b = self::A::_#new#tearOff<core::int>;
-static const field () → self::A<core::int> g1c = self::_#G#new#tearOff<dynamic>;
+static const field () → self::A<core::int> g1c = self::A::_#new#tearOff<core::int>;
 static const field () → self::A<core::int> h1a = self::A::_#new#tearOff<core::int>;
 static const field () → self::A<core::int> h1b = self::A::_#new#tearOff<core::int>;
-static const field () → self::A<core::int> h1c = self::_#H#new#tearOff<core::int, dynamic>;
+static const field () → self::A<core::int> h1c = self::A::_#new#tearOff<core::int>;
 static method main() → dynamic
   ;
 static method test<T extends core::num>() → dynamic
@@ -63,19 +63,20 @@
 
 
 Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///inferred_non_proper_rename.dart:7:7 -> ConstructorTearOffConstant(A.redirect)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:17:13 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:18:13 -> InstantiationConstant(A._#new#tearOff<int*>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:19:31 -> InstantiationConstant(A._#new#tearOff<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:19:25 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:20:13 -> InstantiationConstant(A._#fact#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:21:13 -> InstantiationConstant(A._#fact#tearOff<int*>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:22:31 -> InstantiationConstant(A._#fact#tearOff<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:22:25 -> InstantiationConstant(A._#fact#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:23:13 -> InstantiationConstant(A._#redirect#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:24:13 -> InstantiationConstant(A._#redirect#tearOff<int*>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:25:31 -> InstantiationConstant(A._#redirect#tearOff<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:25:25 -> InstantiationConstant(A._#redirect#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:27:13 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:28:13 -> InstantiationConstant(A._#new#tearOff<int*>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:29:31 -> InstantiationConstant(A._#new#tearOff<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:29:25 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:31:13 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:32:13 -> InstantiationConstant(A._#new#tearOff<int*>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:31 -> InstantiationConstant(A._#new#tearOff<int*>)
-Extra constant evaluation: evaluated: 30, effectively constant: 15
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:25 -> InstantiationConstant(A._#new#tearOff<int*>)
+Extra constant evaluation: evaluated: 30, effectively constant: 16
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect
index 3d86e63..f1ac2a0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
 typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
 typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -22,51 +22,51 @@
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
-static const field () → self::A<core::int> f1a = #C2;
-static const field () → self::A<core::int> f1b = #C2;
-static const field () → self::A<core::int> f1c = #C2;
-static const field () → self::A<core::int> f1d = #C4;
-static const field () → self::A<core::int> f1e = #C4;
-static const field () → self::A<core::int> f1f = #C4;
-static const field () → self::A<core::int> f1g = #C6;
-static const field () → self::A<core::int> f1h = #C6;
-static const field () → self::A<core::int> f1i = #C6;
-static const field () → self::A<core::int> g1a = #C2;
-static const field () → self::A<core::int> g1b = #C2;
-static const field () → self::A<core::int> g1c = #C2;
-static const field () → self::A<core::int> h1a = #C2;
-static const field () → self::A<core::int> h1b = #C2;
-static const field () → self::A<core::int> h1c = #C2;
+static const field () → self::A<core::int> f1a = #C3;
+static const field () → self::A<core::int> f1b = #C3;
+static const field () → self::A<core::int> f1c = #C3;
+static const field () → self::A<core::int> f1d = #C5;
+static const field () → self::A<core::int> f1e = #C5;
+static const field () → self::A<core::int> f1f = #C5;
+static const field () → self::A<core::int> f1g = #C7;
+static const field () → self::A<core::int> f1h = #C7;
+static const field () → self::A<core::int> f1i = #C7;
+static const field () → self::A<core::int> g1a = #C3;
+static const field () → self::A<core::int> g1b = #C3;
+static const field () → self::A<core::int> g1c = #C3;
+static const field () → self::A<core::int> h1a = #C3;
+static const field () → self::A<core::int> h1b = #C3;
+static const field () → self::A<core::int> h1c = #C3;
 static method main() → dynamic {
   self::test<core::int>();
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C4, #C4);
-  core::identical(#C4, #C4);
-  core::identical(#C6, #C6);
-  core::identical(#C6, #C6);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
-  core::identical(#C2, #C2);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C5, #C5);
+  core::identical(#C5, #C5);
+  core::identical(#C7, #C7);
+  core::identical(#C7, #C7);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
 }
 static method test<T extends core::num>() → dynamic {
-  () → self::A<self::test::T> f2a = #C1<self::test::T>;
-  () → self::A<self::test::T> f2b = #C1<self::test::T>;
-  () → self::A<self::test::T> f2c = #C1<self::test::T>;
-  () → self::A<self::test::T> f2d = #C3<self::test::T>;
-  () → self::A<self::test::T> f2e = #C3<self::test::T>;
-  () → self::A<self::test::T> f2f = #C3<self::test::T>;
-  () → self::A<self::test::T> f2g = #C5<self::test::T>;
-  () → self::A<self::test::T> f2h = #C5<self::test::T>;
-  () → self::A<self::test::T> f2i = #C5<self::test::T>;
-  () → self::A<core::int> g2a = #C2;
-  () → self::A<core::int> g2b = #C2;
-  () → self::A<core::int> g2c = #C2;
-  () → self::A<self::test::T> h2a = #C1<self::test::T>;
-  () → self::A<self::test::T> h2b = #C1<self::test::T>;
-  () → self::A<self::test::T> h2c = #C1<self::test::T>;
-  self::expect(#C2, g2a);
+  () → self::A<self::test::T> f2a = #C2<self::test::T>;
+  () → self::A<self::test::T> f2b = #C2<self::test::T>;
+  () → self::A<self::test::T> f2c = #C2<self::test::T>;
+  () → self::A<self::test::T> f2d = #C4<self::test::T>;
+  () → self::A<self::test::T> f2e = #C4<self::test::T>;
+  () → self::A<self::test::T> f2f = #C4<self::test::T>;
+  () → self::A<self::test::T> f2g = #C6<self::test::T>;
+  () → self::A<self::test::T> f2h = #C6<self::test::T>;
+  () → self::A<self::test::T> f2i = #C6<self::test::T>;
+  () → self::A<core::int> g2a = #C3;
+  () → self::A<core::int> g2b = #C3;
+  () → self::A<core::int> g2c = #C3;
+  () → self::A<self::test::T> h2a = #C2<self::test::T>;
+  () → self::A<self::test::T> h2b = #C2<self::test::T>;
+  () → self::A<self::test::T> h2c = #C2<self::test::T>;
+  self::expect(#C3, g2a);
   self::expect(g2a, g2b);
   if(self::inSoundMode) {
     self::expect(g2a, g2c);
@@ -96,12 +96,13 @@
   return self::A::_#redirect#tearOff<self::_#H#redirect#tearOff::X%>();
 
 constants  {
-  #C1 = static-tearoff self::A::_#new#tearOff
-  #C2 = instantiation self::A::_#new#tearOff <core::int*>
-  #C3 = static-tearoff self::A::_#fact#tearOff
-  #C4 = instantiation self::A::_#fact#tearOff <core::int*>
-  #C5 = static-tearoff self::A::_#redirect#tearOff
-  #C6 = instantiation self::A::_#redirect#tearOff <core::int*>
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = static-tearoff self::A::_#new#tearOff
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = static-tearoff self::A::_#fact#tearOff
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = static-tearoff self::A::_#redirect#tearOff
+  #C7 = instantiation #C6 <core::int*>
 }
 
 Extra constant evaluation status:
@@ -115,4 +116,4 @@
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:48:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:50:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:51:3 -> BoolConstant(true)
-Extra constant evaluation: evaluated: 59, effectively constant: 10
+Extra constant evaluation: evaluated: 58, effectively constant: 10
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.expect
index 254bc55..ddcf3b9 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.expect
@@ -56,7 +56,7 @@
   #C4 = static-tearoff self::_#G#new#tearOff
   #C5 = static-tearoff self::A::_#named#tearOff
   #C6 = static-tearoff self::B::_#named#tearOff
-  #C7 = instantiation self::B::_#named#tearOff <core::int>
+  #C7 = instantiation #C6 <core::int>
   #C8 = static-tearoff self::_#F#named#tearOff
-  #C9 = instantiation self::B::_#named#tearOff <dynamic>
+  #C9 = instantiation #C6 <dynamic>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.transformed.expect
index 254bc55..ddcf3b9 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.strong.transformed.expect
@@ -56,7 +56,7 @@
   #C4 = static-tearoff self::_#G#new#tearOff
   #C5 = static-tearoff self::A::_#named#tearOff
   #C6 = static-tearoff self::B::_#named#tearOff
-  #C7 = instantiation self::B::_#named#tearOff <core::int>
+  #C7 = instantiation #C6 <core::int>
   #C8 = static-tearoff self::_#F#named#tearOff
-  #C9 = instantiation self::B::_#named#tearOff <dynamic>
+  #C9 = instantiation #C6 <dynamic>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.expect
index b80b9d5..3414686 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.expect
@@ -56,7 +56,7 @@
   #C4 = static-tearoff self::_#G#new#tearOff
   #C5 = static-tearoff self::A::_#named#tearOff
   #C6 = static-tearoff self::B::_#named#tearOff
-  #C7 = instantiation self::B::_#named#tearOff <core::int*>
+  #C7 = instantiation #C6 <core::int*>
   #C8 = static-tearoff self::_#F#named#tearOff
-  #C9 = instantiation self::B::_#named#tearOff <dynamic>
+  #C9 = instantiation #C6 <dynamic>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.transformed.expect
index b80b9d5..3414686 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.transformed.expect
@@ -56,7 +56,7 @@
   #C4 = static-tearoff self::_#G#new#tearOff
   #C5 = static-tearoff self::A::_#named#tearOff
   #C6 = static-tearoff self::B::_#named#tearOff
-  #C7 = instantiation self::B::_#named#tearOff <core::int*>
+  #C7 = instantiation #C6 <core::int*>
   #C8 = static-tearoff self::_#F#named#tearOff
-  #C9 = instantiation self::B::_#named#tearOff <dynamic>
+  #C9 = instantiation #C6 <dynamic>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart
new file mode 100644
index 0000000..17b9e38
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef MyList<T extends num> = List<T>;
+
+main() {
+  const c1 = MyList<num>.filled;
+  const c2 = MyList<num>.filled;
+  const c3 = (MyList.filled)<num>;
+
+  const c4 = identical(c1, c2);
+  const c5 = identical(c1, c3);
+
+  expect(true, c4);
+  expect(false, c5);
+
+  expect(true, identical(c1, c2));
+  expect(false, identical(c1, c3));
+
+  var v1 = MyList<num>.filled;
+  var v2 = MyList<num>.filled;
+  var v3 = (MyList.filled)<num>;
+
+  var v4 = identical(v1, v2);
+  var v5 = identical(v1, v3);
+
+  expect(true, v4);
+  expect(false, v5);
+
+  expect(true, identical(v1, v2));
+  expect(false, identical(v1, v3));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect
new file mode 100644
index 0000000..672dbca
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num>
+  #C7 = null
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect
new file mode 100644
index 0000000..36b8a3e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::_List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num>
+  #C7 = null
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:18:16 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:19:17 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 52, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.textual_outline.expect
new file mode 100644
index 0000000..f4c644d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+typedef MyList<T extends num> = List<T>;
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f083298
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+expect(expected, actual) {}
+main() {}
+typedef MyList<T extends num> = List<T>;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.expect
new file mode 100644
index 0000000..2a6bd0b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num*>
+  #C7 = null
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.outline.expect
new file mode 100644
index 0000000..b89a67b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.outline.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.transformed.expect
new file mode 100644
index 0000000..9e2f5a1
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.transformed.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::_List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num*>
+  #C7 = null
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:18:16 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:19:17 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 52, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.expect
index 1970258..309b5f6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.expect
@@ -47,7 +47,7 @@
 
 typedef B<T extends core::num> = self::A<T>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -110,3 +110,7 @@
   return self::A::fact<self::_#B#fact#tearOff::T>();
 static method _#B#redirect#tearOff<T extends core::num>() → self::A<self::_#B#redirect#tearOff::T>
   return self::A::_#redirect#tearOff<self::_#B#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.transformed.expect
index 1970258..309b5f6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.strong.transformed.expect
@@ -47,7 +47,7 @@
 
 typedef B<T extends core::num> = self::A<T>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -110,3 +110,7 @@
   return self::A::fact<self::_#B#fact#tearOff::T>();
 static method _#B#redirect#tearOff<T extends core::num>() → self::A<self::_#B#redirect#tearOff::T>
   return self::A::_#redirect#tearOff<self::_#B#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.expect
index 1970258..309b5f6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.expect
@@ -47,7 +47,7 @@
 
 typedef B<T extends core::num> = self::A<T>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -110,3 +110,7 @@
   return self::A::fact<self::_#B#fact#tearOff::T>();
 static method _#B#redirect#tearOff<T extends core::num>() → self::A<self::_#B#redirect#tearOff::T>
   return self::A::_#redirect#tearOff<self::_#B#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.outline.expect
index ae23513..cfe8fea 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.outline.expect
@@ -34,3 +34,8 @@
   return self::A::fact<self::_#B#fact#tearOff::T>();
 static method _#B#redirect#tearOff<T extends core::num>() → self::A<self::_#B#redirect#tearOff::T>
   return self::A::_#redirect#tearOff<self::_#B#redirect#tearOff::T>();
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///misplaced_type_arguments.dart:5:7 -> ConstructorTearOffConstant(A.redirect)
+Extra constant evaluation: evaluated: 11, effectively constant: 1
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.transformed.expect
index 1970258..309b5f6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.transformed.expect
@@ -47,7 +47,7 @@
 
 typedef B<T extends core::num> = self::A<T>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
@@ -110,3 +110,7 @@
   return self::A::fact<self::_#B#fact#tearOff::T>();
 static method _#B#redirect#tearOff<T extends core::num>() → self::A<self::_#B#redirect#tearOff::T>
   return self::A::_#redirect#tearOff<self::_#B#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect
index cd54bc8..f19d273 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect
@@ -15,7 +15,7 @@
 
 class Class extends core::Object {
   static field () → self::Class field = () → self::Class => new self::Class::_();
-  static final field dynamic _redirecting# = <dynamic>[self::Class::a, self::Class::b]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor _() → self::Class
     : super core::Object::•()
     ;
@@ -35,3 +35,8 @@
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::a
+  #C2 = constructor-tearoff self::Class::b
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect
index cd54bc8..f19d273 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
 
 class Class extends core::Object {
   static field () → self::Class field = () → self::Class => new self::Class::_();
-  static final field dynamic _redirecting# = <dynamic>[self::Class::a, self::Class::b]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor _() → self::Class
     : super core::Object::•()
     ;
@@ -35,3 +35,8 @@
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::a
+  #C2 = constructor-tearoff self::Class::b
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect
index cd54bc8..f19d273 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect
@@ -15,7 +15,7 @@
 
 class Class extends core::Object {
   static field () → self::Class field = () → self::Class => new self::Class::_();
-  static final field dynamic _redirecting# = <dynamic>[self::Class::a, self::Class::b]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor _() → self::Class
     : super core::Object::•()
     ;
@@ -35,3 +35,8 @@
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::a
+  #C2 = constructor-tearoff self::Class::b
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect
index 173ec34..bc12784 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect
@@ -35,3 +35,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///missing_redirecting_target.dart:5:7 -> ConstructorTearOffConstant(Class.a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///missing_redirecting_target.dart:5:7 -> ConstructorTearOffConstant(Class.b)
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect
index cd54bc8..f19d273 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
 
 class Class extends core::Object {
   static field () → self::Class field = () → self::Class => new self::Class::_();
-  static final field dynamic _redirecting# = <dynamic>[self::Class::a, self::Class::b]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor _() → self::Class
     : super core::Object::•()
     ;
@@ -35,3 +35,8 @@
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::a
+  #C2 = constructor-tearoff self::Class::b
+}
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 168005c..4acef90 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -51,7 +51,7 @@
   constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
     : this self::Class::•(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C2]) → self::Class<self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
@@ -63,13 +63,13 @@
     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%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
-  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+  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);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -86,7 +86,7 @@
     return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -96,9 +96,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -123,23 +123,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
-  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
-  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
-  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int, core::String>
-  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int, core::String>
-  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int, core::String>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C5 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C6 = instantiation #C3 <core::int, core::String>
+  #C7 = instantiation #C4 <core::int, core::String>
+  #C8 = instantiation #C5 <core::int, core::String>
 }
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 3d96732..e793729 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -51,7 +51,7 @@
   constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
     : this self::Class::•(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C2]) → self::Class<self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
@@ -63,13 +63,13 @@
     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%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
-  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+  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);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -86,7 +86,7 @@
     return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -96,9 +96,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -123,23 +123,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
-  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
-  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
-  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int, core::String>
-  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int, core::String>
-  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int, core::String>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C5 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C6 = instantiation #C3 <core::int, core::String>
+  #C7 = instantiation #C4 <core::int, core::String>
+  #C8 = instantiation #C5 <core::int, core::String>
 }
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 54437d8..841838c 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -51,7 +51,7 @@
   constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
     : this self::Class::•(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C2]) → self::Class<self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
@@ -63,13 +63,13 @@
     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%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
-  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+  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);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -86,7 +86,7 @@
     return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -96,9 +96,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -123,23 +123,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
-  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
-  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
-  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int*, core::String*>
-  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int*, core::String*>
-  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int*, core::String*>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C5 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C6 = instantiation #C3 <core::int*, core::String*>
+  #C7 = instantiation #C4 <core::int*, core::String*>
+  #C8 = instantiation #C5 <core::int*, core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
index fbdc213..6aab2c5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
@@ -68,3 +68,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///named_mixin_application.dart:9:7 -> ConstructorTearOffConstant(Class.redirectingFactory)
+Extra constant evaluation: evaluated: 26, effectively constant: 1
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 9786626..742d873 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -51,7 +51,7 @@
   constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
     : this self::Class::•(field)
     ;
-  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C2]) → self::Class<self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
   static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
@@ -63,13 +63,13 @@
     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%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
-  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+  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);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -86,7 +86,7 @@
     return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -96,9 +96,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -123,23 +123,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
-  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
-  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
-  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int*, core::String*>
-  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int*, core::String*>
-  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int*, core::String*>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C5 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C6 = instantiation #C3 <core::int*, core::String*>
+  #C7 = instantiation #C4 <core::int*, core::String*>
+  #C8 = instantiation #C5 <core::int*, core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.expect
index b6e38f4..9d31f32 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.expect
@@ -89,20 +89,20 @@
 constants  {
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::B::_#new#tearOff
-  #C3 = instantiation self::B::_#new#tearOff <dynamic>
-  #C4 = instantiation self::B::_#new#tearOff <core::int>
+  #C3 = instantiation #C2 <dynamic>
+  #C4 = instantiation #C2 <core::int>
   #C5 = static-tearoff self::_#G3#new#tearOff
   #C6 = static-tearoff self::C::_#new#tearOff
-  #C7 = instantiation self::C::_#new#tearOff <dynamic, dynamic>
-  #C8 = instantiation self::C::_#new#tearOff <core::int, core::String>
+  #C7 = instantiation #C6 <dynamic, dynamic>
+  #C8 = instantiation #C6 <core::int, core::String>
   #C9 = static-tearoff self::_#H2#new#tearOff
-  #C10 = instantiation self::C::_#new#tearOff <core::int, core::int>
+  #C10 = instantiation #C6 <core::int, core::int>
   #C11 = static-tearoff self::_#H4#new#tearOff
-  #C12 = instantiation self::C::_#new#tearOff <core::String, core::int>
+  #C12 = instantiation #C6 <core::String, core::int>
   #C13 = static-tearoff self::_#H5#new#tearOff
   #C14 = static-tearoff self::_#H6#new#tearOff
   #C15 = static-tearoff self::D::_#new#tearOff
-  #C16 = instantiation self::D::_#new#tearOff <core::num>
-  #C17 = instantiation self::D::_#new#tearOff <core::int>
+  #C16 = instantiation #C15 <core::num>
+  #C17 = instantiation #C15 <core::int>
   #C18 = static-tearoff self::_#I3#new#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.transformed.expect
index b6e38f4..9d31f32 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.strong.transformed.expect
@@ -89,20 +89,20 @@
 constants  {
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::B::_#new#tearOff
-  #C3 = instantiation self::B::_#new#tearOff <dynamic>
-  #C4 = instantiation self::B::_#new#tearOff <core::int>
+  #C3 = instantiation #C2 <dynamic>
+  #C4 = instantiation #C2 <core::int>
   #C5 = static-tearoff self::_#G3#new#tearOff
   #C6 = static-tearoff self::C::_#new#tearOff
-  #C7 = instantiation self::C::_#new#tearOff <dynamic, dynamic>
-  #C8 = instantiation self::C::_#new#tearOff <core::int, core::String>
+  #C7 = instantiation #C6 <dynamic, dynamic>
+  #C8 = instantiation #C6 <core::int, core::String>
   #C9 = static-tearoff self::_#H2#new#tearOff
-  #C10 = instantiation self::C::_#new#tearOff <core::int, core::int>
+  #C10 = instantiation #C6 <core::int, core::int>
   #C11 = static-tearoff self::_#H4#new#tearOff
-  #C12 = instantiation self::C::_#new#tearOff <core::String, core::int>
+  #C12 = instantiation #C6 <core::String, core::int>
   #C13 = static-tearoff self::_#H5#new#tearOff
   #C14 = static-tearoff self::_#H6#new#tearOff
   #C15 = static-tearoff self::D::_#new#tearOff
-  #C16 = instantiation self::D::_#new#tearOff <core::num>
-  #C17 = instantiation self::D::_#new#tearOff <core::int>
+  #C16 = instantiation #C15 <core::num>
+  #C17 = instantiation #C15 <core::int>
   #C18 = static-tearoff self::_#I3#new#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.expect
index 2d72357..b2e567f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.expect
@@ -89,20 +89,20 @@
 constants  {
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::B::_#new#tearOff
-  #C3 = instantiation self::B::_#new#tearOff <dynamic>
-  #C4 = instantiation self::B::_#new#tearOff <core::int*>
+  #C3 = instantiation #C2 <dynamic>
+  #C4 = instantiation #C2 <core::int*>
   #C5 = static-tearoff self::_#G3#new#tearOff
   #C6 = static-tearoff self::C::_#new#tearOff
-  #C7 = instantiation self::C::_#new#tearOff <dynamic, dynamic>
-  #C8 = instantiation self::C::_#new#tearOff <core::int*, core::String*>
+  #C7 = instantiation #C6 <dynamic, dynamic>
+  #C8 = instantiation #C6 <core::int*, core::String*>
   #C9 = static-tearoff self::_#H2#new#tearOff
-  #C10 = instantiation self::C::_#new#tearOff <core::int*, core::int*>
+  #C10 = instantiation #C6 <core::int*, core::int*>
   #C11 = static-tearoff self::_#H4#new#tearOff
-  #C12 = instantiation self::C::_#new#tearOff <core::String*, core::int*>
+  #C12 = instantiation #C6 <core::String*, core::int*>
   #C13 = static-tearoff self::_#H5#new#tearOff
   #C14 = static-tearoff self::_#H6#new#tearOff
   #C15 = static-tearoff self::D::_#new#tearOff
-  #C16 = instantiation self::D::_#new#tearOff <core::num*>
-  #C17 = instantiation self::D::_#new#tearOff <core::int*>
+  #C16 = instantiation #C15 <core::num*>
+  #C17 = instantiation #C15 <core::int*>
   #C18 = static-tearoff self::_#I3#new#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.transformed.expect
index 2d72357..b2e567f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.transformed.expect
@@ -89,20 +89,20 @@
 constants  {
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::B::_#new#tearOff
-  #C3 = instantiation self::B::_#new#tearOff <dynamic>
-  #C4 = instantiation self::B::_#new#tearOff <core::int*>
+  #C3 = instantiation #C2 <dynamic>
+  #C4 = instantiation #C2 <core::int*>
   #C5 = static-tearoff self::_#G3#new#tearOff
   #C6 = static-tearoff self::C::_#new#tearOff
-  #C7 = instantiation self::C::_#new#tearOff <dynamic, dynamic>
-  #C8 = instantiation self::C::_#new#tearOff <core::int*, core::String*>
+  #C7 = instantiation #C6 <dynamic, dynamic>
+  #C8 = instantiation #C6 <core::int*, core::String*>
   #C9 = static-tearoff self::_#H2#new#tearOff
-  #C10 = instantiation self::C::_#new#tearOff <core::int*, core::int*>
+  #C10 = instantiation #C6 <core::int*, core::int*>
   #C11 = static-tearoff self::_#H4#new#tearOff
-  #C12 = instantiation self::C::_#new#tearOff <core::String*, core::int*>
+  #C12 = instantiation #C6 <core::String*, core::int*>
   #C13 = static-tearoff self::_#H5#new#tearOff
   #C14 = static-tearoff self::_#H6#new#tearOff
   #C15 = static-tearoff self::D::_#new#tearOff
-  #C16 = instantiation self::D::_#new#tearOff <core::num*>
-  #C17 = instantiation self::D::_#new#tearOff <core::int*>
+  #C16 = instantiation #C15 <core::num*>
+  #C17 = instantiation #C15 <core::int*>
   #C18 = static-tearoff self::_#I3#new#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect
index c74b167..214d583 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -58,7 +58,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -88,44 +88,44 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#_#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static method _#new#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#new#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#_#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#_#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -136,7 +136,7 @@
     return new self::Class7a::•();
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
@@ -154,7 +154,7 @@
     return self::Class8a::fact<self::Class8a::_#fact#tearOff::T%>();
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•, self::Class8b::fact]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9, #C10]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
@@ -171,23 +171,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C11;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C12;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C12;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C13;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -199,12 +199,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C13;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C14;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -215,9 +215,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C14;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C15;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -233,10 +233,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C15;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C16;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -264,16 +264,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C16;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C17;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C18;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -281,7 +281,7 @@
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
   self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C10;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C19;
   self::Class8b<dynamic> c8c = f8b<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -294,7 +294,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C11}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -309,15 +309,24 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = static-tearoff self::Class1::_#new#tearOff
-  #C3 = static-tearoff self::Class2::_#named#tearOff
-  #C4 = static-tearoff self::Class3::_#new#tearOff
-  #C5 = static-tearoff self::Class4::_#new#tearOff
-  #C6 = static-tearoff self::Class5::_#new#tearOff
-  #C7 = static-tearoff self::Class6::_#new#tearOff
-  #C8 = static-tearoff self::Class7b::_#new#tearOff
-  #C9 = static-tearoff self::Class8b::_#new#tearOff
-  #C10 = static-tearoff self::Class8b::_#fact#tearOff
-  #C11 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = constructor-tearoff self::Class8b::fact
+  #C11 = static-tearoff self::Class1::_#new#tearOff
+  #C12 = static-tearoff self::Class2::_#named#tearOff
+  #C13 = static-tearoff self::Class3::_#new#tearOff
+  #C14 = static-tearoff self::Class4::_#new#tearOff
+  #C15 = static-tearoff self::Class5::_#new#tearOff
+  #C16 = static-tearoff self::Class6::_#new#tearOff
+  #C17 = static-tearoff self::Class7b::_#new#tearOff
+  #C18 = static-tearoff self::Class8b::_#new#tearOff
+  #C19 = static-tearoff self::Class8b::_#fact#tearOff
+  #C20 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect
index 46d6ccc..dcb045d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -58,7 +58,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -88,44 +88,44 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#_#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static method _#new#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#new#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#_#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#_#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -136,7 +136,7 @@
     return new self::Class7a::•();
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
@@ -154,7 +154,7 @@
     return self::Class8a::fact<self::Class8a::_#fact#tearOff::T%>();
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•, self::Class8b::fact]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9, #C10]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
@@ -171,23 +171,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C11;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C12;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C12;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C13;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -199,12 +199,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C13;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C14;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -215,9 +215,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C14;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C15;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -233,10 +233,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C15;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C16;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -264,16 +264,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C16;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C17;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C18;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -281,7 +281,7 @@
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
   self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C10;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C19;
   self::Class8b<dynamic> c8c = f8b<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -294,7 +294,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C11}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -309,15 +309,24 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = static-tearoff self::Class1::_#new#tearOff
-  #C3 = static-tearoff self::Class2::_#named#tearOff
-  #C4 = static-tearoff self::Class3::_#new#tearOff
-  #C5 = static-tearoff self::Class4::_#new#tearOff
-  #C6 = static-tearoff self::Class5::_#new#tearOff
-  #C7 = static-tearoff self::Class6::_#new#tearOff
-  #C8 = static-tearoff self::Class7b::_#new#tearOff
-  #C9 = static-tearoff self::Class8b::_#new#tearOff
-  #C10 = static-tearoff self::Class8b::_#fact#tearOff
-  #C11 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = constructor-tearoff self::Class8b::fact
+  #C11 = static-tearoff self::Class1::_#new#tearOff
+  #C12 = static-tearoff self::Class2::_#named#tearOff
+  #C13 = static-tearoff self::Class3::_#new#tearOff
+  #C14 = static-tearoff self::Class4::_#new#tearOff
+  #C15 = static-tearoff self::Class5::_#new#tearOff
+  #C16 = static-tearoff self::Class6::_#new#tearOff
+  #C17 = static-tearoff self::Class7b::_#new#tearOff
+  #C18 = static-tearoff self::Class8b::_#new#tearOff
+  #C19 = static-tearoff self::Class8b::_#fact#tearOff
+  #C20 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect
index c74b167..214d583 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -58,7 +58,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -88,44 +88,44 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#_#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static method _#new#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#new#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#_#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#_#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -136,7 +136,7 @@
     return new self::Class7a::•();
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
@@ -154,7 +154,7 @@
     return self::Class8a::fact<self::Class8a::_#fact#tearOff::T%>();
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•, self::Class8b::fact]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9, #C10]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
@@ -171,23 +171,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C11;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C12;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C12;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C13;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -199,12 +199,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C13;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C14;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -215,9 +215,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C14;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C15;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -233,10 +233,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C15;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C16;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -264,16 +264,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C16;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C17;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C18;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -281,7 +281,7 @@
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
   self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C10;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C19;
   self::Class8b<dynamic> c8c = f8b<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -294,7 +294,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C11}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -309,15 +309,24 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = static-tearoff self::Class1::_#new#tearOff
-  #C3 = static-tearoff self::Class2::_#named#tearOff
-  #C4 = static-tearoff self::Class3::_#new#tearOff
-  #C5 = static-tearoff self::Class4::_#new#tearOff
-  #C6 = static-tearoff self::Class5::_#new#tearOff
-  #C7 = static-tearoff self::Class6::_#new#tearOff
-  #C8 = static-tearoff self::Class7b::_#new#tearOff
-  #C9 = static-tearoff self::Class8b::_#new#tearOff
-  #C10 = static-tearoff self::Class8b::_#fact#tearOff
-  #C11 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = constructor-tearoff self::Class8b::fact
+  #C11 = static-tearoff self::Class1::_#new#tearOff
+  #C12 = static-tearoff self::Class2::_#named#tearOff
+  #C13 = static-tearoff self::Class3::_#new#tearOff
+  #C14 = static-tearoff self::Class4::_#new#tearOff
+  #C15 = static-tearoff self::Class5::_#new#tearOff
+  #C16 = static-tearoff self::Class6::_#new#tearOff
+  #C17 = static-tearoff self::Class7b::_#new#tearOff
+  #C18 = static-tearoff self::Class8b::_#new#tearOff
+  #C19 = static-tearoff self::Class8b::_#fact#tearOff
+  #C20 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
index a5fb580..c867d2c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
@@ -124,3 +124,16 @@
   ;
 static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:13:7 -> ConstructorTearOffConstant(Class1.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:18:7 -> ConstructorTearOffConstant(Class2.named)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:46:7 -> ConstructorTearOffConstant(Class3.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:53:7 -> ConstructorTearOffConstant(Class4.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:60:7 -> ConstructorTearOffConstant(Class5.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:68:7 -> ConstructorTearOffConstant(Class6.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:82:7 -> ConstructorTearOffConstant(Class7b.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:91:7 -> ConstructorTearOffConstant(Class8b.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:91:7 -> ConstructorTearOffConstant(Class8b.fact)
+Extra constant evaluation: evaluated: 66, effectively constant: 9
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect
index 46d6ccc..dcb045d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -58,7 +58,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -88,44 +88,44 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#_#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
-  static method _#new#tearOff([core::int? field = #C1]) → self::Class4
+  static method _#new#tearOff([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#_#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
-  static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#_#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
-  static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -136,7 +136,7 @@
     return new self::Class7a::•();
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
@@ -154,7 +154,7 @@
     return self::Class8a::fact<self::Class8a::_#fact#tearOff::T%>();
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•, self::Class8b::fact]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9, #C10]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
@@ -171,23 +171,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C11;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C12;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C12;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C13;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -199,12 +199,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C13;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C14;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -215,9 +215,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C14;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C15;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -233,10 +233,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C15;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C16;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -264,16 +264,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C16;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C17;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C18;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -281,7 +281,7 @@
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
   self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
   self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C10;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C19;
   self::Class8b<dynamic> c8c = f8b<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8c is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -294,7 +294,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C11}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -309,15 +309,24 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = static-tearoff self::Class1::_#new#tearOff
-  #C3 = static-tearoff self::Class2::_#named#tearOff
-  #C4 = static-tearoff self::Class3::_#new#tearOff
-  #C5 = static-tearoff self::Class4::_#new#tearOff
-  #C6 = static-tearoff self::Class5::_#new#tearOff
-  #C7 = static-tearoff self::Class6::_#new#tearOff
-  #C8 = static-tearoff self::Class7b::_#new#tearOff
-  #C9 = static-tearoff self::Class8b::_#new#tearOff
-  #C10 = static-tearoff self::Class8b::_#fact#tearOff
-  #C11 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = constructor-tearoff self::Class8b::fact
+  #C11 = static-tearoff self::Class1::_#new#tearOff
+  #C12 = static-tearoff self::Class2::_#named#tearOff
+  #C13 = static-tearoff self::Class3::_#new#tearOff
+  #C14 = static-tearoff self::Class4::_#new#tearOff
+  #C15 = static-tearoff self::Class5::_#new#tearOff
+  #C16 = static-tearoff self::Class6::_#new#tearOff
+  #C17 = static-tearoff self::Class7b::_#new#tearOff
+  #C18 = static-tearoff self::Class8b::_#new#tearOff
+  #C19 = static-tearoff self::Class8b::_#fact#tearOff
+  #C20 = false
 }
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 c7984a5..8c398fe 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
@@ -17,28 +17,28 @@
 
 class Class1 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
-  constructor _([core::int field = #C1]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _([core::int field = #C2]) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int field = #C1]) → self::Class1
+  static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C2]) → self::Class1
+  static factory •([core::int field = #C3]) → self::Class1
     return new self::Class1::_(field);
-  static method _#new#tearOff([core::int field = #C1]) → self::Class1
+  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>[self::Class2::•]/*isLegacy*/;
-  constructor _({core::int field = #C1}) → self::Class2
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff({core::int field = #C1}) → self::Class2
+  static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C2}) → self::Class2
+  static factory •({core::int field = #C3}) → self::Class2
     return new self::Class2::_(field: field);
-  static method _#new#tearOff({core::int field = #C1}) → self::Class2
+  static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C3;
+  ([core::int]) → self::Class1 f1a = #C5;
   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 = #C3;
+  dynamic f1b = #C5;
   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 = #C4;
+  ({field: core::int}) → self::Class2 f2a = #C6;
   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 = #C4;
+  dynamic f2b = #C6;
   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 = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -101,9 +101,11 @@
 }
 
 constants  {
-  #C1 = 42
-  #C2 = null
-  #C3 = static-tearoff self::Class1::_#new#tearOff
-  #C4 = static-tearoff self::Class2::_#new#tearOff
-  #C5 = false
+  #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
 }
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 9f46561..cc59901 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
@@ -17,28 +17,28 @@
 
 class Class1 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
-  constructor _([core::int field = #C1]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _([core::int field = #C2]) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int field = #C1]) → self::Class1
+  static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C2]) → self::Class1
+  static factory •([core::int field = #C3]) → self::Class1
     return new self::Class1::_(field);
-  static method _#new#tearOff([core::int field = #C1]) → self::Class1
+  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>[self::Class2::•]/*isLegacy*/;
-  constructor _({core::int field = #C1}) → self::Class2
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff({core::int field = #C1}) → self::Class2
+  static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C2}) → self::Class2
+  static factory •({core::int field = #C3}) → self::Class2
     return new self::Class2::_(field: field);
-  static method _#new#tearOff({core::int field = #C1}) → self::Class2
+  static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C3;
+  ([core::int]) → self::Class1 f1a = #C5;
   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 = #C3;
+  dynamic f1b = #C5;
   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 = #C4;
+  ({field: core::int}) → self::Class2 f2a = #C6;
   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 = #C4;
+  dynamic f2b = #C6;
   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 = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -101,9 +101,11 @@
 }
 
 constants  {
-  #C1 = 42
-  #C2 = null
-  #C3 = static-tearoff self::Class1::_#new#tearOff
-  #C4 = static-tearoff self::Class2::_#new#tearOff
-  #C5 = false
+  #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
 }
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 c7984a5..8c398fe 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
@@ -17,28 +17,28 @@
 
 class Class1 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
-  constructor _([core::int field = #C1]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _([core::int field = #C2]) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int field = #C1]) → self::Class1
+  static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C2]) → self::Class1
+  static factory •([core::int field = #C3]) → self::Class1
     return new self::Class1::_(field);
-  static method _#new#tearOff([core::int field = #C1]) → self::Class1
+  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>[self::Class2::•]/*isLegacy*/;
-  constructor _({core::int field = #C1}) → self::Class2
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff({core::int field = #C1}) → self::Class2
+  static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C2}) → self::Class2
+  static factory •({core::int field = #C3}) → self::Class2
     return new self::Class2::_(field: field);
-  static method _#new#tearOff({core::int field = #C1}) → self::Class2
+  static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C3;
+  ([core::int]) → self::Class1 f1a = #C5;
   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 = #C3;
+  dynamic f1b = #C5;
   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 = #C4;
+  ({field: core::int}) → self::Class2 f2a = #C6;
   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 = #C4;
+  dynamic f2b = #C6;
   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 = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -101,9 +101,11 @@
 }
 
 constants  {
-  #C1 = 42
-  #C2 = null
-  #C3 = static-tearoff self::Class1::_#new#tearOff
-  #C4 = static-tearoff self::Class2::_#new#tearOff
-  #C5 = false
+  #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
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
index 1cd9ef2..20f744e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
@@ -35,3 +35,9 @@
   ;
 static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values.dart:12:7 -> ConstructorTearOffConstant(Class1.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values.dart:19:7 -> ConstructorTearOffConstant(Class2.)
+Extra constant evaluation: evaluated: 16, effectively constant: 2
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 9f46561..cc59901 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
@@ -17,28 +17,28 @@
 
 class Class1 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
-  constructor _([core::int field = #C1]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _([core::int field = #C2]) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff([core::int field = #C1]) → self::Class1
+  static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C2]) → self::Class1
+  static factory •([core::int field = #C3]) → self::Class1
     return new self::Class1::_(field);
-  static method _#new#tearOff([core::int field = #C1]) → self::Class1
+  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>[self::Class2::•]/*isLegacy*/;
-  constructor _({core::int field = #C1}) → self::Class2
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  static method _#_#tearOff({core::int field = #C1}) → self::Class2
+  static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C2}) → self::Class2
+  static factory •({core::int field = #C3}) → self::Class2
     return new self::Class2::_(field: field);
-  static method _#new#tearOff({core::int field = #C1}) → self::Class2
+  static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C3;
+  ([core::int]) → self::Class1 f1a = #C5;
   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 = #C3;
+  dynamic f1b = #C5;
   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 = #C4;
+  ({field: core::int}) → self::Class2 f2a = #C6;
   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 = #C4;
+  dynamic f2b = #C6;
   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 = #C5}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -101,9 +101,11 @@
 }
 
 constants  {
-  #C1 = 42
-  #C2 = null
-  #C3 = static-tearoff self::Class1::_#new#tearOff
-  #C4 = static-tearoff self::Class2::_#new#tearOff
-  #C5 = false
+  #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
 }
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 c019108..aa8c2df 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
@@ -43,44 +43,44 @@
 class Class1 extends core::Object {
   final field core::int field1;
   final field core::int field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::redirectPositionalSame, self::Class1::redirectPositionalFewer1, self::Class1::redirectPositionalFewer2, self::Class1::redirectNamedSame, self::Class1::redirectNamedReorder, self::Class1::redirectNamedFewer1, self::Class1::redirectNamedFewer2, self::Class1::redirectNamedFewer3]/*isLegacy*/;
-  constructor positional([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8]/*isLegacy*/;
+  constructor positional([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  constructor named({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  constructor named({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3, core::int field2 = #C3]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
     return new self::Class1::positional(field1);
-  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
+  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
     return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
-  static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field1 = #C3}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
+  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 = #C3}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
+  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2);
-  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
+  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
     return new self::Class1::named();
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C4;
+  ([core::int, core::int]) → self::Class1 f1a = #C12;
   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 = #C5;
+  ([core::int]) → self::Class1 f1b = #C13;
   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 = #C6;
+  () → self::Class1 f1c = #C14;
   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 = #C7;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
   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 = #C8;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
   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 = #C9;
+  ({field1: core::int}) → self::Class1 f2c = #C17;
   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 = #C10;
+  ({field2: core::int}) → self::Class1 f2d = #C18;
   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 = #C11;
+  () → self::Class1 f2e = #C19;
   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 = #C12}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -221,16 +221,24 @@
 }
 
 constants  {
-  #C1 = 1
-  #C2 = 2
-  #C3 = null
-  #C4 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C5 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C6 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C7 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C8 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C9 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C10 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C11 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C12 = false
+  #C1 = constructor-tearoff self::Class1::redirectPositionalSame
+  #C2 = constructor-tearoff self::Class1::redirectPositionalFewer1
+  #C3 = constructor-tearoff self::Class1::redirectPositionalFewer2
+  #C4 = constructor-tearoff self::Class1::redirectNamedSame
+  #C5 = constructor-tearoff self::Class1::redirectNamedReorder
+  #C6 = constructor-tearoff self::Class1::redirectNamedFewer1
+  #C7 = constructor-tearoff self::Class1::redirectNamedFewer2
+  #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
 }
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 ffa443b..aa4af4d 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
@@ -43,44 +43,44 @@
 class Class1 extends core::Object {
   final field core::int field1;
   final field core::int field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::redirectPositionalSame, self::Class1::redirectPositionalFewer1, self::Class1::redirectPositionalFewer2, self::Class1::redirectNamedSame, self::Class1::redirectNamedReorder, self::Class1::redirectNamedFewer1, self::Class1::redirectNamedFewer2, self::Class1::redirectNamedFewer3]/*isLegacy*/;
-  constructor positional([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8]/*isLegacy*/;
+  constructor positional([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  constructor named({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  constructor named({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3, core::int field2 = #C3]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
     return new self::Class1::positional(field1);
-  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
+  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
     return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
-  static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field1 = #C3}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
+  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 = #C3}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
+  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2);
-  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
+  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
     return new self::Class1::named();
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C4;
+  ([core::int, core::int]) → self::Class1 f1a = #C12;
   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 = #C5;
+  ([core::int]) → self::Class1 f1b = #C13;
   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 = #C6;
+  () → self::Class1 f1c = #C14;
   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 = #C7;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
   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 = #C8;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
   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 = #C9;
+  ({field1: core::int}) → self::Class1 f2c = #C17;
   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 = #C10;
+  ({field2: core::int}) → self::Class1 f2d = #C18;
   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 = #C11;
+  () → self::Class1 f2e = #C19;
   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 = #C12}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -221,16 +221,24 @@
 }
 
 constants  {
-  #C1 = 1
-  #C2 = 2
-  #C3 = null
-  #C4 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C5 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C6 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C7 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C8 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C9 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C10 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C11 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C12 = false
+  #C1 = constructor-tearoff self::Class1::redirectPositionalSame
+  #C2 = constructor-tearoff self::Class1::redirectPositionalFewer1
+  #C3 = constructor-tearoff self::Class1::redirectPositionalFewer2
+  #C4 = constructor-tearoff self::Class1::redirectNamedSame
+  #C5 = constructor-tearoff self::Class1::redirectNamedReorder
+  #C6 = constructor-tearoff self::Class1::redirectNamedFewer1
+  #C7 = constructor-tearoff self::Class1::redirectNamedFewer2
+  #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
 }
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 c019108..aa8c2df 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
@@ -43,44 +43,44 @@
 class Class1 extends core::Object {
   final field core::int field1;
   final field core::int field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::redirectPositionalSame, self::Class1::redirectPositionalFewer1, self::Class1::redirectPositionalFewer2, self::Class1::redirectNamedSame, self::Class1::redirectNamedReorder, self::Class1::redirectNamedFewer1, self::Class1::redirectNamedFewer2, self::Class1::redirectNamedFewer3]/*isLegacy*/;
-  constructor positional([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8]/*isLegacy*/;
+  constructor positional([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  constructor named({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  constructor named({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3, core::int field2 = #C3]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
     return new self::Class1::positional(field1);
-  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
+  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
     return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
-  static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field1 = #C3}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
+  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 = #C3}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
+  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2);
-  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
+  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
     return new self::Class1::named();
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C4;
+  ([core::int, core::int]) → self::Class1 f1a = #C12;
   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 = #C5;
+  ([core::int]) → self::Class1 f1b = #C13;
   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 = #C6;
+  () → self::Class1 f1c = #C14;
   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 = #C7;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
   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 = #C8;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
   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 = #C9;
+  ({field1: core::int}) → self::Class1 f2c = #C17;
   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 = #C10;
+  ({field2: core::int}) → self::Class1 f2d = #C18;
   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 = #C11;
+  () → self::Class1 f2e = #C19;
   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 = #C12}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -221,16 +221,24 @@
 }
 
 constants  {
-  #C1 = 1
-  #C2 = 2
-  #C3 = null
-  #C4 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C5 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C6 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C7 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C8 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C9 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C10 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C11 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C12 = false
+  #C1 = constructor-tearoff self::Class1::redirectPositionalSame
+  #C2 = constructor-tearoff self::Class1::redirectPositionalFewer1
+  #C3 = constructor-tearoff self::Class1::redirectPositionalFewer2
+  #C4 = constructor-tearoff self::Class1::redirectNamedSame
+  #C5 = constructor-tearoff self::Class1::redirectNamedReorder
+  #C6 = constructor-tearoff self::Class1::redirectNamedFewer1
+  #C7 = constructor-tearoff self::Class1::redirectNamedFewer2
+  #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
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
index c33110b..7cf24c4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
@@ -56,3 +56,15 @@
   ;
 static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectPositionalSame)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectPositionalFewer1)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectPositionalFewer2)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectNamedSame)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectNamedReorder)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectNamedFewer1)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectNamedFewer2)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off_default_values_complex.dart:12:7 -> ConstructorTearOffConstant(Class1.redirectNamedFewer3)
+Extra constant evaluation: evaluated: 49, effectively constant: 8
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 ffa443b..aa4af4d 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
@@ -43,44 +43,44 @@
 class Class1 extends core::Object {
   final field core::int field1;
   final field core::int field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::redirectPositionalSame, self::Class1::redirectPositionalFewer1, self::Class1::redirectPositionalFewer2, self::Class1::redirectNamedSame, self::Class1::redirectNamedReorder, self::Class1::redirectNamedFewer1, self::Class1::redirectNamedFewer2, self::Class1::redirectNamedFewer3]/*isLegacy*/;
-  constructor positional([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8]/*isLegacy*/;
+  constructor positional([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  constructor named({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  constructor named({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
     ;
-  static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3, core::int field2 = #C3]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
+  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 = #C3]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
     return new self::Class1::positional(field1);
-  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
+  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
     return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
-  static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
+  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 = #C3, core::int field1 = #C3}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
+  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 = #C3}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
+  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
     return new self::Class1::named(field2: field2);
-  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
+  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
     return new self::Class1::named();
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C4;
+  ([core::int, core::int]) → self::Class1 f1a = #C12;
   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 = #C5;
+  ([core::int]) → self::Class1 f1b = #C13;
   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 = #C6;
+  () → self::Class1 f1c = #C14;
   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 = #C7;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
   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 = #C8;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
   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 = #C9;
+  ({field1: core::int}) → self::Class1 f2c = #C17;
   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 = #C10;
+  ({field2: core::int}) → self::Class1 f2d = #C18;
   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 = #C11;
+  () → self::Class1 f2e = #C19;
   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 = #C12}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -221,16 +221,24 @@
 }
 
 constants  {
-  #C1 = 1
-  #C2 = 2
-  #C3 = null
-  #C4 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C5 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C6 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C7 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C8 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C9 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C10 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C11 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C12 = false
+  #C1 = constructor-tearoff self::Class1::redirectPositionalSame
+  #C2 = constructor-tearoff self::Class1::redirectPositionalFewer1
+  #C3 = constructor-tearoff self::Class1::redirectPositionalFewer2
+  #C4 = constructor-tearoff self::Class1::redirectNamedSame
+  #C5 = constructor-tearoff self::Class1::redirectNamedReorder
+  #C6 = constructor-tearoff self::Class1::redirectNamedFewer1
+  #C7 = constructor-tearoff self::Class1::redirectNamedFewer2
+  #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
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.expect
index 3f74e4e..01b742d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.expect
@@ -7,20 +7,20 @@
 part typedef_from_part.dart;
 typedef B<S extends core::Object? = dynamic> = self::Class<S%, core::int>;
 class Class<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
-  constructor named(self::Class::S% a, [self::Class::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::S%, self::Class::T%>
+  constructor named(self::Class::S% a, [self::Class::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
   static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
-  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
+  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
-  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
     return new self::Class::named<self::Class::fact::S%, self::Class::fact::T%>(a, b, c);
-  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
+  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::redirect::S% a) → self::Class<self::Class::redirect::S%, self::Class::redirect::T%>
     return new self::Class::named<self::Class::redirect::S%, self::Class::redirect::T%>(a);
@@ -28,10 +28,10 @@
     return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C3;
-  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C4;
-  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C5;
-  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C6;
+  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C4;
+  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C5;
+  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C6;
+  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C7;
   aNew<core::String>("", ""){(core::String, core::String) → self::Class<core::String, core::String>};
   aNew<core::int>(0, ""){(core::int, core::String) → self::Class<core::int, core::String>};
   aNamed<core::String>(""){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
@@ -56,10 +56,10 @@
   aFactInst(true, c: 87){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aFactInst(false, c: 87, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aRedirectInst(true){(core::bool) → self::Class<core::bool, core::String>};
-  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C7;
-  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C8;
-  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C9;
-  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C10;
+  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C8;
+  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C9;
+  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C10;
+  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C11;
   bNew<core::String>("", 0){(core::String, core::int) → self::Class<core::String, core::int>};
   bNew<core::int>(0, 0){(core::int, core::int) → self::Class<core::int, core::int>};
   bNamed<core::String>(""){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
@@ -87,9 +87,9 @@
 }
 static method _#B#new#tearOff<S extends core::Object? = dynamic>(self::_#B#new#tearOff::S% a, core::int b) → self::Class<self::_#B#new#tearOff::S%, core::int>
   return new self::Class::•<self::_#B#new#tearOff::S%, core::int>(a, b);
-static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C1, core::int c = #C2]) → self::Class<self::_#B#named#tearOff::S%, core::int>
+static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C2, core::int c = #C3]) → self::Class<self::_#B#named#tearOff::S%, core::int>
   return new self::Class::named<self::_#B#named#tearOff::S%, core::int>(a, b, c);
-static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C1, core::int c = #C2}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
+static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C2, core::int c = #C3}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
   return self::Class::fact<self::_#B#fact#tearOff::S%, core::int>(a, b: b, c: c);
 static method _#B#redirect#tearOff<S extends core::Object? = dynamic>(self::_#B#redirect#tearOff::S% a) → self::Class<self::_#B#redirect#tearOff::S%, core::int>
   return self::Class::_#redirect#tearOff<self::_#B#redirect#tearOff::S%, core::int>(a);
@@ -104,22 +104,23 @@
 typedef A<T extends core::Object? = dynamic> = self::Class<T%, core::String>;
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#new#tearOff<T extends core::Object? = dynamic>(self2::_#A#new#tearOff::T% a, core::String b) → self::Class<self2::_#A#new#tearOff::T%, core::String>
   return new self::Class::•<self2::_#A#new#tearOff::T%, core::String>(a, b);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C1, core::int c = #C2]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C2, core::int c = #C3]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
   return new self::Class::named<self2::_#A#named#tearOff::T%, core::String>(a, b, c);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C1, core::int c = #C2}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C2, core::int c = #C3}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
   return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
   return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);
 
 constants  {
-  #C1 = null
-  #C2 = 42
-  #C3 = static-tearoff self2::_#A#new#tearOff
-  #C4 = static-tearoff self2::_#A#named#tearOff
-  #C5 = static-tearoff self2::_#A#fact#tearOff
-  #C6 = static-tearoff self2::_#A#redirect#tearOff
-  #C7 = static-tearoff self::_#B#new#tearOff
-  #C8 = static-tearoff self::_#B#named#tearOff
-  #C9 = static-tearoff self::_#B#fact#tearOff
-  #C10 = static-tearoff self::_#B#redirect#tearOff
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = null
+  #C3 = 42
+  #C4 = static-tearoff self2::_#A#new#tearOff
+  #C5 = static-tearoff self2::_#A#named#tearOff
+  #C6 = static-tearoff self2::_#A#fact#tearOff
+  #C7 = static-tearoff self2::_#A#redirect#tearOff
+  #C8 = static-tearoff self::_#B#new#tearOff
+  #C9 = static-tearoff self::_#B#named#tearOff
+  #C10 = static-tearoff self::_#B#fact#tearOff
+  #C11 = static-tearoff self::_#B#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.transformed.expect
index 3f74e4e..01b742d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.transformed.expect
@@ -7,20 +7,20 @@
 part typedef_from_part.dart;
 typedef B<S extends core::Object? = dynamic> = self::Class<S%, core::int>;
 class Class<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
-  constructor named(self::Class::S% a, [self::Class::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::S%, self::Class::T%>
+  constructor named(self::Class::S% a, [self::Class::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
   static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
-  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
+  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
-  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
     return new self::Class::named<self::Class::fact::S%, self::Class::fact::T%>(a, b, c);
-  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
+  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::redirect::S% a) → self::Class<self::Class::redirect::S%, self::Class::redirect::T%>
     return new self::Class::named<self::Class::redirect::S%, self::Class::redirect::T%>(a);
@@ -28,10 +28,10 @@
     return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C3;
-  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C4;
-  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C5;
-  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C6;
+  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C4;
+  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C5;
+  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C6;
+  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C7;
   aNew<core::String>("", ""){(core::String, core::String) → self::Class<core::String, core::String>};
   aNew<core::int>(0, ""){(core::int, core::String) → self::Class<core::int, core::String>};
   aNamed<core::String>(""){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
@@ -56,10 +56,10 @@
   aFactInst(true, c: 87){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aFactInst(false, c: 87, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aRedirectInst(true){(core::bool) → self::Class<core::bool, core::String>};
-  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C7;
-  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C8;
-  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C9;
-  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C10;
+  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C8;
+  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C9;
+  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C10;
+  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C11;
   bNew<core::String>("", 0){(core::String, core::int) → self::Class<core::String, core::int>};
   bNew<core::int>(0, 0){(core::int, core::int) → self::Class<core::int, core::int>};
   bNamed<core::String>(""){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
@@ -87,9 +87,9 @@
 }
 static method _#B#new#tearOff<S extends core::Object? = dynamic>(self::_#B#new#tearOff::S% a, core::int b) → self::Class<self::_#B#new#tearOff::S%, core::int>
   return new self::Class::•<self::_#B#new#tearOff::S%, core::int>(a, b);
-static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C1, core::int c = #C2]) → self::Class<self::_#B#named#tearOff::S%, core::int>
+static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C2, core::int c = #C3]) → self::Class<self::_#B#named#tearOff::S%, core::int>
   return new self::Class::named<self::_#B#named#tearOff::S%, core::int>(a, b, c);
-static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C1, core::int c = #C2}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
+static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C2, core::int c = #C3}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
   return self::Class::fact<self::_#B#fact#tearOff::S%, core::int>(a, b: b, c: c);
 static method _#B#redirect#tearOff<S extends core::Object? = dynamic>(self::_#B#redirect#tearOff::S% a) → self::Class<self::_#B#redirect#tearOff::S%, core::int>
   return self::Class::_#redirect#tearOff<self::_#B#redirect#tearOff::S%, core::int>(a);
@@ -104,22 +104,23 @@
 typedef A<T extends core::Object? = dynamic> = self::Class<T%, core::String>;
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#new#tearOff<T extends core::Object? = dynamic>(self2::_#A#new#tearOff::T% a, core::String b) → self::Class<self2::_#A#new#tearOff::T%, core::String>
   return new self::Class::•<self2::_#A#new#tearOff::T%, core::String>(a, b);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C1, core::int c = #C2]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C2, core::int c = #C3]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
   return new self::Class::named<self2::_#A#named#tearOff::T%, core::String>(a, b, c);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C1, core::int c = #C2}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C2, core::int c = #C3}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
   return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
   return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);
 
 constants  {
-  #C1 = null
-  #C2 = 42
-  #C3 = static-tearoff self2::_#A#new#tearOff
-  #C4 = static-tearoff self2::_#A#named#tearOff
-  #C5 = static-tearoff self2::_#A#fact#tearOff
-  #C6 = static-tearoff self2::_#A#redirect#tearOff
-  #C7 = static-tearoff self::_#B#new#tearOff
-  #C8 = static-tearoff self::_#B#named#tearOff
-  #C9 = static-tearoff self::_#B#fact#tearOff
-  #C10 = static-tearoff self::_#B#redirect#tearOff
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = null
+  #C3 = 42
+  #C4 = static-tearoff self2::_#A#new#tearOff
+  #C5 = static-tearoff self2::_#A#named#tearOff
+  #C6 = static-tearoff self2::_#A#fact#tearOff
+  #C7 = static-tearoff self2::_#A#redirect#tearOff
+  #C8 = static-tearoff self::_#B#new#tearOff
+  #C9 = static-tearoff self::_#B#named#tearOff
+  #C10 = static-tearoff self::_#B#fact#tearOff
+  #C11 = static-tearoff self::_#B#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.expect
index 3f74e4e..01b742d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.expect
@@ -7,20 +7,20 @@
 part typedef_from_part.dart;
 typedef B<S extends core::Object? = dynamic> = self::Class<S%, core::int>;
 class Class<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
-  constructor named(self::Class::S% a, [self::Class::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::S%, self::Class::T%>
+  constructor named(self::Class::S% a, [self::Class::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
   static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
-  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
+  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
-  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
     return new self::Class::named<self::Class::fact::S%, self::Class::fact::T%>(a, b, c);
-  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
+  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::redirect::S% a) → self::Class<self::Class::redirect::S%, self::Class::redirect::T%>
     return new self::Class::named<self::Class::redirect::S%, self::Class::redirect::T%>(a);
@@ -28,10 +28,10 @@
     return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C3;
-  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C4;
-  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C5;
-  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C6;
+  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C4;
+  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C5;
+  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C6;
+  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C7;
   aNew<core::String>("", ""){(core::String, core::String) → self::Class<core::String, core::String>};
   aNew<core::int>(0, ""){(core::int, core::String) → self::Class<core::int, core::String>};
   aNamed<core::String>(""){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
@@ -56,10 +56,10 @@
   aFactInst(true, c: 87){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aFactInst(false, c: 87, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aRedirectInst(true){(core::bool) → self::Class<core::bool, core::String>};
-  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C7;
-  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C8;
-  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C9;
-  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C10;
+  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C8;
+  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C9;
+  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C10;
+  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C11;
   bNew<core::String>("", 0){(core::String, core::int) → self::Class<core::String, core::int>};
   bNew<core::int>(0, 0){(core::int, core::int) → self::Class<core::int, core::int>};
   bNamed<core::String>(""){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
@@ -87,9 +87,9 @@
 }
 static method _#B#new#tearOff<S extends core::Object? = dynamic>(self::_#B#new#tearOff::S% a, core::int b) → self::Class<self::_#B#new#tearOff::S%, core::int>
   return new self::Class::•<self::_#B#new#tearOff::S%, core::int>(a, b);
-static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C1, core::int c = #C2]) → self::Class<self::_#B#named#tearOff::S%, core::int>
+static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C2, core::int c = #C3]) → self::Class<self::_#B#named#tearOff::S%, core::int>
   return new self::Class::named<self::_#B#named#tearOff::S%, core::int>(a, b, c);
-static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C1, core::int c = #C2}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
+static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C2, core::int c = #C3}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
   return self::Class::fact<self::_#B#fact#tearOff::S%, core::int>(a, b: b, c: c);
 static method _#B#redirect#tearOff<S extends core::Object? = dynamic>(self::_#B#redirect#tearOff::S% a) → self::Class<self::_#B#redirect#tearOff::S%, core::int>
   return self::Class::_#redirect#tearOff<self::_#B#redirect#tearOff::S%, core::int>(a);
@@ -104,22 +104,23 @@
 typedef A<T extends core::Object? = dynamic> = self::Class<T%, core::String>;
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#new#tearOff<T extends core::Object? = dynamic>(self2::_#A#new#tearOff::T% a, core::String b) → self::Class<self2::_#A#new#tearOff::T%, core::String>
   return new self::Class::•<self2::_#A#new#tearOff::T%, core::String>(a, b);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C1, core::int c = #C2]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C2, core::int c = #C3]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
   return new self::Class::named<self2::_#A#named#tearOff::T%, core::String>(a, b, c);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C1, core::int c = #C2}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C2, core::int c = #C3}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
   return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
   return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);
 
 constants  {
-  #C1 = null
-  #C2 = 42
-  #C3 = static-tearoff self2::_#A#new#tearOff
-  #C4 = static-tearoff self2::_#A#named#tearOff
-  #C5 = static-tearoff self2::_#A#fact#tearOff
-  #C6 = static-tearoff self2::_#A#redirect#tearOff
-  #C7 = static-tearoff self::_#B#new#tearOff
-  #C8 = static-tearoff self::_#B#named#tearOff
-  #C9 = static-tearoff self::_#B#fact#tearOff
-  #C10 = static-tearoff self::_#B#redirect#tearOff
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = null
+  #C3 = 42
+  #C4 = static-tearoff self2::_#A#new#tearOff
+  #C5 = static-tearoff self2::_#A#named#tearOff
+  #C6 = static-tearoff self2::_#A#fact#tearOff
+  #C7 = static-tearoff self2::_#A#redirect#tearOff
+  #C8 = static-tearoff self::_#B#new#tearOff
+  #C9 = static-tearoff self::_#B#named#tearOff
+  #C10 = static-tearoff self::_#B#fact#tearOff
+  #C11 = static-tearoff self::_#B#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
index d0d9059..9f1b30a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
@@ -52,3 +52,8 @@
   return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
   return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///typedef_from.dart:75:7 -> ConstructorTearOffConstant(Class.redirect)
+Extra constant evaluation: evaluated: 43, effectively constant: 1
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.transformed.expect
index 3f74e4e..01b742d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.transformed.expect
@@ -7,20 +7,20 @@
 part typedef_from_part.dart;
 typedef B<S extends core::Object? = dynamic> = self::Class<S%, core::int>;
 class Class<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
-  constructor named(self::Class::S% a, [self::Class::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::S%, self::Class::T%>
+  constructor named(self::Class::S% a, [self::Class::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::S%, self::Class::T%>
     : super core::Object::•()
     ;
   static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
-  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C1, core::int c = #C2]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
+  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
     return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
-  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
     return new self::Class::named<self::Class::fact::S%, self::Class::fact::T%>(a, b, c);
-  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C1, core::int c = #C2}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
+  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::redirect::S% a) → self::Class<self::Class::redirect::S%, self::Class::redirect::T%>
     return new self::Class::named<self::Class::redirect::S%, self::Class::redirect::T%>(a);
@@ -28,10 +28,10 @@
     return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C3;
-  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C4;
-  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C5;
-  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C6;
+  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C4;
+  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C5;
+  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C6;
+  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C7;
   aNew<core::String>("", ""){(core::String, core::String) → self::Class<core::String, core::String>};
   aNew<core::int>(0, ""){(core::int, core::String) → self::Class<core::int, core::String>};
   aNamed<core::String>(""){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
@@ -56,10 +56,10 @@
   aFactInst(true, c: 87){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aFactInst(false, c: 87, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
   aRedirectInst(true){(core::bool) → self::Class<core::bool, core::String>};
-  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C7;
-  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C8;
-  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C9;
-  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C10;
+  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C8;
+  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C9;
+  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C10;
+  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C11;
   bNew<core::String>("", 0){(core::String, core::int) → self::Class<core::String, core::int>};
   bNew<core::int>(0, 0){(core::int, core::int) → self::Class<core::int, core::int>};
   bNamed<core::String>(""){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
@@ -87,9 +87,9 @@
 }
 static method _#B#new#tearOff<S extends core::Object? = dynamic>(self::_#B#new#tearOff::S% a, core::int b) → self::Class<self::_#B#new#tearOff::S%, core::int>
   return new self::Class::•<self::_#B#new#tearOff::S%, core::int>(a, b);
-static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C1, core::int c = #C2]) → self::Class<self::_#B#named#tearOff::S%, core::int>
+static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C2, core::int c = #C3]) → self::Class<self::_#B#named#tearOff::S%, core::int>
   return new self::Class::named<self::_#B#named#tearOff::S%, core::int>(a, b, c);
-static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C1, core::int c = #C2}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
+static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C2, core::int c = #C3}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
   return self::Class::fact<self::_#B#fact#tearOff::S%, core::int>(a, b: b, c: c);
 static method _#B#redirect#tearOff<S extends core::Object? = dynamic>(self::_#B#redirect#tearOff::S% a) → self::Class<self::_#B#redirect#tearOff::S%, core::int>
   return self::Class::_#redirect#tearOff<self::_#B#redirect#tearOff::S%, core::int>(a);
@@ -104,22 +104,23 @@
 typedef A<T extends core::Object? = dynamic> = self::Class<T%, core::String>;
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#new#tearOff<T extends core::Object? = dynamic>(self2::_#A#new#tearOff::T% a, core::String b) → self::Class<self2::_#A#new#tearOff::T%, core::String>
   return new self::Class::•<self2::_#A#new#tearOff::T%, core::String>(a, b);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C1, core::int c = #C2]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C2, core::int c = #C3]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
   return new self::Class::named<self2::_#A#named#tearOff::T%, core::String>(a, b, c);
-static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C1, core::int c = #C2}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C2, core::int c = #C3}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
   return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
 static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
   return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);
 
 constants  {
-  #C1 = null
-  #C2 = 42
-  #C3 = static-tearoff self2::_#A#new#tearOff
-  #C4 = static-tearoff self2::_#A#named#tearOff
-  #C5 = static-tearoff self2::_#A#fact#tearOff
-  #C6 = static-tearoff self2::_#A#redirect#tearOff
-  #C7 = static-tearoff self::_#B#new#tearOff
-  #C8 = static-tearoff self::_#B#named#tearOff
-  #C9 = static-tearoff self::_#B#fact#tearOff
-  #C10 = static-tearoff self::_#B#redirect#tearOff
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = null
+  #C3 = 42
+  #C4 = static-tearoff self2::_#A#new#tearOff
+  #C5 = static-tearoff self2::_#A#named#tearOff
+  #C6 = static-tearoff self2::_#A#fact#tearOff
+  #C7 = static-tearoff self2::_#A#redirect#tearOff
+  #C8 = static-tearoff self::_#B#new#tearOff
+  #C9 = static-tearoff self::_#B#named#tearOff
+  #C10 = static-tearoff self::_#B#fact#tearOff
+  #C11 = static-tearoff self::_#B#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect
index 90eb13b..402ad31 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → mai::A<mai::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field dynamic F_named_lib = #C6;
 static field dynamic F_fact_lib = #C7;
 static field dynamic F_redirect_lib = #C8;
-static field dynamic G_new_lib = #C11;
-static field dynamic G_named_lib = #C12;
-static field dynamic G_fact_lib = #C13;
-static field dynamic G_redirect_lib = #C14;
+static field dynamic G_new_lib = #C12;
+static field dynamic G_named_lib = #C13;
+static field dynamic G_fact_lib = #C14;
+static field dynamic G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#F#new#tearOff::Y%>
   return new mai::A::•<mai::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<mai::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff mai::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff mai::_#G#new#tearOff
-  #C12 = static-tearoff mai::_#G#named#tearOff
-  #C13 = static-tearoff mai::_#G#fact#tearOff
-  #C14 = static-tearoff mai::_#G#redirect#tearOff
+  #C11 = constructor-tearoff mai::A::redirect
+  #C12 = static-tearoff mai::_#G#new#tearOff
+  #C13 = static-tearoff mai::_#G#named#tearOff
+  #C14 = static-tearoff mai::_#G#fact#tearOff
+  #C15 = static-tearoff mai::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect
index 90eb13b..402ad31 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → mai::A<mai::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field dynamic F_named_lib = #C6;
 static field dynamic F_fact_lib = #C7;
 static field dynamic F_redirect_lib = #C8;
-static field dynamic G_new_lib = #C11;
-static field dynamic G_named_lib = #C12;
-static field dynamic G_fact_lib = #C13;
-static field dynamic G_redirect_lib = #C14;
+static field dynamic G_new_lib = #C12;
+static field dynamic G_named_lib = #C13;
+static field dynamic G_fact_lib = #C14;
+static field dynamic G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#F#new#tearOff::Y%>
   return new mai::A::•<mai::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<mai::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff mai::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff mai::_#G#new#tearOff
-  #C12 = static-tearoff mai::_#G#named#tearOff
-  #C13 = static-tearoff mai::_#G#fact#tearOff
-  #C14 = static-tearoff mai::_#G#redirect#tearOff
+  #C11 = constructor-tearoff mai::A::redirect
+  #C12 = static-tearoff mai::_#G#new#tearOff
+  #C13 = static-tearoff mai::_#G#named#tearOff
+  #C14 = static-tearoff mai::_#G#fact#tearOff
+  #C15 = static-tearoff mai::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect
index 90eb13b..402ad31 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → mai::A<mai::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field dynamic F_named_lib = #C6;
 static field dynamic F_fact_lib = #C7;
 static field dynamic F_redirect_lib = #C8;
-static field dynamic G_new_lib = #C11;
-static field dynamic G_named_lib = #C12;
-static field dynamic G_fact_lib = #C13;
-static field dynamic G_redirect_lib = #C14;
+static field dynamic G_new_lib = #C12;
+static field dynamic G_named_lib = #C13;
+static field dynamic G_fact_lib = #C14;
+static field dynamic G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#F#new#tearOff::Y%>
   return new mai::A::•<mai::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<mai::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff mai::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff mai::_#G#new#tearOff
-  #C12 = static-tearoff mai::_#G#named#tearOff
-  #C13 = static-tearoff mai::_#G#fact#tearOff
-  #C14 = static-tearoff mai::_#G#redirect#tearOff
+  #C11 = constructor-tearoff mai::A::redirect
+  #C12 = static-tearoff mai::_#G#new#tearOff
+  #C13 = static-tearoff mai::_#G#named#tearOff
+  #C14 = static-tearoff mai::_#G#fact#tearOff
+  #C15 = static-tearoff mai::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
index 0e4f276..6e66217 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
@@ -34,7 +34,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → mai::A<mai::A::T%>
     ;
   constructor named(mai::A::T% a, [core::int? b]) → mai::A<mai::A::T%>
@@ -76,3 +76,7 @@
   return mai::A::fact<mai::_#G#fact#tearOff::Y%>(a, b: b, c: c);
 static method _#G#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#G#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<mai::_#G#redirect#tearOff::Y%>();
+
+constants  {
+  #C1 = constructor-tearoff mai::A::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect
index 90eb13b..402ad31 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[mai::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → mai::A<mai::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field dynamic F_named_lib = #C6;
 static field dynamic F_fact_lib = #C7;
 static field dynamic F_redirect_lib = #C8;
-static field dynamic G_new_lib = #C11;
-static field dynamic G_named_lib = #C12;
-static field dynamic G_fact_lib = #C13;
-static field dynamic G_redirect_lib = #C14;
+static field dynamic G_new_lib = #C12;
+static field dynamic G_named_lib = #C13;
+static field dynamic G_fact_lib = #C14;
+static field dynamic G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#F#new#tearOff::Y%>
   return new mai::A::•<mai::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<mai::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff mai::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff mai::_#G#new#tearOff
-  #C12 = static-tearoff mai::_#G#named#tearOff
-  #C13 = static-tearoff mai::_#G#fact#tearOff
-  #C14 = static-tearoff mai::_#G#redirect#tearOff
+  #C11 = constructor-tearoff mai::A::redirect
+  #C12 = static-tearoff mai::_#G#new#tearOff
+  #C13 = static-tearoff mai::_#G#named#tearOff
+  #C14 = static-tearoff mai::_#G#fact#tearOff
+  #C15 = static-tearoff mai::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect
index 81462df..6da94c4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[typ::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → typ::A<typ::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> F_named_lib = #C6;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> F_fact_lib = #C7;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_redirect_lib = #C8;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C11;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C12;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C13;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C12;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C13;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#F#new#tearOff::Y%>
   return new typ::A::•<typ::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<typ::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff typ::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff typ::_#G#new#tearOff
-  #C12 = static-tearoff typ::_#G#named#tearOff
-  #C13 = static-tearoff typ::_#G#fact#tearOff
-  #C14 = static-tearoff typ::_#G#redirect#tearOff
+  #C11 = constructor-tearoff typ::A::redirect
+  #C12 = static-tearoff typ::_#G#new#tearOff
+  #C13 = static-tearoff typ::_#G#named#tearOff
+  #C14 = static-tearoff typ::_#G#fact#tearOff
+  #C15 = static-tearoff typ::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect
index 81462df..6da94c4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[typ::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → typ::A<typ::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> F_named_lib = #C6;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> F_fact_lib = #C7;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_redirect_lib = #C8;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C11;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C12;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C13;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C12;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C13;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#F#new#tearOff::Y%>
   return new typ::A::•<typ::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<typ::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff typ::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff typ::_#G#new#tearOff
-  #C12 = static-tearoff typ::_#G#named#tearOff
-  #C13 = static-tearoff typ::_#G#fact#tearOff
-  #C14 = static-tearoff typ::_#G#redirect#tearOff
+  #C11 = constructor-tearoff typ::A::redirect
+  #C12 = static-tearoff typ::_#G#new#tearOff
+  #C13 = static-tearoff typ::_#G#named#tearOff
+  #C14 = static-tearoff typ::_#G#fact#tearOff
+  #C15 = static-tearoff typ::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect
index 81462df..6da94c4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[typ::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → typ::A<typ::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> F_named_lib = #C6;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> F_fact_lib = #C7;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_redirect_lib = #C8;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C11;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C12;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C13;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C12;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C13;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#F#new#tearOff::Y%>
   return new typ::A::•<typ::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<typ::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff typ::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff typ::_#G#new#tearOff
-  #C12 = static-tearoff typ::_#G#named#tearOff
-  #C13 = static-tearoff typ::_#G#fact#tearOff
-  #C14 = static-tearoff typ::_#G#redirect#tearOff
+  #C11 = constructor-tearoff typ::A::redirect
+  #C12 = static-tearoff typ::_#G#new#tearOff
+  #C13 = static-tearoff typ::_#G#named#tearOff
+  #C14 = static-tearoff typ::_#G#fact#tearOff
+  #C15 = static-tearoff typ::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
index b6ebfa4..2fdb0b1 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
@@ -76,3 +76,8 @@
   return typ::A::fact<typ::_#G#fact#tearOff::Y%>(a, b: b, c: c);
 static method _#G#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#G#redirect#tearOff::Y%>
   return typ::A::_#redirect#tearOff<typ::_#G#redirect#tearOff::Y%>();
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///typedef_identical_lib.dart:5:7 -> ConstructorTearOffConstant(A.redirect)
+Extra constant evaluation: evaluated: 39, effectively constant: 1
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect
index 81462df..6da94c4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect
@@ -84,7 +84,7 @@
 typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
 class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[typ::A::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
   constructor •() → typ::A<typ::A::T%>
     : super core::Object::•()
     ;
@@ -108,10 +108,10 @@
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> F_named_lib = #C6;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> F_fact_lib = #C7;
 static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_redirect_lib = #C8;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C11;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C12;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C13;
-static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C12;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C13;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C15;
 static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#F#new#tearOff::Y%>
   return new typ::A::•<typ::_#F#new#tearOff::Y%>();
 static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<typ::_#F#named#tearOff::Y%>
@@ -140,8 +140,9 @@
   #C8 = static-tearoff typ::_#F#redirect#tearOff
   #C9 = null
   #C10 = 42
-  #C11 = static-tearoff typ::_#G#new#tearOff
-  #C12 = static-tearoff typ::_#G#named#tearOff
-  #C13 = static-tearoff typ::_#G#fact#tearOff
-  #C14 = static-tearoff typ::_#G#redirect#tearOff
+  #C11 = constructor-tearoff typ::A::redirect
+  #C12 = static-tearoff typ::_#G#new#tearOff
+  #C13 = static-tearoff typ::_#G#named#tearOff
+  #C14 = static-tearoff typ::_#G#fact#tearOff
+  #C15 = static-tearoff typ::_#G#redirect#tearOff
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.expect
index 2e24a01..109a904 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.expect
@@ -319,11 +319,11 @@
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::_#DA2#new#tearOff
   #C3 = static-tearoff self::B::_#new#tearOff
-  #C4 = instantiation self::B::_#new#tearOff <core::String>
+  #C4 = instantiation #C3 <core::String>
   #C5 = static-tearoff self::B::_#foo#tearOff
-  #C6 = instantiation self::B::_#foo#tearOff <core::String>
+  #C6 = instantiation #C5 <core::String>
   #C7 = static-tearoff self::B::_#bar#tearOff
-  #C8 = instantiation self::B::_#bar#tearOff <core::String>
+  #C8 = instantiation #C7 <core::String>
   #C9 = static-tearoff self::_#DB2#new#tearOff
   #C10 = static-tearoff self::_#DB3#new#tearOff
   #C11 = false
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.transformed.expect
index 64496be..71410d3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.strong.transformed.expect
@@ -319,11 +319,11 @@
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::_#DA2#new#tearOff
   #C3 = static-tearoff self::B::_#new#tearOff
-  #C4 = instantiation self::B::_#new#tearOff <core::String>
+  #C4 = instantiation #C3 <core::String>
   #C5 = static-tearoff self::B::_#foo#tearOff
-  #C6 = instantiation self::B::_#foo#tearOff <core::String>
+  #C6 = instantiation #C5 <core::String>
   #C7 = static-tearoff self::B::_#bar#tearOff
-  #C8 = instantiation self::B::_#bar#tearOff <core::String>
+  #C8 = instantiation #C7 <core::String>
   #C9 = static-tearoff self::_#DB2#new#tearOff
   #C10 = static-tearoff self::_#DB3#new#tearOff
   #C11 = false
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.expect
index b0722a9..9e50e01 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.expect
@@ -319,11 +319,11 @@
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::_#DA2#new#tearOff
   #C3 = static-tearoff self::B::_#new#tearOff
-  #C4 = instantiation self::B::_#new#tearOff <core::String*>
+  #C4 = instantiation #C3 <core::String*>
   #C5 = static-tearoff self::B::_#foo#tearOff
-  #C6 = instantiation self::B::_#foo#tearOff <core::String*>
+  #C6 = instantiation #C5 <core::String*>
   #C7 = static-tearoff self::B::_#bar#tearOff
-  #C8 = instantiation self::B::_#bar#tearOff <core::String*>
+  #C8 = instantiation #C7 <core::String*>
   #C9 = static-tearoff self::_#DB2#new#tearOff
   #C10 = static-tearoff self::_#DB3#new#tearOff
   #C11 = false
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.transformed.expect
index 3242407..f1fcdc5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.transformed.expect
@@ -319,11 +319,11 @@
   #C1 = static-tearoff self::A::_#new#tearOff
   #C2 = static-tearoff self::_#DA2#new#tearOff
   #C3 = static-tearoff self::B::_#new#tearOff
-  #C4 = instantiation self::B::_#new#tearOff <core::String*>
+  #C4 = instantiation #C3 <core::String*>
   #C5 = static-tearoff self::B::_#foo#tearOff
-  #C6 = instantiation self::B::_#foo#tearOff <core::String*>
+  #C6 = instantiation #C5 <core::String*>
   #C7 = static-tearoff self::B::_#bar#tearOff
-  #C8 = instantiation self::B::_#bar#tearOff <core::String*>
+  #C8 = instantiation #C7 <core::String*>
   #C9 = static-tearoff self::_#DB2#new#tearOff
   #C10 = static-tearoff self::_#DB3#new#tearOff
   #C11 = 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 47537c5..713b894 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -59,7 +59,7 @@
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -70,7 +70,7 @@
     ;
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -80,9 +80,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -107,23 +107,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = constructor-tearoff self::NamedMixinApplication::•
-  #C3 = constructor-tearoff self::NamedMixinApplication::named
-  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
-  #C5 = instantiation self::NamedMixinApplication::• <core::int, core::String>
-  #C6 = instantiation self::NamedMixinApplication::named <core::int, core::String>
-  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int, core::String>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = constructor-tearoff self::NamedMixinApplication::•
+  #C4 = constructor-tearoff self::NamedMixinApplication::named
+  #C5 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C6 = instantiation #C3 <core::int, core::String>
+  #C7 = instantiation #C4 <core::int, core::String>
+  #C8 = instantiation #C5 <core::int, core::String>
 }
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 6e9a6ef..e1f62d1 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -59,7 +59,7 @@
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -70,7 +70,7 @@
     ;
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -80,9 +80,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -107,23 +107,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = constructor-tearoff self::NamedMixinApplication::•
-  #C3 = constructor-tearoff self::NamedMixinApplication::named
-  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
-  #C5 = instantiation self::NamedMixinApplication::• <core::int, core::String>
-  #C6 = instantiation self::NamedMixinApplication::named <core::int, core::String>
-  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int, core::String>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = constructor-tearoff self::NamedMixinApplication::•
+  #C4 = constructor-tearoff self::NamedMixinApplication::named
+  #C5 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C6 = instantiation #C3 <core::int, core::String>
+  #C7 = instantiation #C4 <core::int, core::String>
+  #C8 = instantiation #C5 <core::int, core::String>
 }
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 7db9ced..911cbda 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -59,7 +59,7 @@
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -70,7 +70,7 @@
     ;
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -80,9 +80,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -107,23 +107,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = constructor-tearoff self::NamedMixinApplication::•
-  #C3 = constructor-tearoff self::NamedMixinApplication::named
-  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
-  #C5 = instantiation self::NamedMixinApplication::• <core::int*, core::String*>
-  #C6 = instantiation self::NamedMixinApplication::named <core::int*, core::String*>
-  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int*, core::String*>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = constructor-tearoff self::NamedMixinApplication::•
+  #C4 = constructor-tearoff self::NamedMixinApplication::named
+  #C5 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C6 = instantiation #C3 <core::int*, core::String*>
+  #C7 = instantiation #C4 <core::int*, core::String*>
+  #C8 = instantiation #C5 <core::int*, core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
index 74af4ae..99e5f30 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
@@ -52,3 +52,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///named_mixin_application.dart:9:7 -> ConstructorTearOffConstant(Class.redirectingFactory)
+Extra constant evaluation: evaluated: 10, effectively constant: 1
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 9b266ff..ec985b8 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
@@ -41,8 +41,8 @@
 }
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
     : self::Class::field = field, super core::Object::•()
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
@@ -59,7 +59,7 @@
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -70,7 +70,7 @@
     ;
 }
 abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
-  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
     : super self::Class::•(field)
     ;
   synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
@@ -80,9 +80,9 @@
     : super self::Class::redirectingGenerative(field)
     ;
 }
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
   NamedMixinApplication.fact;
@@ -107,23 +107,24 @@
                                 ^^^^^^^^^^^^^^^^^^";
 }
 static method main() → dynamic {
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
-  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
-  #C5;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
   #C6;
   #C7;
+  #C8;
   ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
   (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
 }
 
 constants  {
-  #C1 = 0
-  #C2 = constructor-tearoff self::NamedMixinApplication::•
-  #C3 = constructor-tearoff self::NamedMixinApplication::named
-  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
-  #C5 = instantiation self::NamedMixinApplication::• <core::int*, core::String*>
-  #C6 = instantiation self::NamedMixinApplication::named <core::int*, core::String*>
-  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int*, core::String*>
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = constructor-tearoff self::NamedMixinApplication::•
+  #C4 = constructor-tearoff self::NamedMixinApplication::named
+  #C5 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C6 = instantiation #C3 <core::int*, core::String*>
+  #C7 = instantiation #C4 <core::int*, core::String*>
+  #C8 = instantiation #C5 <core::int*, core::String*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect
index 952cefe..9f6be91 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect
@@ -57,5 +57,5 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = static-tearoff self::A::bar1
+  #C4 = constructor-tearoff self::A::bar1
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect
index 952cefe..9f6be91 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect
@@ -57,5 +57,5 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = static-tearoff self::A::bar1
+  #C4 = constructor-tearoff self::A::bar1
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect
index 952cefe..9f6be91 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect
@@ -57,5 +57,5 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = static-tearoff self::A::bar1
+  #C4 = constructor-tearoff self::A::bar1
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect
index 952cefe..9f6be91 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect
@@ -57,5 +57,5 @@
   #C1 = constructor-tearoff self::A::foo1
   #C2 = constructor-tearoff self::A::foo2
   #C3 = constructor-tearoff self::A::•
-  #C4 = static-tearoff self::A::bar1
+  #C4 = constructor-tearoff self::A::bar1
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
index 5d000f0..22aef61 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
@@ -60,5 +60,5 @@
 constants  {
   #C1 = constructor-tearoff self::A::foo
   #C2 = constructor-tearoff self::A::•
-  #C3 = static-tearoff self::A::bar
+  #C3 = constructor-tearoff self::A::bar
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
index 5d000f0..22aef61 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
@@ -60,5 +60,5 @@
 constants  {
   #C1 = constructor-tearoff self::A::foo
   #C2 = constructor-tearoff self::A::•
-  #C3 = static-tearoff self::A::bar
+  #C3 = constructor-tearoff self::A::bar
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
index 5d000f0..22aef61 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
@@ -60,5 +60,5 @@
 constants  {
   #C1 = constructor-tearoff self::A::foo
   #C2 = constructor-tearoff self::A::•
-  #C3 = static-tearoff self::A::bar
+  #C3 = constructor-tearoff self::A::bar
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
index 5d000f0..22aef61 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
@@ -60,5 +60,5 @@
 constants  {
   #C1 = constructor-tearoff self::A::foo
   #C2 = constructor-tearoff self::A::•
-  #C3 = static-tearoff self::A::bar
+  #C3 = constructor-tearoff self::A::bar
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.expect
index ce55163..e0b61a8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.expect
@@ -59,8 +59,8 @@
 constants  {
   #C1 = static-tearoff self::UnresolvedClass
   #C2 = static-tearoff self::unresolved_prefix::UnresolvedClass
-  #C3 = instantiation self::UnresolvedClass <core::int>
-  #C4 = instantiation self::unresolved_prefix::UnresolvedClass <core::int>
+  #C3 = instantiation #C1 <core::int>
+  #C4 = instantiation #C2 <core::int>
   #C5 = static-tearoff self::resolved_prefix::UnresolvedClass
-  #C6 = instantiation self::resolved_prefix::UnresolvedClass <core::int>
+  #C6 = instantiation #C5 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.transformed.expect
index ce55163..e0b61a8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.strong.transformed.expect
@@ -59,8 +59,8 @@
 constants  {
   #C1 = static-tearoff self::UnresolvedClass
   #C2 = static-tearoff self::unresolved_prefix::UnresolvedClass
-  #C3 = instantiation self::UnresolvedClass <core::int>
-  #C4 = instantiation self::unresolved_prefix::UnresolvedClass <core::int>
+  #C3 = instantiation #C1 <core::int>
+  #C4 = instantiation #C2 <core::int>
   #C5 = static-tearoff self::resolved_prefix::UnresolvedClass
-  #C6 = instantiation self::resolved_prefix::UnresolvedClass <core::int>
+  #C6 = instantiation #C5 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.expect
index 07ba725..b3fb9eb 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.expect
@@ -59,8 +59,8 @@
 constants  {
   #C1 = static-tearoff self::UnresolvedClass
   #C2 = static-tearoff self::unresolved_prefix::UnresolvedClass
-  #C3 = instantiation self::UnresolvedClass <core::int*>
-  #C4 = instantiation self::unresolved_prefix::UnresolvedClass <core::int*>
+  #C3 = instantiation #C1 <core::int*>
+  #C4 = instantiation #C2 <core::int*>
   #C5 = static-tearoff self::resolved_prefix::UnresolvedClass
-  #C6 = instantiation self::resolved_prefix::UnresolvedClass <core::int*>
+  #C6 = instantiation #C5 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.transformed.expect
index 07ba725..b3fb9eb 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.transformed.expect
@@ -59,8 +59,8 @@
 constants  {
   #C1 = static-tearoff self::UnresolvedClass
   #C2 = static-tearoff self::unresolved_prefix::UnresolvedClass
-  #C3 = instantiation self::UnresolvedClass <core::int*>
-  #C4 = instantiation self::unresolved_prefix::UnresolvedClass <core::int*>
+  #C3 = instantiation #C1 <core::int*>
+  #C4 = instantiation #C2 <core::int*>
   #C5 = static-tearoff self::resolved_prefix::UnresolvedClass
-  #C6 = instantiation self::resolved_prefix::UnresolvedClass <core::int*>
+  #C6 = instantiation #C5 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
index 0ed236c..4e40f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -27,9 +27,9 @@
     ;
 }
 static method test() → dynamic {
-  () → self::A f1 = #C1;
-  () → self::A f2 = #C2;
-  () → self::A f3 = #C3;
+  () → self::A f1 = #C4;
+  () → self::A f2 = #C5;
+  () → self::A f3 = #C6;
   self::A x1 = f1(){() → self::A};
   self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
   self::A x3;
@@ -39,7 +39,10 @@
   return self::test();
 
 constants  {
-  #C1 = redirecting-factory-tearoff self::A::redirectingFactory
-  #C2 = redirecting-factory-tearoff self::A::redirectingFactoryChild
-  #C3 = redirecting-factory-tearoff self::A::redirectingTwice
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = constructor-tearoff self::A::redirectingTwice
+  #C4 = redirecting-factory-tearoff self::A::redirectingFactory
+  #C5 = redirecting-factory-tearoff self::A::redirectingFactoryChild
+  #C6 = redirecting-factory-tearoff self::A::redirectingTwice
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
index 0ed236c..4e40f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -27,9 +27,9 @@
     ;
 }
 static method test() → dynamic {
-  () → self::A f1 = #C1;
-  () → self::A f2 = #C2;
-  () → self::A f3 = #C3;
+  () → self::A f1 = #C4;
+  () → self::A f2 = #C5;
+  () → self::A f3 = #C6;
   self::A x1 = f1(){() → self::A};
   self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
   self::A x3;
@@ -39,7 +39,10 @@
   return self::test();
 
 constants  {
-  #C1 = redirecting-factory-tearoff self::A::redirectingFactory
-  #C2 = redirecting-factory-tearoff self::A::redirectingFactoryChild
-  #C3 = redirecting-factory-tearoff self::A::redirectingTwice
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = constructor-tearoff self::A::redirectingTwice
+  #C4 = redirecting-factory-tearoff self::A::redirectingFactory
+  #C5 = redirecting-factory-tearoff self::A::redirectingFactoryChild
+  #C6 = redirecting-factory-tearoff self::A::redirectingTwice
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
index 0ed236c..4e40f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -27,9 +27,9 @@
     ;
 }
 static method test() → dynamic {
-  () → self::A f1 = #C1;
-  () → self::A f2 = #C2;
-  () → self::A f3 = #C3;
+  () → self::A f1 = #C4;
+  () → self::A f2 = #C5;
+  () → self::A f3 = #C6;
   self::A x1 = f1(){() → self::A};
   self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
   self::A x3;
@@ -39,7 +39,10 @@
   return self::test();
 
 constants  {
-  #C1 = redirecting-factory-tearoff self::A::redirectingFactory
-  #C2 = redirecting-factory-tearoff self::A::redirectingFactoryChild
-  #C3 = redirecting-factory-tearoff self::A::redirectingTwice
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = constructor-tearoff self::A::redirectingTwice
+  #C4 = redirecting-factory-tearoff self::A::redirectingFactory
+  #C5 = redirecting-factory-tearoff self::A::redirectingFactoryChild
+  #C6 = redirecting-factory-tearoff self::A::redirectingTwice
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
index 0b5088f..91c4c77 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
@@ -21,3 +21,10 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_constructors.dart:5:7 -> ConstructorTearOffConstant(A.redirectingFactory)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_constructors.dart:5:7 -> ConstructorTearOffConstant(A.redirectingFactoryChild)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_constructors.dart:5:7 -> ConstructorTearOffConstant(A.redirectingTwice)
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
index 0ed236c..4e40f0b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -27,9 +27,9 @@
     ;
 }
 static method test() → dynamic {
-  () → self::A f1 = #C1;
-  () → self::A f2 = #C2;
-  () → self::A f3 = #C3;
+  () → self::A f1 = #C4;
+  () → self::A f2 = #C5;
+  () → self::A f3 = #C6;
   self::A x1 = f1(){() → self::A};
   self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
   self::A x3;
@@ -39,7 +39,10 @@
   return self::test();
 
 constants  {
-  #C1 = redirecting-factory-tearoff self::A::redirectingFactory
-  #C2 = redirecting-factory-tearoff self::A::redirectingFactoryChild
-  #C3 = redirecting-factory-tearoff self::A::redirectingTwice
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = constructor-tearoff self::A::redirectingTwice
+  #C4 = redirecting-factory-tearoff self::A::redirectingFactory
+  #C5 = redirecting-factory-tearoff self::A::redirectingFactoryChild
+  #C6 = redirecting-factory-tearoff self::A::redirectingTwice
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect
index 1ff3758..05e5e9d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -54,7 +54,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -65,7 +65,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -74,32 +74,32 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -108,7 +108,7 @@
     ;
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
 }
@@ -118,7 +118,7 @@
     ;
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
 }
@@ -129,23 +129,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C10;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C10;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C11;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C11;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C12;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -157,12 +157,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C12;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C13;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -173,9 +173,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C13;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C14;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -191,10 +191,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C14;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C15;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -222,16 +222,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C15;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C16;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C17;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -244,7 +244,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C18}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -259,14 +259,22 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = redirecting-factory-tearoff self::Class1::•
-  #C3 = redirecting-factory-tearoff self::Class2::named
-  #C4 = redirecting-factory-tearoff self::Class3::•
-  #C5 = redirecting-factory-tearoff self::Class4::•
-  #C6 = redirecting-factory-tearoff self::Class5::•
-  #C7 = redirecting-factory-tearoff self::Class6::•
-  #C8 = redirecting-factory-tearoff self::Class7b::•
-  #C9 = redirecting-factory-tearoff self::Class8b::•
-  #C10 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = redirecting-factory-tearoff self::Class1::•
+  #C11 = redirecting-factory-tearoff self::Class2::named
+  #C12 = redirecting-factory-tearoff self::Class3::•
+  #C13 = redirecting-factory-tearoff self::Class4::•
+  #C14 = redirecting-factory-tearoff self::Class5::•
+  #C15 = redirecting-factory-tearoff self::Class6::•
+  #C16 = redirecting-factory-tearoff self::Class7b::•
+  #C17 = redirecting-factory-tearoff self::Class8b::•
+  #C18 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect
index 83c7798..c321ab5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -54,7 +54,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -65,7 +65,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -74,32 +74,32 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -108,7 +108,7 @@
     ;
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
 }
@@ -118,7 +118,7 @@
     ;
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
 }
@@ -129,23 +129,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C10;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C10;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C11;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C11;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C12;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -157,12 +157,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C12;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C13;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -173,9 +173,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C13;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C14;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -191,10 +191,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C14;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C15;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -222,16 +222,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C15;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C16;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C17;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -244,7 +244,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C18}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -259,14 +259,22 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = redirecting-factory-tearoff self::Class1::•
-  #C3 = redirecting-factory-tearoff self::Class2::named
-  #C4 = redirecting-factory-tearoff self::Class3::•
-  #C5 = redirecting-factory-tearoff self::Class4::•
-  #C6 = redirecting-factory-tearoff self::Class5::•
-  #C7 = redirecting-factory-tearoff self::Class6::•
-  #C8 = redirecting-factory-tearoff self::Class7b::•
-  #C9 = redirecting-factory-tearoff self::Class8b::•
-  #C10 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = redirecting-factory-tearoff self::Class1::•
+  #C11 = redirecting-factory-tearoff self::Class2::named
+  #C12 = redirecting-factory-tearoff self::Class3::•
+  #C13 = redirecting-factory-tearoff self::Class4::•
+  #C14 = redirecting-factory-tearoff self::Class5::•
+  #C15 = redirecting-factory-tearoff self::Class6::•
+  #C16 = redirecting-factory-tearoff self::Class7b::•
+  #C17 = redirecting-factory-tearoff self::Class8b::•
+  #C18 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect
index 1ff3758..05e5e9d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -54,7 +54,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -65,7 +65,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -74,32 +74,32 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -108,7 +108,7 @@
     ;
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
 }
@@ -118,7 +118,7 @@
     ;
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
 }
@@ -129,23 +129,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C10;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C10;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C11;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C11;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C12;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -157,12 +157,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C12;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C13;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -173,9 +173,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C13;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C14;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -191,10 +191,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C14;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C15;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -222,16 +222,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C15;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C16;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C17;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -244,7 +244,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C18}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -259,14 +259,22 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = redirecting-factory-tearoff self::Class1::•
-  #C3 = redirecting-factory-tearoff self::Class2::named
-  #C4 = redirecting-factory-tearoff self::Class3::•
-  #C5 = redirecting-factory-tearoff self::Class4::•
-  #C6 = redirecting-factory-tearoff self::Class5::•
-  #C7 = redirecting-factory-tearoff self::Class6::•
-  #C8 = redirecting-factory-tearoff self::Class7b::•
-  #C9 = redirecting-factory-tearoff self::Class8b::•
-  #C10 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = redirecting-factory-tearoff self::Class1::•
+  #C11 = redirecting-factory-tearoff self::Class2::named
+  #C12 = redirecting-factory-tearoff self::Class3::•
+  #C13 = redirecting-factory-tearoff self::Class4::•
+  #C14 = redirecting-factory-tearoff self::Class5::•
+  #C15 = redirecting-factory-tearoff self::Class6::•
+  #C16 = redirecting-factory-tearoff self::Class7b::•
+  #C17 = redirecting-factory-tearoff self::Class8b::•
+  #C18 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
index 3714e57..7d012c0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
@@ -82,3 +82,15 @@
   ;
 static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:13:7 -> ConstructorTearOffConstant(Class1.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:18:7 -> ConstructorTearOffConstant(Class2.named)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:46:7 -> ConstructorTearOffConstant(Class3.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:53:7 -> ConstructorTearOffConstant(Class4.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:60:7 -> ConstructorTearOffConstant(Class5.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:68:7 -> ConstructorTearOffConstant(Class6.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:82:7 -> ConstructorTearOffConstant(Class7b.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_tear_off.dart:90:7 -> ConstructorTearOffConstant(Class8b.)
+Extra constant evaluation: evaluated: 31, effectively constant: 8
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect
index 83c7798..c321ab5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -54,7 +54,7 @@
     return new self::Class1::_();
 }
 class Class2 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor __() → self::Class2
     : super core::Object::•()
     ;
@@ -65,7 +65,7 @@
 }
 class Class3 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _(core::int field) → self::Class3
     : self::Class3::field = field, super core::Object::•()
     ;
@@ -74,32 +74,32 @@
 }
 class Class4 extends core::Object {
   final field core::int? field;
-  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
-  constructor _([core::int? field = #C1]) → self::Class4
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
     : self::Class4::field = field, super core::Object::•()
     ;
-  static factory •([core::int? field = #C1]) → self::Class4
+  static factory •([core::int? field = #C5]) → self::Class4
     return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
-  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
-  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
-  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
   final field core::int? field2;
   final field core::int field3;
-  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
-  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
-  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
@@ -108,7 +108,7 @@
     ;
 }
 class Class7b extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   static factory •() → self::Class7b
     return new self::Class7a::•();
 }
@@ -118,7 +118,7 @@
     ;
 }
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
     return new self::Class8a::•<self::Class8b::•::T%>();
 }
@@ -129,23 +129,23 @@
   self::testArgs();
 }
 static method testNoArgs() → dynamic {
-  () → self::Class1 f1a = #C2;
+  () → self::Class1 f1a = #C10;
   self::Class1 c1a = f1a(){() → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
-  dynamic f1b = #C2;
+  dynamic f1b = #C10;
   dynamic c1b = f1b{dynamic}.call();
   self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
   self::expect(true, core::identical(f1a, f1b));
-  () → self::Class2 f2a = #C3;
+  () → self::Class2 f2a = #C11;
   self::Class2 c2a = f2a(){() → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
-  dynamic f2b = #C3;
+  dynamic f2b = #C11;
   dynamic c2b = f2b{dynamic}.call();
   self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
   self::expect(true, core::identical(f2a, f2b));
 }
 static method testArgs() → dynamic {
-  (core::int) → self::Class3 f3a = #C4;
+  (core::int) → self::Class3 f3a = #C12;
   self::Class3 c3a = f3a(42){(core::int) → self::Class3};
   self::expect(42, c3a.{self::Class3::field}{core::int});
   () → Null {
@@ -157,12 +157,12 @@
     f3a(42, 87); // error
        ^" in f3a{<inapplicable>}.(42, 87);
   };
-  dynamic f3b = #C4;
+  dynamic f3b = #C12;
   dynamic c3b = f3b{dynamic}.call(87);
   self::expect(87, c3b{dynamic}.field);
   self::throws(() → dynamic => f3b{dynamic}.call());
   self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
-  ([core::int?]) → self::Class4 f4a = #C5;
+  ([core::int?]) → self::Class4 f4a = #C13;
   self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
   self::expect(null, c4a.{self::Class4::field}{core::int?});
   self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
@@ -173,9 +173,9 @@
     f4a(42, 87); // error
        ^" in f4a{<inapplicable>}.(42, 87);
   };
-  dynamic f4b = #C5;
+  dynamic f4b = #C13;
   self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
-  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  (core::int, [core::int?]) → self::Class5 f5a = #C14;
   self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
   self::expect(42, c5a.{self::Class5::field1}{core::int});
   self::expect(null, c5a.{self::Class5::field2}{core::int?});
@@ -191,10 +191,10 @@
     f5a(42, 87, 123); // error
        ^" in f5a{<inapplicable>}.(42, 87, 123);
   };
-  dynamic f5b = #C6;
+  dynamic f5b = #C14;
   self::throws(() → dynamic => f5b{dynamic}.call());
   self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
-  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C15;
   self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
   self::expect(42, c6a.{self::Class6::field1}{core::int});
   self::expect(null, c6a.{self::Class6::field2}{core::int?});
@@ -222,16 +222,16 @@
   self::expect(87, c6c.{self::Class6::field1}{core::int});
   self::expect(123, c6c.{self::Class6::field2}{core::int?});
   self::expect(42, c6c.{self::Class6::field3}{core::int});
-  dynamic f6b = #C7;
+  dynamic f6b = #C15;
   self::throws(() → dynamic => f6b{dynamic}.call());
   self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
   self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
-  () → self::Class7b f7a = #C8;
+  () → self::Class7b f7a = #C16;
   self::Class7b c7a = f7a(){() → self::Class7b};
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
   self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
-  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C17;
   self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
   self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
@@ -244,7 +244,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C18}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -259,14 +259,22 @@
 }
 
 constants  {
-  #C1 = null
-  #C2 = redirecting-factory-tearoff self::Class1::•
-  #C3 = redirecting-factory-tearoff self::Class2::named
-  #C4 = redirecting-factory-tearoff self::Class3::•
-  #C5 = redirecting-factory-tearoff self::Class4::•
-  #C6 = redirecting-factory-tearoff self::Class5::•
-  #C7 = redirecting-factory-tearoff self::Class6::•
-  #C8 = redirecting-factory-tearoff self::Class7b::•
-  #C9 = redirecting-factory-tearoff self::Class8b::•
-  #C10 = false
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = redirecting-factory-tearoff self::Class1::•
+  #C11 = redirecting-factory-tearoff self::Class2::named
+  #C12 = redirecting-factory-tearoff self::Class3::•
+  #C13 = redirecting-factory-tearoff self::Class4::•
+  #C14 = redirecting-factory-tearoff self::Class5::•
+  #C15 = redirecting-factory-tearoff self::Class6::•
+  #C16 = redirecting-factory-tearoff self::Class7b::•
+  #C17 = redirecting-factory-tearoff self::Class8b::•
+  #C18 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.expect
index ba3e087..a3ee0a4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.expect
@@ -83,5 +83,5 @@
 
 constants  {
   #C1 = static-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int>
+  #C2 = instantiation #C1 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.transformed.expect
index ba3e087..a3ee0a4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.strong.transformed.expect
@@ -83,5 +83,5 @@
 
 constants  {
   #C1 = static-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int>
+  #C2 = instantiation #C1 <core::int>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.expect
index 59bdc1d..6f79e9e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.expect
@@ -83,5 +83,5 @@
 
 constants  {
   #C1 = static-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.transformed.expect
index 59bdc1d..6f79e9e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.transformed.expect
@@ -83,5 +83,5 @@
 
 constants  {
   #C1 = static-tearoff self::A::foo
-  #C2 = instantiation self::A::foo <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.expect
index 6c0edc7..fb71a2b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.expect
@@ -125,17 +125,17 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <>
+  #C2 = instantiation #C1 <>
   #C3 = constructor-tearoff self::B::•
-  #C4 = instantiation self::B::• <core::String>
+  #C4 = instantiation #C3 <core::String>
   #C5 = constructor-tearoff self::B::foo
-  #C6 = instantiation self::B::foo <core::String>
-  #C7 = static-tearoff self::B::bar
-  #C8 = instantiation self::B::bar <core::String>
-  #C9 = instantiation self::B::• <core::num>
-  #C10 = instantiation self::B::foo <core::num>
-  #C11 = instantiation self::B::bar <core::num>
+  #C6 = instantiation #C5 <core::String>
+  #C7 = constructor-tearoff self::B::bar
+  #C8 = instantiation #C7 <core::String>
+  #C9 = instantiation #C3 <core::num>
+  #C10 = instantiation #C5 <core::num>
+  #C11 = instantiation #C7 <core::num>
   #C12 = typedef-tearoff <X extends core::num>.(#C3<X>)
   #C13 = typedef-tearoff <X extends core::num, unrelated Y extends core::String>.(#C3<X>)
-  #C14 = instantiation self::B::• <Never>
+  #C14 = instantiation #C3 <Never>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.transformed.expect
index 9c2c674..d5b1440 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.strong.transformed.expect
@@ -125,17 +125,17 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <>
+  #C2 = instantiation #C1 <>
   #C3 = constructor-tearoff self::B::•
-  #C4 = instantiation self::B::• <core::String>
+  #C4 = instantiation #C3 <core::String>
   #C5 = constructor-tearoff self::B::foo
-  #C6 = instantiation self::B::foo <core::String>
-  #C7 = static-tearoff self::B::bar
-  #C8 = instantiation self::B::bar <core::String>
-  #C9 = instantiation self::B::• <core::num>
-  #C10 = instantiation self::B::foo <core::num>
-  #C11 = instantiation self::B::bar <core::num>
+  #C6 = instantiation #C5 <core::String>
+  #C7 = constructor-tearoff self::B::bar
+  #C8 = instantiation #C7 <core::String>
+  #C9 = instantiation #C3 <core::num>
+  #C10 = instantiation #C5 <core::num>
+  #C11 = instantiation #C7 <core::num>
   #C12 = typedef-tearoff <X extends core::num>.(#C3<X>)
   #C13 = typedef-tearoff <X extends core::num, unrelated Y extends core::String>.(#C3<X>)
-  #C14 = instantiation self::B::• <Never>
+  #C14 = instantiation #C3 <Never>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.expect
index 8de913d..f075526 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.expect
@@ -125,17 +125,17 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <>
+  #C2 = instantiation #C1 <>
   #C3 = constructor-tearoff self::B::•
-  #C4 = instantiation self::B::• <core::String*>
+  #C4 = instantiation #C3 <core::String*>
   #C5 = constructor-tearoff self::B::foo
-  #C6 = instantiation self::B::foo <core::String*>
-  #C7 = static-tearoff self::B::bar
-  #C8 = instantiation self::B::bar <core::String*>
-  #C9 = instantiation self::B::• <core::num*>
-  #C10 = instantiation self::B::foo <core::num*>
-  #C11 = instantiation self::B::bar <core::num*>
+  #C6 = instantiation #C5 <core::String*>
+  #C7 = constructor-tearoff self::B::bar
+  #C8 = instantiation #C7 <core::String*>
+  #C9 = instantiation #C3 <core::num*>
+  #C10 = instantiation #C5 <core::num*>
+  #C11 = instantiation #C7 <core::num*>
   #C12 = typedef-tearoff <X extends core::num>.(#C3<X>)
   #C13 = typedef-tearoff <X extends core::num, unrelated Y extends core::String>.(#C3<X>)
-  #C14 = instantiation self::B::• <Never*>
+  #C14 = instantiation #C3 <Never*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.transformed.expect
index 82dceb0..e9462e1 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.transformed.expect
@@ -125,17 +125,17 @@
 
 constants  {
   #C1 = constructor-tearoff self::A::•
-  #C2 = instantiation self::A::• <>
+  #C2 = instantiation #C1 <>
   #C3 = constructor-tearoff self::B::•
-  #C4 = instantiation self::B::• <core::String*>
+  #C4 = instantiation #C3 <core::String*>
   #C5 = constructor-tearoff self::B::foo
-  #C6 = instantiation self::B::foo <core::String*>
-  #C7 = static-tearoff self::B::bar
-  #C8 = instantiation self::B::bar <core::String*>
-  #C9 = instantiation self::B::• <core::num*>
-  #C10 = instantiation self::B::foo <core::num*>
-  #C11 = instantiation self::B::bar <core::num*>
+  #C6 = instantiation #C5 <core::String*>
+  #C7 = constructor-tearoff self::B::bar
+  #C8 = instantiation #C7 <core::String*>
+  #C9 = instantiation #C3 <core::num*>
+  #C10 = instantiation #C5 <core::num*>
+  #C11 = instantiation #C7 <core::num*>
   #C12 = typedef-tearoff <X extends core::num>.(#C3<X>)
   #C13 = typedef-tearoff <X extends core::num, unrelated Y extends core::String>.(#C3<X>)
-  #C14 = instantiation self::B::• <Never*>
+  #C14 = instantiation #C3 <Never*>
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
index 87df92f..34009a6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -33,20 +33,20 @@
 }
 static method test() → dynamic {
   new self::D::•(1);
-  #C2;
+  #C4;
   new self::C::•(1);
-  () → self::A f1 = #C3;
-  () → self::B f2 = #C4;
-  (core::int) → self::C f3 = #C5;
-  (core::int) → self::D f4 = #C6;
+  () → self::A f1 = #C5;
+  () → self::B f2 = #C6;
+  (core::int) → self::C f3 = #C7;
+  (core::int) → self::D f4 = #C8;
   f1(){() → self::A};
   f2(){() → self::B};
   f3(1){(core::int) → self::C};
   f4(1){(core::int) → self::D};
-  () → self::A g1 = #C3;
-  () → self::B g2 = #C4;
-  (core::int) → self::C g3 = #C5;
-  (core::int) → self::D g4 = #C6;
+  () → self::A g1 = #C5;
+  () → self::B g2 = #C6;
+  (core::int) → self::C g3 = #C7;
+  (core::int) → self::D g4 = #C8;
   g1(){() → self::A};
   g2(){() → self::B};
   g3(1){(core::int) → self::C};
@@ -55,12 +55,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = 1
-  #C2 = self::C {x:#C1}
-  #C3 = constructor-tearoff self::A::•
-  #C4 = constructor-tearoff self::B::•
-  #C5 = constructor-tearoff self::C::•
-  #C6 = constructor-tearoff self::D::•
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = 1
+  #C4 = self::C {x:#C3}
+  #C5 = constructor-tearoff self::A::•
+  #C6 = constructor-tearoff self::B::•
+  #C7 = constructor-tearoff self::C::•
+  #C8 = constructor-tearoff self::D::•
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
index 87df92f..34009a6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -33,20 +33,20 @@
 }
 static method test() → dynamic {
   new self::D::•(1);
-  #C2;
+  #C4;
   new self::C::•(1);
-  () → self::A f1 = #C3;
-  () → self::B f2 = #C4;
-  (core::int) → self::C f3 = #C5;
-  (core::int) → self::D f4 = #C6;
+  () → self::A f1 = #C5;
+  () → self::B f2 = #C6;
+  (core::int) → self::C f3 = #C7;
+  (core::int) → self::D f4 = #C8;
   f1(){() → self::A};
   f2(){() → self::B};
   f3(1){(core::int) → self::C};
   f4(1){(core::int) → self::D};
-  () → self::A g1 = #C3;
-  () → self::B g2 = #C4;
-  (core::int) → self::C g3 = #C5;
-  (core::int) → self::D g4 = #C6;
+  () → self::A g1 = #C5;
+  () → self::B g2 = #C6;
+  (core::int) → self::C g3 = #C7;
+  (core::int) → self::D g4 = #C8;
   g1(){() → self::A};
   g2(){() → self::B};
   g3(1){(core::int) → self::C};
@@ -55,12 +55,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = 1
-  #C2 = self::C {x:#C1}
-  #C3 = constructor-tearoff self::A::•
-  #C4 = constructor-tearoff self::B::•
-  #C5 = constructor-tearoff self::C::•
-  #C6 = constructor-tearoff self::D::•
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = 1
+  #C4 = self::C {x:#C3}
+  #C5 = constructor-tearoff self::A::•
+  #C6 = constructor-tearoff self::B::•
+  #C7 = constructor-tearoff self::C::•
+  #C8 = constructor-tearoff self::D::•
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
index 87df92f..34009a6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -33,20 +33,20 @@
 }
 static method test() → dynamic {
   new self::D::•(1);
-  #C2;
+  #C4;
   new self::C::•(1);
-  () → self::A f1 = #C3;
-  () → self::B f2 = #C4;
-  (core::int) → self::C f3 = #C5;
-  (core::int) → self::D f4 = #C6;
+  () → self::A f1 = #C5;
+  () → self::B f2 = #C6;
+  (core::int) → self::C f3 = #C7;
+  (core::int) → self::D f4 = #C8;
   f1(){() → self::A};
   f2(){() → self::B};
   f3(1){(core::int) → self::C};
   f4(1){(core::int) → self::D};
-  () → self::A g1 = #C3;
-  () → self::B g2 = #C4;
-  (core::int) → self::C g3 = #C5;
-  (core::int) → self::D g4 = #C6;
+  () → self::A g1 = #C5;
+  () → self::B g2 = #C6;
+  (core::int) → self::C g3 = #C7;
+  (core::int) → self::D g4 = #C8;
   g1(){() → self::A};
   g2(){() → self::B};
   g3(1){(core::int) → self::C};
@@ -55,12 +55,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = 1
-  #C2 = self::C {x:#C1}
-  #C3 = constructor-tearoff self::A::•
-  #C4 = constructor-tearoff self::B::•
-  #C5 = constructor-tearoff self::C::•
-  #C6 = constructor-tearoff self::D::•
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = 1
+  #C4 = self::C {x:#C3}
+  #C5 = constructor-tearoff self::A::•
+  #C6 = constructor-tearoff self::B::•
+  #C7 = constructor-tearoff self::C::•
+  #C8 = constructor-tearoff self::D::•
 }
 
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
index 0041523..c11e3fa 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
@@ -31,3 +31,9 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///unnamed_constructor.dart:5:7 -> ConstructorTearOffConstant(A.redirectingFactory)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///unnamed_constructor.dart:5:7 -> ConstructorTearOffConstant(A.redirectingFactoryChild)
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
index 87df92f..34009a6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   constructor •() → self::A
     : super core::Object::•()
     ;
@@ -33,20 +33,20 @@
 }
 static method test() → dynamic {
   new self::D::•(1);
-  #C2;
+  #C4;
   new self::C::•(1);
-  () → self::A f1 = #C3;
-  () → self::B f2 = #C4;
-  (core::int) → self::C f3 = #C5;
-  (core::int) → self::D f4 = #C6;
+  () → self::A f1 = #C5;
+  () → self::B f2 = #C6;
+  (core::int) → self::C f3 = #C7;
+  (core::int) → self::D f4 = #C8;
   f1(){() → self::A};
   f2(){() → self::B};
   f3(1){(core::int) → self::C};
   f4(1){(core::int) → self::D};
-  () → self::A g1 = #C3;
-  () → self::B g2 = #C4;
-  (core::int) → self::C g3 = #C5;
-  (core::int) → self::D g4 = #C6;
+  () → self::A g1 = #C5;
+  () → self::B g2 = #C6;
+  (core::int) → self::C g3 = #C7;
+  (core::int) → self::D g4 = #C8;
   g1(){() → self::A};
   g2(){() → self::B};
   g3(1){(core::int) → self::C};
@@ -55,12 +55,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = 1
-  #C2 = self::C {x:#C1}
-  #C3 = constructor-tearoff self::A::•
-  #C4 = constructor-tearoff self::B::•
-  #C5 = constructor-tearoff self::C::•
-  #C6 = constructor-tearoff self::D::•
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = 1
+  #C4 = self::C {x:#C3}
+  #C5 = constructor-tearoff self::A::•
+  #C6 = constructor-tearoff self::B::•
+  #C7 = constructor-tearoff self::C::•
+  #C8 = constructor-tearoff self::D::•
 }
 
 
diff --git a/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.expect b/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.expect
index fb9bcc0..177dd51 100644
--- a/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.expect
+++ b/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.expect
@@ -19,6 +19,6 @@
 
 constants  {
   #C1 = static-tearoff self::C::_#new#tearOff
-  #C2 = instantiation self::C::_#new#tearOff <core::int>
-  #C3 = instantiation self::C::_#new#tearOff <core::String>
+  #C2 = instantiation #C1 <core::int>
+  #C3 = instantiation #C1 <core::String>
 }
diff --git a/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.transformed.expect
index bae63cb..acaab65 100644
--- a/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dartdevc/issue47108.dart.strong.transformed.expect
@@ -19,8 +19,8 @@
 
 constants  {
   #C1 = static-tearoff self::C::_#new#tearOff
-  #C2 = instantiation self::C::_#new#tearOff <core::int>
-  #C3 = instantiation self::C::_#new#tearOff <core::String>
+  #C2 = instantiation #C1 <core::int>
+  #C3 = instantiation #C1 <core::String>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.expect b/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.expect
index 04f3df1..39841ce 100644
--- a/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.expect
+++ b/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.expect
@@ -19,6 +19,6 @@
 
 constants  {
   #C1 = static-tearoff self::C::_#new#tearOff
-  #C2 = instantiation self::C::_#new#tearOff <core::int*>
-  #C3 = instantiation self::C::_#new#tearOff <core::String*>
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::String*>
 }
diff --git a/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.transformed.expect b/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.transformed.expect
index 0f3b2dc..3e71f95 100644
--- a/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.transformed.expect
@@ -19,8 +19,8 @@
 
 constants  {
   #C1 = static-tearoff self::C::_#new#tearOff
-  #C2 = instantiation self::C::_#new#tearOff <core::int*>
-  #C3 = instantiation self::C::_#new#tearOff <core::String*>
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::String*>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect
index 36647b1..d76d693 100644
--- a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect
@@ -25,7 +25,7 @@
     ;
 }
 abstract class B extends core::Object implements self::A {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::B
     return invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
  - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
@@ -42,3 +42,7 @@
                 ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect
index ff08754..8f5d709 100644
--- a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect
@@ -32,3 +32,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///abstract_instantiation.dart:7:16 -> ConstructorTearOffConstant(B.)
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect
index 36647b1..d76d693 100644
--- a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect
@@ -25,7 +25,7 @@
     ;
 }
 abstract class B extends core::Object implements self::A {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::B
     return invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
  - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
@@ -42,3 +42,7 @@
                 ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect
index e7b3e08..35d93a3 100644
--- a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.expect
@@ -651,11 +651,11 @@
   #C24 = static-tearoff self3::id
   #C25 = constructor-tearoff self3::Class::•
   #C26 = <self3::Class<invalid-type>*>[]
-  #C27 = instantiation self3::Class::• <core::int*>
+  #C27 = instantiation #C25 <core::int*>
   #C28 = TypeLiteralConstant(self3::Class<invalid-type>*)
-  #C29 = instantiation self3::id <invalid-type>
-  #C30 = instantiation self3::Class::• <invalid-type>
-  #C31 = instantiation self3::id <self3::Class<invalid-type>*>
+  #C29 = instantiation #C24 <invalid-type>
+  #C30 = instantiation #C25 <invalid-type>
+  #C31 = instantiation #C24 <self3::Class<invalid-type>*>
   #C32 = <core::Type*>[#C28]
   #C33 = <(invalid-type) →* invalid-type>[#C29]
   #C34 = <self3::Class<invalid-type>*>[#C8]
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect
index e7b3e08..35d93a3 100644
--- a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.transformed.expect
@@ -651,11 +651,11 @@
   #C24 = static-tearoff self3::id
   #C25 = constructor-tearoff self3::Class::•
   #C26 = <self3::Class<invalid-type>*>[]
-  #C27 = instantiation self3::Class::• <core::int*>
+  #C27 = instantiation #C25 <core::int*>
   #C28 = TypeLiteralConstant(self3::Class<invalid-type>*)
-  #C29 = instantiation self3::id <invalid-type>
-  #C30 = instantiation self3::Class::• <invalid-type>
-  #C31 = instantiation self3::id <self3::Class<invalid-type>*>
+  #C29 = instantiation #C24 <invalid-type>
+  #C30 = instantiation #C25 <invalid-type>
+  #C31 = instantiation #C24 <self3::Class<invalid-type>*>
   #C32 = <core::Type*>[#C28]
   #C33 = <(invalid-type) →* invalid-type>[#C29]
   #C34 = <self3::Class<invalid-type>*>[#C8]
diff --git a/pkg/front_end/testcases/general/constants/various.dart.weak.expect b/pkg/front_end/testcases/general/constants/various.dart.weak.expect
index 62853b9..9fa5cbe 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.weak.expect
@@ -630,7 +630,7 @@
   #C19 = self::ClassWithTypeArguments<core::int*, core::int*, core::int*> {}
   #C20 = self::ClassWithTypeArguments<dynamic, dynamic, dynamic> {}
   #C21 = static-tearoff self::id1
-  #C22 = instantiation self::id1 <core::int*>
+  #C22 = instantiation #C21 <core::int*>
 }
 
 
diff --git a/pkg/front_end/testcases/general/constants/various.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/various.dart.weak.transformed.expect
index 9d9530c..37e4135 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.weak.transformed.expect
@@ -630,7 +630,7 @@
   #C19 = self::ClassWithTypeArguments<core::int*, core::int*, core::int*> {}
   #C20 = self::ClassWithTypeArguments<dynamic, dynamic, dynamic> {}
   #C21 = static-tearoff self::id1
-  #C22 = instantiation self::id1 <core::int*>
+  #C22 = instantiation #C21 <core::int*>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.expect
index 942009a..d4686ed 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.expect
@@ -104,7 +104,7 @@
 constants  {
   #C1 = TypeLiteralConstant(core::Object*)
   #C2 = static-tearoff var::id1
-  #C3 = instantiation var::id1 <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = 0
   #C5 = var::Class<core::int*> {field:#C4}
   #C6 = 42
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.transformed.expect
index 6a48cb7..43ae6e3 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.transformed.expect
@@ -104,7 +104,7 @@
 constants  {
   #C1 = TypeLiteralConstant(core::Object*)
   #C2 = static-tearoff var::id1
-  #C3 = instantiation var::id1 <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = 0
   #C5 = var::Class<core::int*> {field:#C4}
   #C6 = 42
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 d0e5d30..0cdd47c 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
@@ -26,23 +26,24 @@
 @#C1
 class Class extends core::Object {
   final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
-  static final field dynamic _redirecting# = <dynamic>[test::Class::redirect]/*isLegacy*/;
-  const constructor _internal({core::bool defaultValue = #C2}) → test::Class
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  const constructor _internal({core::bool defaultValue = #C3}) → test::Class
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C3}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C4}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C3}) → test::Class
+  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 = #C3}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
   #C1 = _in::_Patch {}
-  #C2 = false
-  #C3 = true
+  #C2 = constructor-tearoff test::Class::redirect
+  #C3 = false
+  #C4 = true
 }
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
index 8534e61..639b7a5 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
@@ -35,4 +35,5 @@
 Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:27 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:22:17 -> InstanceConstant(const _Patch{})
-Extra constant evaluation: evaluated: 9, effectively constant: 4
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///origin_lib.dart:5:7 -> ConstructorTearOffConstant(Class.redirect)
+Extra constant evaluation: evaluated: 9, effectively constant: 5
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 d0e5d30..0cdd47c 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
@@ -26,23 +26,24 @@
 @#C1
 class Class extends core::Object {
   final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
-  static final field dynamic _redirecting# = <dynamic>[test::Class::redirect]/*isLegacy*/;
-  const constructor _internal({core::bool defaultValue = #C2}) → test::Class
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  const constructor _internal({core::bool defaultValue = #C3}) → test::Class
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C3}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C4}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C3}) → test::Class
+  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 = #C3}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
   #C1 = _in::_Patch {}
-  #C2 = false
-  #C3 = true
+  #C2 = constructor-tearoff test::Class::redirect
+  #C3 = false
+  #C4 = true
 }
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect
index 1f6296f..d1b803d 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect
@@ -23,5 +23,5 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
index 6aa6e81..c29de20 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
 
 constants  {
   #C1 = static-tearoff self::id
-  #C2 = instantiation self::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect
index a73f4c5..6d764be 100644
--- a/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::C*
     : super core::Object::•()
     ;
@@ -140,12 +140,12 @@
  - 'Object' is from 'dart:core'.
 Change the type of the method or the context in which it is used.
   void Function(Object) i = C.staticFunction;
-                              ^" in #C1;
+                              ^" in #C2;
   (core::Object*) →* void j = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:31:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
   void Function(Object) j = topLevelFunction;
-                            ^" in #C2;
+                            ^" in #C3;
   (core::Object*) →* void k = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:32:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
@@ -162,13 +162,14 @@
   self::D* f = new self::D::•() as{TypeError} self::D*;
   self::C* g = new self::C::nonFact();
   self::C* h = new self::C::nonFact2();
-  (core::int*) →* void i = #C1;
-  (core::int*) →* void j = #C2;
+  (core::int*) →* void i = #C2;
+  (core::int*) →* void j = #C3;
   (core::int*) →* void k = localFunction;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = static-tearoff self::C::staticFunction
-  #C2 = static-tearoff self::topLevelFunction
+  #C1 = constructor-tearoff self::C::fact2
+  #C2 = static-tearoff self::C::staticFunction
+  #C3 = static-tearoff self::topLevelFunction
 }
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect
index 6da6ddb..fe7f848 100644
--- a/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect
@@ -39,3 +39,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///invalid_cast.dart:7:7 -> ConstructorTearOffConstant(C.fact2)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect
index 7ea1c1e..d1ae432 100644
--- a/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::C*
     : super core::Object::•()
     ;
@@ -140,12 +140,12 @@
  - 'Object' is from 'dart:core'.
 Change the type of the method or the context in which it is used.
   void Function(Object) i = C.staticFunction;
-                              ^" in #C1;
+                              ^" in #C2;
   (core::Object*) →* void j = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:31:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
   void Function(Object) j = topLevelFunction;
-                            ^" in #C2;
+                            ^" in #C3;
   (core::Object*) →* void k = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:32:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
@@ -162,13 +162,14 @@
   self::D* f = new self::D::•();
   self::C* g = new self::C::nonFact();
   self::C* h = new self::C::nonFact2();
-  (core::int*) →* void i = #C1;
-  (core::int*) →* void j = #C2;
+  (core::int*) →* void i = #C2;
+  (core::int*) →* void j = #C3;
   (core::int*) →* void k = localFunction;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = static-tearoff self::C::staticFunction
-  #C2 = static-tearoff self::topLevelFunction
+  #C1 = constructor-tearoff self::C::fact2
+  #C2 = static-tearoff self::C::staticFunction
+  #C3 = static-tearoff self::topLevelFunction
 }
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.expect
index bf4d0eb..c0cc024 100644
--- a/pkg/front_end/testcases/general/issue34714.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
     return new self::B::•<self::A::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -33,3 +33,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+}
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect
index 04afde7..6b16904 100644
--- a/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect
@@ -33,3 +33,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue34714.dart:5:7 -> ConstructorTearOffConstant(A.)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect
index bf4d0eb..c0cc024 100644
--- a/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
     return new self::B::•<self::A::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -33,3 +33,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+}
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect
index d009d81..d657617 100644
--- a/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect
@@ -18,7 +18,7 @@
 export "org-dartlang-testcase:///bar_lib.dart";
 
 abstract class Foo extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[foo::Foo::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   const constructor •() → foo::Foo
     : super core::Object::•()
     ;
@@ -42,6 +42,7 @@
 constants  {
   #C1 = bar::Bar<dynamic> {}
   #C2 = <foo::Foo*>{#C1}
+  #C3 = constructor-tearoff foo::Foo::bar
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect
index 277bd57..c3b5d5f 100644
--- a/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect
@@ -44,4 +44,5 @@
 
 Extra constant evaluation status:
 Evaluated: SetLiteral @ org-dartlang-testcase:///main.dart:7:27 -> SetConstant(const <Foo*>{const Bar<dynamic>{}})
-Extra constant evaluation: evaluated: 4, effectively constant: 1
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///foo_lib.dart:9:16 -> ConstructorTearOffConstant(Foo.bar)
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect
index d009d81..d657617 100644
--- a/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect
@@ -18,7 +18,7 @@
 export "org-dartlang-testcase:///bar_lib.dart";
 
 abstract class Foo extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[foo::Foo::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   const constructor •() → foo::Foo
     : super core::Object::•()
     ;
@@ -42,6 +42,7 @@
 constants  {
   #C1 = bar::Bar<dynamic> {}
   #C2 = <foo::Foo*>{#C1}
+  #C3 = constructor-tearoff foo::Foo::bar
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect
index dcbf1e1..9e86d1c 100644
--- a/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect
@@ -13,7 +13,7 @@
     ;
 }
 abstract class A extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::A::foo]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   const constructor •() → self::A
     : super core::Object::•()
     ;
@@ -24,6 +24,7 @@
 
 constants  {
   #C1 = self::B<dynamic> {}
+  #C2 = constructor-tearoff self::A::foo
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect
index a916713..771d13c 100644
--- a/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect
@@ -26,4 +26,5 @@
 
 Extra constant evaluation status:
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue45003_2.dart:6:30 -> InstanceConstant(const B<dynamic>{})
-Extra constant evaluation: evaluated: 4, effectively constant: 1
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45003_2.dart:13:16 -> ConstructorTearOffConstant(A.foo)
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect
index dcbf1e1..9e86d1c 100644
--- a/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
     ;
 }
 abstract class A extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::A::foo]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   const constructor •() → self::A
     : super core::Object::•()
     ;
@@ -24,6 +24,7 @@
 
 constants  {
   #C1 = self::B<dynamic> {}
+  #C2 = constructor-tearoff self::A::foo
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect
index 651a6e4..d517647 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect
@@ -31,7 +31,7 @@
 @#C1
 @#C4
 class Array<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self2::Array::•];
+  static final field dynamic _redirecting# = <dynamic>[#C5];
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
     return new self2::_ArraySize::•<self2::Array::•::T*>(foo);
@@ -52,6 +52,7 @@
   #C2 = "vm:entry-point"
   #C3 = null
   #C4 = core::pragma {name:#C2, options:#C3}
+  #C5 = constructor-tearoff self2::Array::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
index 7c8d05d..f06670d 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
@@ -53,4 +53,5 @@
 Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:10:1 -> InstanceConstant(const _Patch{})
 Evaluated: ConstructorInvocation @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const pragma{pragma.name: "vm:entry-point", pragma.options: null})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:14:17 -> InstanceConstant(const _Patch{})
-Extra constant evaluation: evaluated: 8, effectively constant: 3
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///origin_lib.dart:6:7 -> ConstructorTearOffConstant(Array.)
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect
index 651a6e4..d517647 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect
@@ -31,7 +31,7 @@
 @#C1
 @#C4
 class Array<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self2::Array::•];
+  static final field dynamic _redirecting# = <dynamic>[#C5];
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
     return new self2::_ArraySize::•<self2::Array::•::T*>(foo);
@@ -52,6 +52,7 @@
   #C2 = "vm:entry-point"
   #C3 = null
   #C4 = core::pragma {name:#C2, options:#C3}
+  #C5 = constructor-tearoff self2::Array::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue46334.dart.weak.expect b/pkg/front_end/testcases/general/issue46334.dart.weak.expect
index 2fd5dea..e0ea5d7 100644
--- a/pkg/front_end/testcases/general/issue46334.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue46334.dart.weak.expect
@@ -10,10 +10,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::C
     return invalid-expression "pkg/front_end/testcases/general/issue46334.dart:6:11: Error: Cyclic definition of factory 'C'.
   factory C() = C;
           ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/general/issue46334.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue46334.dart.weak.outline.expect
index 2ac4318..ccca97c 100644
--- a/pkg/front_end/testcases/general/issue46334.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue46334.dart.weak.outline.expect
@@ -18,3 +18,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue46334.dart:5:7 -> ConstructorTearOffConstant(C.)
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue46334.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue46334.dart.weak.transformed.expect
index 2fd5dea..e0ea5d7 100644
--- a/pkg/front_end/testcases/general/issue46334.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue46334.dart.weak.transformed.expect
@@ -10,10 +10,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::C
     return invalid-expression "pkg/front_end/testcases/general/issue46334.dart:6:11: Error: Cyclic definition of factory 'C'.
   factory C() = C;
           ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.expect
index e755d5a..706562c 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.expect
@@ -9,28 +9,28 @@
     ;
 }
 class Settings extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Settings::•]/*isLegacy*/;
-  static factory •({@#C2 self::Sidebar sidebar = #C3}) → self::Settings
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Sidebar::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[self::_SSettings::•]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C3}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
   final field self::Sidebar sidebar;
-  const constructor •({self::Sidebar sidebar = #C1}) → self::_$_SSettings
+  const constructor •({self::Sidebar sidebar = #C2}) → self::_$_SSettings
     : self::_$_SSettings::sidebar = sidebar, super core::Object::•()
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[self::_SSidebar::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -42,9 +42,13 @@
 static method main() → void {}
 
 constants  {
-  #C1 = self::_$_SSidebar {}
-  #C2 = self::Default {defaultValue:#C1}
-  #C3 = null
+  #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::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.outline.expect
index ebe57b3..bad6433 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.outline.expect
@@ -44,5 +44,9 @@
 
 
 Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue47036.dart:11:7 -> ConstructorTearOffConstant(Settings.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue47036.dart:17:7 -> ConstructorTearOffConstant(Sidebar.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue47036.dart:21:16 -> ConstructorTearOffConstant(_SSettings.)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47036.dart:26:44 -> InstanceConstant(const _$_SSidebar{})
-Extra constant evaluation: evaluated: 17, effectively constant: 1
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue47036.dart:31:16 -> ConstructorTearOffConstant(_SSidebar.)
+Extra constant evaluation: evaluated: 17, effectively constant: 5
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 e755d5a..706562c 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
@@ -9,28 +9,28 @@
     ;
 }
 class Settings extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Settings::•]/*isLegacy*/;
-  static factory •({@#C2 self::Sidebar sidebar = #C3}) → self::Settings
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Sidebar::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[self::_SSettings::•]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C3}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
   final field self::Sidebar sidebar;
-  const constructor •({self::Sidebar sidebar = #C1}) → self::_$_SSettings
+  const constructor •({self::Sidebar sidebar = #C2}) → self::_$_SSettings
     : self::_$_SSettings::sidebar = sidebar, super core::Object::•()
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[self::_SSidebar::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -42,9 +42,13 @@
 static method main() → void {}
 
 constants  {
-  #C1 = self::_$_SSidebar {}
-  #C2 = self::Default {defaultValue:#C1}
-  #C3 = null
+  #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::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47339.dart.weak.expect b/pkg/front_end/testcases/general/issue47339.dart.weak.expect
index eb5e9b2..02f1b57 100644
--- a/pkg/front_end/testcases/general/issue47339.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47339.dart.weak.expect
@@ -5,7 +5,7 @@
 typedef Bar = self::Foo;
 typedef BarGeneric<X extends core::Object? = dynamic> = self::FooGeneric<X%>;
 class Foo extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::Foo::namedFactory]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   const constructor named() → self::Foo
     : super core::Object::•()
     ;
@@ -13,22 +13,24 @@
     return new self::Foo::named();
 }
 class FooGeneric<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::FooGeneric::namedFactory]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   const constructor named() → self::FooGeneric<self::FooGeneric::X%>
     : super core::Object::•()
     ;
   static factory namedFactory<X extends core::Object? = dynamic>() → self::FooGeneric<self::FooGeneric::namedFactory::X%>
     return new self::FooGeneric::named<self::FooGeneric::namedFactory::X%>();
 }
-static const field self::Foo bar = #C1;
-static const field self::Foo bar2 = #C1;
-static const field self::FooGeneric<core::int> barGeneric = #C2;
-static const field self::FooGeneric<core::int> barGeneric2 = #C2;
+static const field self::Foo bar = #C3;
+static const field self::Foo bar2 = #C3;
+static const field self::FooGeneric<core::int> barGeneric = #C4;
+static const field self::FooGeneric<core::int> barGeneric2 = #C4;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = self::Foo {}
-  #C2 = self::FooGeneric<core::int*> {}
+  #C1 = constructor-tearoff self::Foo::namedFactory
+  #C2 = constructor-tearoff self::FooGeneric::namedFactory
+  #C3 = self::Foo {}
+  #C4 = self::FooGeneric<core::int*> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47339.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47339.dart.weak.outline.expect
index 0a83431..8e10651 100644
--- a/pkg/front_end/testcases/general/issue47339.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue47339.dart.weak.outline.expect
@@ -29,8 +29,10 @@
 
 
 Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue47339.dart:5:7 -> ConstructorTearOffConstant(Foo.namedFactory)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue47339.dart:16:7 -> ConstructorTearOffConstant(FooGeneric.namedFactory)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47339.dart:12:11 -> InstanceConstant(const Foo{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47339.dart:14:22 -> InstanceConstant(const Foo{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47339.dart:23:23 -> InstanceConstant(const FooGeneric<int*>{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47339.dart:25:48 -> InstanceConstant(const FooGeneric<int*>{})
-Extra constant evaluation: evaluated: 10, effectively constant: 4
+Extra constant evaluation: evaluated: 10, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/issue47339.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47339.dart.weak.transformed.expect
index eb5e9b2..02f1b57 100644
--- a/pkg/front_end/testcases/general/issue47339.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47339.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 typedef Bar = self::Foo;
 typedef BarGeneric<X extends core::Object? = dynamic> = self::FooGeneric<X%>;
 class Foo extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::Foo::namedFactory]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   const constructor named() → self::Foo
     : super core::Object::•()
     ;
@@ -13,22 +13,24 @@
     return new self::Foo::named();
 }
 class FooGeneric<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::FooGeneric::namedFactory]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   const constructor named() → self::FooGeneric<self::FooGeneric::X%>
     : super core::Object::•()
     ;
   static factory namedFactory<X extends core::Object? = dynamic>() → self::FooGeneric<self::FooGeneric::namedFactory::X%>
     return new self::FooGeneric::named<self::FooGeneric::namedFactory::X%>();
 }
-static const field self::Foo bar = #C1;
-static const field self::Foo bar2 = #C1;
-static const field self::FooGeneric<core::int> barGeneric = #C2;
-static const field self::FooGeneric<core::int> barGeneric2 = #C2;
+static const field self::Foo bar = #C3;
+static const field self::Foo bar2 = #C3;
+static const field self::FooGeneric<core::int> barGeneric = #C4;
+static const field self::FooGeneric<core::int> barGeneric2 = #C4;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = self::Foo {}
-  #C2 = self::FooGeneric<core::int*> {}
+  #C1 = constructor-tearoff self::Foo::namedFactory
+  #C2 = constructor-tearoff self::FooGeneric::namedFactory
+  #C3 = self::Foo {}
+  #C4 = self::FooGeneric<core::int*> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47462.dart b/pkg/front_end/testcases/general/issue47462.dart
new file mode 100644
index 0000000..17b9e38
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef MyList<T extends num> = List<T>;
+
+main() {
+  const c1 = MyList<num>.filled;
+  const c2 = MyList<num>.filled;
+  const c3 = (MyList.filled)<num>;
+
+  const c4 = identical(c1, c2);
+  const c5 = identical(c1, c3);
+
+  expect(true, c4);
+  expect(false, c5);
+
+  expect(true, identical(c1, c2));
+  expect(false, identical(c1, c3));
+
+  var v1 = MyList<num>.filled;
+  var v2 = MyList<num>.filled;
+  var v3 = (MyList.filled)<num>;
+
+  var v4 = identical(v1, v2);
+  var v5 = identical(v1, v3);
+
+  expect(true, v4);
+  expect(false, v5);
+
+  expect(true, identical(v1, v2));
+  expect(false, identical(v1, v3));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/general/issue47462.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47462.dart.textual_outline.expect
new file mode 100644
index 0000000..f4c644d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+typedef MyList<T extends num> = List<T>;
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/issue47462.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47462.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f083298
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+expect(expected, actual) {}
+main() {}
+typedef MyList<T extends num> = List<T>;
diff --git a/pkg/front_end/testcases/general/issue47462.dart.weak.expect b/pkg/front_end/testcases/general/issue47462.dart.weak.expect
new file mode 100644
index 0000000..2a6bd0b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart.weak.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num*>
+  #C7 = null
+}
diff --git a/pkg/front_end/testcases/general/issue47462.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47462.dart.weak.outline.expect
new file mode 100644
index 0000000..b89a67b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart.weak.outline.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
diff --git a/pkg/front_end/testcases/general/issue47462.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47462.dart.weak.transformed.expect
new file mode 100644
index 0000000..9e2f5a1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart.weak.transformed.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::_List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num*>
+  #C7 = null
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:18:16 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:19:17 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 52, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.expect b/pkg/front_end/testcases/general/private_members.dart.weak.expect
index bf194cb..7d67ee2 100644
--- a/pkg/front_end/testcases/general/private_members.dart.weak.expect
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.expect
@@ -13,7 +13,7 @@
 class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
   field core::int _privateField = 1;
   field core::int _privateFinalField = 1;
-  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _privateConstructor() → self::_Class
     : super core::Object::•()
     ;
@@ -56,3 +56,7 @@
 static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
   return 42;
 static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
+
+constants  {
+  #C1 = constructor-tearoff self::_Class::_privateRedirectingFactory
+}
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
index fdc9a0e..c51001d 100644
--- a/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
@@ -46,3 +46,8 @@
   ;
 static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///private_members_part.dart:11:7 -> ConstructorTearOffConstant(_Class._privateRedirectingFactory)
+Extra constant evaluation: evaluated: 6, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
index bf194cb..7d67ee2 100644
--- a/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
 class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
   field core::int _privateField = 1;
   field core::int _privateFinalField = 1;
-  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _privateConstructor() → self::_Class
     : super core::Object::•()
     ;
@@ -56,3 +56,7 @@
 static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
   return 42;
 static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
+
+constants  {
+  #C1 = constructor-tearoff self::_Class::_privateRedirectingFactory
+}
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.expect b/pkg/front_end/testcases/general/qualified.dart.weak.expect
index 4deccd1..59d3ddb 100644
--- a/pkg/front_end/testcases/general/qualified.dart.weak.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.expect
@@ -73,7 +73,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static final field dynamic _redirecting# = <dynamic>[self::C::b];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
@@ -114,7 +114,7 @@
 
 typedef VoidFunction = () →* void;
 class C<T extends core::Object* = dynamic> extends self::C<lib::C::T*> {
-  static final field dynamic _redirecting# = <dynamic>[lib::C::b];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor •() → lib::C<lib::C::T*>*
     : super self::C::•()
     ;
@@ -160,3 +160,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
+
+constants  {
+  #C1 = constructor-tearoff self::C::b
+  #C2 = constructor-tearoff lib::C::b
+}
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect b/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect
index 7528cb9..57448e6 100644
--- a/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect
@@ -143,3 +143,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///qualified_part.dart:7:7 -> ConstructorTearOffConstant(C.b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///qualified_lib.dart:9:7 -> ConstructorTearOffConstant(C.b)
+Extra constant evaluation: evaluated: 7, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect b/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect
index a982723..83dac20 100644
--- a/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect
@@ -74,7 +74,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static final field dynamic _redirecting# = <dynamic>[self::C::b];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
@@ -115,7 +115,7 @@
 
 typedef VoidFunction = () →* void;
 class C<T extends core::Object* = dynamic> extends self::C<lib::C::T*> {
-  static final field dynamic _redirecting# = <dynamic>[lib::C::b];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor •() → lib::C<lib::C::T*>*
     : super self::C::•()
     ;
@@ -161,3 +161,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
+
+constants  {
+  #C1 = constructor-tearoff self::C::b
+  #C2 = constructor-tearoff lib::C::b
+}
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect
index 0173839..293f8a2 100644
--- a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -28,3 +28,7 @@
 static method main() → dynamic {
   new self::B::•();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::fisk
+}
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect
index 94296d3..2ae8aaa 100644
--- a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect
@@ -25,3 +25,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_constructor.dart:5:7 -> ConstructorTearOffConstant(A.fisk)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect
index 0173839..293f8a2 100644
--- a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -28,3 +28,7 @@
 static method main() → dynamic {
   new self::B::•();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::fisk
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect
index 6155d9d..ba2466c 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect
@@ -12,7 +12,7 @@
 import "dart:core" as core;
 
 abstract class FooBase<Tf extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::FooBase::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   abstract get x() → core::int*;
   static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
     return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
@@ -32,7 +32,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
-  static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
     return new self::Bar::•<core::String*, self::Foo::•::T*>(x);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,7 +86,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static final field dynamic _redirecting# = <dynamic>[#C3];
   static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
     return self::SimpleCaseImpl::•<self::SimpleCase::•::A*, self::SimpleCase::•::B*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -101,7 +101,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class SimpleCaseImpl<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai*, self::SimpleCaseImpl::Bi*> {
-  static final field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static final field dynamic _redirecting# = <dynamic>[#C4];
   static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
     return new self::SimpleCaseImpl2::•<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -174,3 +174,10 @@
   new self::SimpleCaseImpl2::•<core::int*, core::double*>();
   new self::Mix::•<core::double*>();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::FooBase::•
+  #C2 = constructor-tearoff self::Foo::•
+  #C3 = constructor-tearoff self::SimpleCase::•
+  #C4 = constructor-tearoff self::SimpleCaseImpl::•
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect
index 611e0cc..6978627 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect
@@ -156,3 +156,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory.dart:5:16 -> ConstructorTearOffConstant(FooBase.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory.dart:10:16 -> ConstructorTearOffConstant(Foo.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory.dart:27:7 -> ConstructorTearOffConstant(SimpleCase.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory.dart:31:7 -> ConstructorTearOffConstant(SimpleCaseImpl.)
+Extra constant evaluation: evaluated: 12, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect
index 0f768e15..025c11c 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
 import "dart:core" as core;
 
 abstract class FooBase<Tf extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::FooBase::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   abstract get x() → core::int*;
   static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
     return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
@@ -32,7 +32,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
-  static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
     return new self::Bar::•<core::String*, self::Foo::•::T*>(x);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,7 +86,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static final field dynamic _redirecting# = <dynamic>[#C3];
   static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
     return self::SimpleCaseImpl::•<self::SimpleCase::•::A*, self::SimpleCase::•::B*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -101,7 +101,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class SimpleCaseImpl<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai*, self::SimpleCaseImpl::Bi*> {
-  static final field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static final field dynamic _redirecting# = <dynamic>[#C4];
   static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
     return new self::SimpleCaseImpl2::•<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -174,3 +174,10 @@
   new self::SimpleCaseImpl2::•<core::int*, core::double*>();
   new self::Mix::•<core::double*>();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::FooBase::•
+  #C2 = constructor-tearoff self::Foo::•
+  #C3 = constructor-tearoff self::SimpleCase::•
+  #C4 = constructor-tearoff self::SimpleCaseImpl::•
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect
index 16a9cdc..e86259e 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -25,3 +25,8 @@
 static method main() → dynamic {
   new self::A::•();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::first
+  #C2 = constructor-tearoff self::A::second
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect
index 3f90310..8eeb6bc 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect
@@ -23,3 +23,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_chain_test.dart:10:7 -> ConstructorTearOffConstant(A.first)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_chain_test.dart:10:7 -> ConstructorTearOffConstant(A.second)
+Extra constant evaluation: evaluated: 5, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect
index 16a9cdc..e86259e 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -25,3 +25,8 @@
 static method main() → dynamic {
   new self::A::•();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::first
+  #C2 = constructor-tearoff self::A::second
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect
index e5a7448..3dc0b99 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class _X<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
     return new self::_Y::•<self::_X::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -50,7 +50,7 @@
 }
 class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
   constructor •() → self::B<self::B::T*>*
-    : super self::A::•(#C1)
+    : super self::A::•(#C2)
     ;
 }
 static method main() → dynamic {
@@ -61,7 +61,8 @@
 }
 
 constants  {
-  #C1 = self::_Y<Null> {}
+  #C1 = constructor-tearoff self::_X::•
+  #C2 = self::_Y<Null> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect
index 55c2b59..23c7bac 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect
@@ -53,3 +53,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_const_inference.dart:9:7 -> ConstructorTearOffConstant(_X.)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect
index e5a7448..3dc0b99 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class _X<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
     return new self::_Y::•<self::_X::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -50,7 +50,7 @@
 }
 class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
   constructor •() → self::B<self::B::T*>*
-    : super self::A::•(#C1)
+    : super self::A::•(#C2)
     ;
 }
 static method main() → dynamic {
@@ -61,7 +61,8 @@
 }
 
 constants  {
-  #C1 = self::_Y<Null> {}
+  #C1 = constructor-tearoff self::_X::•
+  #C2 = self::_Y<Null> {}
 }
 
 
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 f1030db..4a74b87 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
@@ -12,8 +12,8 @@
 
 class A extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::A
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
   static factory redirect([core::int field]) → self::A
@@ -31,5 +31,6 @@
 }
 
 constants  {
-  #C1 = 42
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = 42
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
index c031d22..7669a3f 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
@@ -14,3 +14,8 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_default_value.dart:5:7 -> ConstructorTearOffConstant(A.redirect)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
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 f1030db..4a74b87 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
@@ -12,8 +12,8 @@
 
 class A extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
-  constructor •([core::int field = #C1]) → self::A
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
   static factory redirect([core::int field]) → self::A
@@ -31,5 +31,6 @@
 }
 
 constants  {
-  #C1 = 42
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = 42
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect
index 27d959b..f674d71 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect
@@ -101,7 +101,7 @@
 
 class Class1 extends core::Object {
   field core::int field = 0;
-  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor _() → self::Class1
     : super core::Object::•()
     ;
@@ -184,12 +184,13 @@
     super.foo(new self::Class1::_());
     super.+(new self::Class1::_());
   }
-  method method({dynamic a = #C1}) → dynamic {}
+  method method({dynamic a = #C2}) → dynamic {}
   get call() → core::int
     return 0;
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = null
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect
index 8977ba1..70bc2cc 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect
@@ -23,3 +23,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_invocation_in_invalid.dart:5:7 -> ConstructorTearOffConstant(Class1.)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect
index 39405c7..4f4319e 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect
@@ -18,7 +18,7 @@
 typedef Typedef4<@#C1 unrelated T extends core::Object? = dynamic> = (@#C1 dynamic o1, {@#C1 dynamic o2}) → void;
 @#C1
 class Const extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::Const::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   const constructor internal() → self::Const
     : super core::Object::•()
     ;
@@ -27,24 +27,24 @@
 }
 class Class<@#C1 T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  field <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {
+  field <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {
     @#C1 dynamic l1;
     @#C1
-    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {}
+    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {}
   };
   @#C1
   constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
   @#C1
-  method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → dynamic {
+  method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
     @#C1 dynamic l1;
     @#C1
-    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
   }
   @#C1
-  method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → dynamic {
-    <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {};
+  method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+    <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
   }
 }
 @#C1
@@ -56,46 +56,47 @@
   tearoff method2 = self::Extension|get#method2;
 }
 @#C1
-static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {
+static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 };
 @#C1
-static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null Extension|field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {
+static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null Extension|field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 };
 @#C1
-static method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → dynamic {
+static method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 }
 @#C1
-static method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → dynamic {
-  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {};
+static method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
 }
 @#C1
-static method Extension|method1<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method1::#T%> #this, @#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → dynamic {
+static method Extension|method1<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method1::#T%> #this, @#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 }
 static method Extension|get#method1<#T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method1::#T%> #this) → <T extends core::Object? = dynamic>(dynamic, [dynamic]) → dynamic
-  return <T extends core::Object? = dynamic>(dynamic o1, [dynamic o2 = #C2]) → dynamic => self::Extension|method1<self::Extension|get#method1::#T%, T%>(#this, o1, o2);
+  return <T extends core::Object? = dynamic>(dynamic o1, [dynamic o2 = #C3]) → dynamic => self::Extension|method1<self::Extension|get#method1::#T%, T%>(#this, o1, o2);
 @#C1
-static method Extension|method2<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method2::#T%> #this, @#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → dynamic {
-  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {};
+static method Extension|method2<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method2::#T%> #this, @#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
 }
 static method Extension|get#method2<#T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method2::#T%> #this) → <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → dynamic
-  return <T extends core::Object? = dynamic>(dynamic o1, {dynamic o2 = #C2}) → dynamic => self::Extension|method2<self::Extension|get#method2::#T%, T%>(#this, o1, o2: o2);
+  return <T extends core::Object? = dynamic>(dynamic o1, {dynamic o2 = #C3}) → dynamic => self::Extension|method2<self::Extension|get#method2::#T%, T%>(#this, o1, o2: o2);
 static method main() → dynamic {}
 
 constants  {
   #C1 = self::Const {}
-  #C2 = null
+  #C2 = constructor-tearoff self::Const::•
+  #C3 = null
 }
 
 
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.outline.expect
index 777c550..ac02ea3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.outline.expect
@@ -80,6 +80,7 @@
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:85:2 -> InstanceConstant(const Const{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:86:24 -> InstanceConstant(const Const{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:17:2 -> InstanceConstant(const Const{})
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:18:7 -> ConstructorTearOffConstant(Const.)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:46:14 -> InstanceConstant(const Const{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:56:4 -> InstanceConstant(const Const{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:59:4 -> InstanceConstant(const Const{})
@@ -98,4 +99,4 @@
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:109:12 -> InstanceConstant(const Const{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:23:2 -> InstanceConstant(const Const{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:90:4 -> InstanceConstant(const Const{})
-Extra constant evaluation: evaluated: 41, effectively constant: 28
+Extra constant evaluation: evaluated: 41, effectively constant: 29
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect
index 39405c7..4f4319e 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect
@@ -18,7 +18,7 @@
 typedef Typedef4<@#C1 unrelated T extends core::Object? = dynamic> = (@#C1 dynamic o1, {@#C1 dynamic o2}) → void;
 @#C1
 class Const extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::Const::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   const constructor internal() → self::Const
     : super core::Object::•()
     ;
@@ -27,24 +27,24 @@
 }
 class Class<@#C1 T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  field <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {
+  field <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {
     @#C1 dynamic l1;
     @#C1
-    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {}
+    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {}
   };
   @#C1
   constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
   @#C1
-  method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → dynamic {
+  method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
     @#C1 dynamic l1;
     @#C1
-    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
   }
   @#C1
-  method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → dynamic {
-    <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {};
+  method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+    <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
   }
 }
 @#C1
@@ -56,46 +56,47 @@
   tearoff method2 = self::Extension|get#method2;
 }
 @#C1
-static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {
+static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 };
 @#C1
-static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null Extension|field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {
+static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null Extension|field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 };
 @#C1
-static method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → dynamic {
+static method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 }
 @#C1
-static method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → dynamic {
-  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {};
+static method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
 }
 @#C1
-static method Extension|method1<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method1::#T%> #this, @#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → dynamic {
+static method Extension|method1<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method1::#T%> #this, @#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
   @#C1 dynamic l1;
   @#C1
-  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C2]) → Null {}
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
 }
 static method Extension|get#method1<#T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method1::#T%> #this) → <T extends core::Object? = dynamic>(dynamic, [dynamic]) → dynamic
-  return <T extends core::Object? = dynamic>(dynamic o1, [dynamic o2 = #C2]) → dynamic => self::Extension|method1<self::Extension|get#method1::#T%, T%>(#this, o1, o2);
+  return <T extends core::Object? = dynamic>(dynamic o1, [dynamic o2 = #C3]) → dynamic => self::Extension|method1<self::Extension|get#method1::#T%, T%>(#this, o1, o2);
 @#C1
-static method Extension|method2<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method2::#T%> #this, @#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → dynamic {
-  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C2}) → Null {};
+static method Extension|method2<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method2::#T%> #this, @#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
 }
 static method Extension|get#method2<#T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method2::#T%> #this) → <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → dynamic
-  return <T extends core::Object? = dynamic>(dynamic o1, {dynamic o2 = #C2}) → dynamic => self::Extension|method2<self::Extension|get#method2::#T%, T%>(#this, o1, o2: o2);
+  return <T extends core::Object? = dynamic>(dynamic o1, {dynamic o2 = #C3}) → dynamic => self::Extension|method2<self::Extension|get#method2::#T%, T%>(#this, o1, o2: o2);
 static method main() → dynamic {}
 
 constants  {
   #C1 = self::Const {}
-  #C2 = null
+  #C2 = constructor-tearoff self::Const::•
+  #C3 = null
 }
 
 
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect
index 9cea1c8..9b12539 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor named(dynamic p) → self::Foo*
     : super core::Object::•()
     ;
-  @#C1
-  static factory •(@#C2 @#C3 dynamic p) → self::Foo*
+  @#C2
+  static factory •(@#C3 @#C4 dynamic p) → self::Foo*
     return new self::Foo::named(p);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -21,13 +21,14 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static const field core::int* forParameter = #C2;
-static const field core::int* forFactoryItself = #C1;
-static const field core::int* anotherForParameter = #C3;
+static const field core::int* forParameter = #C3;
+static const field core::int* forFactoryItself = #C2;
+static const field core::int* anotherForParameter = #C4;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = 2
-  #C2 = 1
-  #C3 = 3
+  #C1 = constructor-tearoff self::Foo::•
+  #C2 = 2
+  #C3 = 1
+  #C4 = 3
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect
index f807177..69d94af 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect
@@ -29,4 +29,5 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///redirecting_factory_metadata.dart:15:4 -> IntConstant(2)
-Extra constant evaluation: evaluated: 5, effectively constant: 1
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_metadata.dart:14:7 -> ConstructorTearOffConstant(Foo.)
+Extra constant evaluation: evaluated: 5, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect
index 9cea1c8..9b12539 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor named(dynamic p) → self::Foo*
     : super core::Object::•()
     ;
-  @#C1
-  static factory •(@#C2 @#C3 dynamic p) → self::Foo*
+  @#C2
+  static factory •(@#C3 @#C4 dynamic p) → self::Foo*
     return new self::Foo::named(p);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -21,13 +21,14 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static const field core::int* forParameter = #C2;
-static const field core::int* forFactoryItself = #C1;
-static const field core::int* anotherForParameter = #C3;
+static const field core::int* forParameter = #C3;
+static const field core::int* forFactoryItself = #C2;
+static const field core::int* anotherForParameter = #C4;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = 2
-  #C2 = 1
-  #C3 = 3
+  #C1 = constructor-tearoff self::Foo::•
+  #C2 = 2
+  #C3 = 1
+  #C4 = 3
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect
index ca460af..f2a4360 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -23,3 +23,7 @@
 static method main() → dynamic {
   new self::A::•();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect
index 8549d41..20fd71c 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect
@@ -21,3 +21,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_simple_test.dart:10:7 -> ConstructorTearOffConstant(A.redir)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect
index ca460af..f2a4360 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -23,3 +23,7 @@
 static method main() → dynamic {
   new self::A::•();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
index b3ec99a..16c46e9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
@@ -23,7 +23,7 @@
     ;
 }
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -48,3 +48,7 @@
 static method main() → dynamic {
   new self::B::•<self::Y*>();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
index fedbec2..024a135 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
@@ -43,3 +43,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_typeargs_test.dart:15:7 -> ConstructorTearOffConstant(A.redir)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
index b3ec99a..16c46e9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
     ;
 }
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•()
     ;
@@ -48,3 +48,7 @@
 static method main() → dynamic {
   new self::B::•<self::Y*>();
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect
index d5fafac..469f2af 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     : super core::Object::•()
     ;
@@ -23,3 +23,7 @@
 static method main() → dynamic {
   new self::A::•<core::int*, core::String*>(42, "foobar");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect
index 3bf6457..795e0a9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect
@@ -21,3 +21,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_typeparam_test.dart:12:7 -> ConstructorTearOffConstant(A.redir)
+Extra constant evaluation: evaluated: 5, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect
index d5fafac..469f2af 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     : super core::Object::•()
     ;
@@ -23,3 +23,7 @@
 static method main() → dynamic {
   new self::A::•<core::int*, core::String*>(42, "foobar");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect
index 6b9f76b..98d4e12 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect
@@ -23,7 +23,7 @@
     ;
 }
 class A<T extends core::Object* = dynamic, S extends self::A::T* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     : super core::Object::•()
     ;
@@ -43,3 +43,7 @@
 static method main() → dynamic {
   new self::A::•<self::X*, self::Y*>(new self::X::•(), new self::Y::•());
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect
index 522c0dc..ef67ff4 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect
@@ -39,3 +39,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory_typeparambounds_test.dart:16:7 -> ConstructorTearOffConstant(A.redir)
+Extra constant evaluation: evaluated: 5, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect
index 6b9f76b..98d4e12 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
     ;
 }
 class A<T extends core::Object* = dynamic, S extends self::A::T* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::redir];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     : super core::Object::•()
     ;
@@ -43,3 +43,7 @@
 static method main() → dynamic {
   new self::A::•<self::X*, self::Y*>(new self::X::•(), new self::Y::•());
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect
index 45971e6..273bd861 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor empty() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -24,7 +24,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor empty() → self::B<self::B::U*, self::B::W*>*
     : super self::A::empty()
     ;
@@ -41,3 +41,8 @@
 static method main() → dynamic {
   exp::Expect::equals("${new self::C::•<core::int*, core::num*, core::String*>()}", "int,num,String");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect
index 97f2aa7..4a31e13 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect
@@ -36,3 +36,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_chain_type_arguments.dart:12:7 -> ConstructorTearOffConstant(A.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_chain_type_arguments.dart:17:7 -> ConstructorTearOffConstant(B.)
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect
index 45971e6..273bd861 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor empty() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -24,7 +24,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor empty() → self::B<self::B::U*, self::B::W*>*
     : super self::A::empty()
     ;
@@ -41,3 +41,8 @@
 static method main() → dynamic {
   exp::Expect::equals("${new self::C::•<core::int*, core::num*, core::String*>()}", "int,num,String");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect
index 21aa750..516d00c 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 abstract class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor empty() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -24,7 +24,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor empty() → self::B<self::B::U*, self::B::W*>*
     : super self::A::empty()
     ;
@@ -41,3 +41,8 @@
 static method main() → dynamic {
   exp::Expect::equals("${new self::C::•<core::int*, core::List<core::int*>*, core::Map<core::int*, core::List<core::int*>*>*>()}", "int,List<int>,Map<int, List<int>>");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect
index fc699bb..2736c94 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect
@@ -36,3 +36,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_chain_type_arguments_subst.dart:11:16 -> ConstructorTearOffConstant(A.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_chain_type_arguments_subst.dart:16:16 -> ConstructorTearOffConstant(B.)
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect
index 21aa750..516d00c 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 abstract class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor empty() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -24,7 +24,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor empty() → self::B<self::B::U*, self::B::W*>*
     : super self::A::empty()
     ;
@@ -41,3 +41,8 @@
 static method main() → dynamic {
   exp::Expect::equals("${new self::C::•<core::int*, core::List<core::int*>*, core::Map<core::int*, core::List<core::int*>*>*>()}", "int,List<int>,Map<int, List<int>>");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect
index e858e7d..be27ced 100644
--- a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 class A extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   const constructor empty() → self::A*
     : super core::Object::•()
     ;
@@ -31,11 +31,12 @@
     return "${self::B::T*}";
 }
 static method main() → void {
-  exp::Expect::equals("${#C1}", "String");
+  exp::Expect::equals("${#C2}", "String");
 }
 
 constants  {
-  #C1 = self::B<core::String*> {}
+  #C1 = constructor-tearoff self::A::•
+  #C2 = self::B<core::String*> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect
index 0d1b358..7640720 100644
--- a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect
@@ -31,3 +31,8 @@
 }
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_type_arguments.dart:10:7 -> ConstructorTearOffConstant(A.)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect
index e858e7d..be27ced 100644
--- a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 class A extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   const constructor empty() → self::A*
     : super core::Object::•()
     ;
@@ -31,11 +31,12 @@
     return "${self::B::T*}";
 }
 static method main() → void {
-  exp::Expect::equals("${#C1}", "String");
+  exp::Expect::equals("${#C2}", "String");
 }
 
 constants  {
-  #C1 = self::B<core::String*> {}
+  #C1 = constructor-tearoff self::A::•
+  #C2 = self::B<core::String*> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.expect b/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.expect
index 0dfa518..31bd8fe 100644
--- a/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.expect
+++ b/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.expect
@@ -617,9 +617,9 @@
   #C4 = TypeLiteralConstant(invalid-type)
   #C5 = TypeLiteralConstant(self::Class<invalid-type>*)
   #C6 = constructor-tearoff self::Class::•
-  #C7 = instantiation self::Class::• <invalid-type>
+  #C7 = instantiation #C6 <invalid-type>
   #C8 = TypeLiteralConstant(self::Class<self::Class<invalid-type>*>*)
-  #C9 = instantiation self::Class::• <self::Class<invalid-type>*>
+  #C9 = instantiation #C6 <self::Class<invalid-type>*>
   #C10 = self::Class<<S extends invalid-type>() →* void> {instanceField:#C1}
 }
 
diff --git a/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.transformed.expect b/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.transformed.expect
index c523d09..1da87de 100644
--- a/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.transformed.expect
@@ -617,9 +617,9 @@
   #C4 = TypeLiteralConstant(invalid-type)
   #C5 = TypeLiteralConstant(self::Class<invalid-type>*)
   #C6 = constructor-tearoff self::Class::•
-  #C7 = instantiation self::Class::• <invalid-type>
+  #C7 = instantiation #C6 <invalid-type>
   #C8 = TypeLiteralConstant(self::Class<self::Class<invalid-type>*>*)
-  #C9 = instantiation self::Class::• <self::Class<invalid-type>*>
+  #C9 = instantiation #C6 <self::Class<invalid-type>*>
   #C10 = self::Class<<S extends invalid-type>() →* void> {instanceField:#C1}
 }
 
diff --git a/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect
index 39507e3..f8cb2d3 100644
--- a/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect
@@ -12,7 +12,7 @@
   import "package:module/lib2.dart";
 
   abstract class XSet extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[lib1::XSet::identity];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     static factory identity() → lib1::XSet*
       return lib2::XLinkedHashSet::identity();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
@@ -33,7 +33,7 @@
   import "package:module/lib3.dart";
 
   class XLinkedHashSet extends dart.core::Object implements lib1::XSet {
-    static final field dynamic _redirecting# = <dynamic>[lib2::XLinkedHashSet::identity];
+    static final field dynamic _redirecting# = <dynamic>[#C2];
     static factory identity() → lib2::XLinkedHashSet*
       return new lib3::XIdentityHashSet::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
@@ -68,3 +68,7 @@
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
 }
+constants  {
+  #C1 = constructor-tearoff lib1::XSet::identity
+  #C2 = constructor-tearoff lib2::XLinkedHashSet::identity
+}
diff --git a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect
index 938df3f..b30010d 100644
--- a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect
@@ -9,7 +9,7 @@
 //
 
   class C extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[lib::C::e4];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     constructor •() → lib::C*
       : super dart.core::Object::•()
       ;
@@ -35,3 +35,6 @@
     lib::C* c = new lib::C::•();
   }
 }
+constants  {
+  #C1 = constructor-tearoff lib::C::e4
+}
diff --git a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect
index 991ad94..cc3198c 100644
--- a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect
@@ -9,7 +9,7 @@
 //
 
   class C extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[lib::C::e4];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     constructor •() → lib::C*
       : super dart.core::Object::•()
       ;
@@ -36,3 +36,6 @@
     dart.core::print(c);
   }
 }
+constants  {
+  #C1 = constructor-tearoff lib::C::e4
+}
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
index 41475f6..ff0ff25 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
@@ -51,32 +51,32 @@
       return new foo::Foo::_($creationLocationd_0dea112b090073317d4: #C12);
   }
   class Bar extends fra::Widget /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Bar::•]/*isLegacy*/;
+    static final field dynamic _redirecting# = <dynamic>[#C13]/*isLegacy*/;
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
       return new foo::Bar::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
     static method _#new#tearOff() → foo::Bar
-      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C16);
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C17);
     static method _#_#tearOff() → foo::Bar
-      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C18);
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C19);
   }
   class Baz extends fra::Widget /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Baz::_]/*isLegacy*/;
+    static final field dynamic _redirecting# = <dynamic>[#C20]/*isLegacy*/;
     const constructor __({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
-      return #C22;
+      return #C24;
     static method _#new#tearOff() → foo::Baz
-      return foo::Baz::•($creationLocationd_0dea112b090073317d4: #C23);
+      return foo::Baz::•($creationLocationd_0dea112b090073317d4: #C25);
     static factory _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       return new foo::Baz::__($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
     static method _#_#tearOff() → foo::Baz
-      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C25);
-    static method _#__#tearOff() → foo::Baz
       return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C27);
+    static method _#__#tearOff() → foo::Baz
+      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C29);
   }
   class Boz extends fra::Widget /*hasConstConstructor*/  {
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Boz
@@ -87,25 +87,25 @@
         return new foo::Boz::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
       }
       else {
-        return #C32;
+        return #C34;
       }
     }
     static method _#new#tearOff({required dart.core::bool createNew = #C1}) → foo::Boz
-      return foo::Boz::•(createNew: createNew, $creationLocationd_0dea112b090073317d4: #C33);
+      return foo::Boz::•(createNew: createNew, $creationLocationd_0dea112b090073317d4: #C35);
     static method _#_#tearOff() → foo::Boz
-      return new foo::Boz::_($creationLocationd_0dea112b090073317d4: #C35);
+      return new foo::Boz::_($creationLocationd_0dea112b090073317d4: #C37);
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
 
   import "org-dartlang-test:///foo.dart";
 
-  static field foo::Foo newFoo = foo::Foo::•($creationLocationd_0dea112b090073317d4: #C38);
-  static field foo::Bar newBar = new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C39);
-  static field foo::Bar constBar = #C42;
-  static field foo::Baz newBaz = foo::Baz::•($creationLocationd_0dea112b090073317d4: #C43);
-  static field foo::Boz newBoz = foo::Boz::•(createNew: true, $creationLocationd_0dea112b090073317d4: #C44);
-  static field foo::Boz constBoz = foo::Boz::•(createNew: false, $creationLocationd_0dea112b090073317d4: #C46);
+  static field foo::Foo newFoo = foo::Foo::•($creationLocationd_0dea112b090073317d4: #C40);
+  static field foo::Bar newBar = new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C41);
+  static field foo::Bar constBar = #C44;
+  static field foo::Baz newBaz = foo::Baz::•($creationLocationd_0dea112b090073317d4: #C45);
+  static field foo::Boz newBoz = foo::Boz::•(createNew: true, $creationLocationd_0dea112b090073317d4: #C46);
+  static field foo::Boz constBoz = foo::Boz::•(createNew: false, $creationLocationd_0dea112b090073317d4: #C48);
 }
 constants  {
   #C1 = null
@@ -120,38 +120,40 @@
   #C10 = 3.0
   #C11 = 7.0
   #C12 = wid::_Location {file:#C2, line:#C10, column:#C11, name:#C5, parameterLocations:#C1}
-  #C13 = 4.0
-  #C14 = 42.0
-  #C15 = "Bar"
-  #C16 = wid::_Location {file:#C2, line:#C13, column:#C14, name:#C15, parameterLocations:#C1}
-  #C17 = 5.0
-  #C18 = wid::_Location {file:#C2, line:#C17, column:#C11, name:#C15, parameterLocations:#C1}
-  #C19 = 6.0
-  #C20 = "Baz"
-  #C21 = wid::_Location {file:#C2, line:#C19, column:#C4, name:#C20, parameterLocations:#C1}
-  #C22 = foo::Baz {_location:#C21}
-  #C23 = wid::_Location {file:#C2, line:#C19, column:#C8, name:#C20, parameterLocations:#C1}
-  #C24 = 15.0
-  #C25 = wid::_Location {file:#C2, line:#C11, column:#C24, name:#C20, parameterLocations:#C1}
-  #C26 = 8.0
-  #C27 = wid::_Location {file:#C2, line:#C26, column:#C11, name:#C20, parameterLocations:#C1}
-  #C28 = 9.0
-  #C29 = 128.0
-  #C30 = "Boz"
-  #C31 = wid::_Location {file:#C2, line:#C28, column:#C29, name:#C30, parameterLocations:#C1}
-  #C32 = foo::Boz {_location:#C31}
-  #C33 = wid::_Location {file:#C2, line:#C28, column:#C8, name:#C30, parameterLocations:#C1}
-  #C34 = 10.0
-  #C35 = wid::_Location {file:#C2, line:#C34, column:#C11, name:#C30, parameterLocations:#C1}
-  #C36 = "org-dartlang-test:///main.dart"
-  #C37 = 18.0
-  #C38 = wid::_Location {file:#C36, line:#C3, column:#C37, name:#C5, parameterLocations:#C1}
-  #C39 = wid::_Location {file:#C36, line:#C10, column:#C37, name:#C15, parameterLocations:#C1}
-  #C40 = 22.0
-  #C41 = wid::_Location {file:#C36, line:#C13, column:#C40, name:#C15, parameterLocations:#C1}
-  #C42 = foo::Bar {_location:#C41}
-  #C43 = wid::_Location {file:#C36, line:#C17, column:#C37, name:#C20, parameterLocations:#C1}
-  #C44 = wid::_Location {file:#C36, line:#C19, column:#C37, name:#C30, parameterLocations:#C1}
-  #C45 = 20.0
-  #C46 = wid::_Location {file:#C36, line:#C11, column:#C45, name:#C30, parameterLocations:#C1}
+  #C13 = constructor-tearoff foo::Bar::•
+  #C14 = 4.0
+  #C15 = 42.0
+  #C16 = "Bar"
+  #C17 = wid::_Location {file:#C2, line:#C14, column:#C15, name:#C16, parameterLocations:#C1}
+  #C18 = 5.0
+  #C19 = wid::_Location {file:#C2, line:#C18, column:#C11, name:#C16, parameterLocations:#C1}
+  #C20 = constructor-tearoff foo::Baz::_
+  #C21 = 6.0
+  #C22 = "Baz"
+  #C23 = wid::_Location {file:#C2, line:#C21, column:#C4, name:#C22, parameterLocations:#C1}
+  #C24 = foo::Baz {_location:#C23}
+  #C25 = wid::_Location {file:#C2, line:#C21, column:#C8, name:#C22, parameterLocations:#C1}
+  #C26 = 15.0
+  #C27 = wid::_Location {file:#C2, line:#C11, column:#C26, name:#C22, parameterLocations:#C1}
+  #C28 = 8.0
+  #C29 = wid::_Location {file:#C2, line:#C28, column:#C11, name:#C22, parameterLocations:#C1}
+  #C30 = 9.0
+  #C31 = 128.0
+  #C32 = "Boz"
+  #C33 = wid::_Location {file:#C2, line:#C30, column:#C31, name:#C32, parameterLocations:#C1}
+  #C34 = foo::Boz {_location:#C33}
+  #C35 = wid::_Location {file:#C2, line:#C30, column:#C8, name:#C32, parameterLocations:#C1}
+  #C36 = 10.0
+  #C37 = wid::_Location {file:#C2, line:#C36, column:#C11, name:#C32, parameterLocations:#C1}
+  #C38 = "org-dartlang-test:///main.dart"
+  #C39 = 18.0
+  #C40 = wid::_Location {file:#C38, line:#C3, column:#C39, name:#C5, parameterLocations:#C1}
+  #C41 = wid::_Location {file:#C38, line:#C10, column:#C39, name:#C16, parameterLocations:#C1}
+  #C42 = 22.0
+  #C43 = wid::_Location {file:#C38, line:#C14, column:#C42, name:#C16, parameterLocations:#C1}
+  #C44 = foo::Bar {_location:#C43}
+  #C45 = wid::_Location {file:#C38, line:#C18, column:#C39, name:#C22, parameterLocations:#C1}
+  #C46 = wid::_Location {file:#C38, line:#C21, column:#C39, name:#C32, parameterLocations:#C1}
+  #C47 = 20.0
+  #C48 = wid::_Location {file:#C38, line:#C11, column:#C47, name:#C32, parameterLocations:#C1}
 }
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
index 6f610b2..47c45a0 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
@@ -51,32 +51,32 @@
       return new foo::Foo::_($creationLocationd_0dea112b090073317d4: #C12);
   }
   class Bar extends fra::Widget /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Bar::•]/*isLegacy*/;
+    static final field dynamic _redirecting# = <dynamic>[#C13]/*isLegacy*/;
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
       return new foo::Bar::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
     static method _#new#tearOff() → foo::Bar
-      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C16);
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C17);
     static method _#_#tearOff() → foo::Bar
-      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C18);
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C19);
   }
   class Baz extends fra::Widget /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Baz::_]/*isLegacy*/;
+    static final field dynamic _redirecting# = <dynamic>[#C20]/*isLegacy*/;
     const constructor __({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
-      return #C22;
+      return #C24;
     static method _#new#tearOff() → foo::Baz
-      return foo::Baz::•($creationLocationd_0dea112b090073317d4: #C23);
+      return foo::Baz::•($creationLocationd_0dea112b090073317d4: #C25);
     static factory _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       return new foo::Baz::__($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
     static method _#_#tearOff() → foo::Baz
-      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C25);
-    static method _#__#tearOff() → foo::Baz
       return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C27);
+    static method _#__#tearOff() → foo::Baz
+      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C29);
   }
   class Boz extends fra::Widget /*hasConstConstructor*/  {
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Boz
@@ -87,13 +87,13 @@
         return new foo::Boz::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
       }
       else {
-        return #C32;
+        return #C34;
       }
     }
     static method _#new#tearOff({required dart.core::bool createNew = #C1}) → foo::Boz
-      return foo::Boz::•(createNew: createNew, $creationLocationd_0dea112b090073317d4: #C33);
+      return foo::Boz::•(createNew: createNew, $creationLocationd_0dea112b090073317d4: #C35);
     static method _#_#tearOff() → foo::Boz
-      return new foo::Boz::_($creationLocationd_0dea112b090073317d4: #C35);
+      return new foo::Boz::_($creationLocationd_0dea112b090073317d4: #C37);
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -114,27 +114,29 @@
   #C10 = 3.0
   #C11 = 7.0
   #C12 = wid::_Location {file:#C2, line:#C10, column:#C11, name:#C5, parameterLocations:#C1}
-  #C13 = 4.0
-  #C14 = 42.0
-  #C15 = "Bar"
-  #C16 = wid::_Location {file:#C2, line:#C13, column:#C14, name:#C15, parameterLocations:#C1}
-  #C17 = 5.0
-  #C18 = wid::_Location {file:#C2, line:#C17, column:#C11, name:#C15, parameterLocations:#C1}
-  #C19 = 6.0
-  #C20 = "Baz"
-  #C21 = wid::_Location {file:#C2, line:#C19, column:#C4, name:#C20, parameterLocations:#C1}
-  #C22 = foo::Baz {_location:#C21}
-  #C23 = wid::_Location {file:#C2, line:#C19, column:#C8, name:#C20, parameterLocations:#C1}
-  #C24 = 15.0
-  #C25 = wid::_Location {file:#C2, line:#C11, column:#C24, name:#C20, parameterLocations:#C1}
-  #C26 = 8.0
-  #C27 = wid::_Location {file:#C2, line:#C26, column:#C11, name:#C20, parameterLocations:#C1}
-  #C28 = 9.0
-  #C29 = 128.0
-  #C30 = "Boz"
-  #C31 = wid::_Location {file:#C2, line:#C28, column:#C29, name:#C30, parameterLocations:#C1}
-  #C32 = foo::Boz {_location:#C31}
-  #C33 = wid::_Location {file:#C2, line:#C28, column:#C8, name:#C30, parameterLocations:#C1}
-  #C34 = 10.0
-  #C35 = wid::_Location {file:#C2, line:#C34, column:#C11, name:#C30, parameterLocations:#C1}
+  #C13 = constructor-tearoff foo::Bar::•
+  #C14 = 4.0
+  #C15 = 42.0
+  #C16 = "Bar"
+  #C17 = wid::_Location {file:#C2, line:#C14, column:#C15, name:#C16, parameterLocations:#C1}
+  #C18 = 5.0
+  #C19 = wid::_Location {file:#C2, line:#C18, column:#C11, name:#C16, parameterLocations:#C1}
+  #C20 = constructor-tearoff foo::Baz::_
+  #C21 = 6.0
+  #C22 = "Baz"
+  #C23 = wid::_Location {file:#C2, line:#C21, column:#C4, name:#C22, parameterLocations:#C1}
+  #C24 = foo::Baz {_location:#C23}
+  #C25 = wid::_Location {file:#C2, line:#C21, column:#C8, name:#C22, parameterLocations:#C1}
+  #C26 = 15.0
+  #C27 = wid::_Location {file:#C2, line:#C11, column:#C26, name:#C22, parameterLocations:#C1}
+  #C28 = 8.0
+  #C29 = wid::_Location {file:#C2, line:#C28, column:#C11, name:#C22, parameterLocations:#C1}
+  #C30 = 9.0
+  #C31 = 128.0
+  #C32 = "Boz"
+  #C33 = wid::_Location {file:#C2, line:#C30, column:#C31, name:#C32, parameterLocations:#C1}
+  #C34 = foo::Boz {_location:#C33}
+  #C35 = wid::_Location {file:#C2, line:#C30, column:#C8, name:#C32, parameterLocations:#C1}
+  #C36 = 10.0
+  #C37 = wid::_Location {file:#C2, line:#C36, column:#C11, name:#C32, parameterLocations:#C1}
 }
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
index 41475f6..ff0ff25 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
@@ -51,32 +51,32 @@
       return new foo::Foo::_($creationLocationd_0dea112b090073317d4: #C12);
   }
   class Bar extends fra::Widget /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Bar::•]/*isLegacy*/;
+    static final field dynamic _redirecting# = <dynamic>[#C13]/*isLegacy*/;
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
       return new foo::Bar::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
     static method _#new#tearOff() → foo::Bar
-      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C16);
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C17);
     static method _#_#tearOff() → foo::Bar
-      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C18);
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C19);
   }
   class Baz extends fra::Widget /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Baz::_]/*isLegacy*/;
+    static final field dynamic _redirecting# = <dynamic>[#C20]/*isLegacy*/;
     const constructor __({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
-      return #C22;
+      return #C24;
     static method _#new#tearOff() → foo::Baz
-      return foo::Baz::•($creationLocationd_0dea112b090073317d4: #C23);
+      return foo::Baz::•($creationLocationd_0dea112b090073317d4: #C25);
     static factory _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       return new foo::Baz::__($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
     static method _#_#tearOff() → foo::Baz
-      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C25);
-    static method _#__#tearOff() → foo::Baz
       return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C27);
+    static method _#__#tearOff() → foo::Baz
+      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: #C29);
   }
   class Boz extends fra::Widget /*hasConstConstructor*/  {
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Boz
@@ -87,25 +87,25 @@
         return new foo::Boz::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
       }
       else {
-        return #C32;
+        return #C34;
       }
     }
     static method _#new#tearOff({required dart.core::bool createNew = #C1}) → foo::Boz
-      return foo::Boz::•(createNew: createNew, $creationLocationd_0dea112b090073317d4: #C33);
+      return foo::Boz::•(createNew: createNew, $creationLocationd_0dea112b090073317d4: #C35);
     static method _#_#tearOff() → foo::Boz
-      return new foo::Boz::_($creationLocationd_0dea112b090073317d4: #C35);
+      return new foo::Boz::_($creationLocationd_0dea112b090073317d4: #C37);
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
 
   import "org-dartlang-test:///foo.dart";
 
-  static field foo::Foo newFoo = foo::Foo::•($creationLocationd_0dea112b090073317d4: #C38);
-  static field foo::Bar newBar = new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C39);
-  static field foo::Bar constBar = #C42;
-  static field foo::Baz newBaz = foo::Baz::•($creationLocationd_0dea112b090073317d4: #C43);
-  static field foo::Boz newBoz = foo::Boz::•(createNew: true, $creationLocationd_0dea112b090073317d4: #C44);
-  static field foo::Boz constBoz = foo::Boz::•(createNew: false, $creationLocationd_0dea112b090073317d4: #C46);
+  static field foo::Foo newFoo = foo::Foo::•($creationLocationd_0dea112b090073317d4: #C40);
+  static field foo::Bar newBar = new foo::Bar::_($creationLocationd_0dea112b090073317d4: #C41);
+  static field foo::Bar constBar = #C44;
+  static field foo::Baz newBaz = foo::Baz::•($creationLocationd_0dea112b090073317d4: #C45);
+  static field foo::Boz newBoz = foo::Boz::•(createNew: true, $creationLocationd_0dea112b090073317d4: #C46);
+  static field foo::Boz constBoz = foo::Boz::•(createNew: false, $creationLocationd_0dea112b090073317d4: #C48);
 }
 constants  {
   #C1 = null
@@ -120,38 +120,40 @@
   #C10 = 3.0
   #C11 = 7.0
   #C12 = wid::_Location {file:#C2, line:#C10, column:#C11, name:#C5, parameterLocations:#C1}
-  #C13 = 4.0
-  #C14 = 42.0
-  #C15 = "Bar"
-  #C16 = wid::_Location {file:#C2, line:#C13, column:#C14, name:#C15, parameterLocations:#C1}
-  #C17 = 5.0
-  #C18 = wid::_Location {file:#C2, line:#C17, column:#C11, name:#C15, parameterLocations:#C1}
-  #C19 = 6.0
-  #C20 = "Baz"
-  #C21 = wid::_Location {file:#C2, line:#C19, column:#C4, name:#C20, parameterLocations:#C1}
-  #C22 = foo::Baz {_location:#C21}
-  #C23 = wid::_Location {file:#C2, line:#C19, column:#C8, name:#C20, parameterLocations:#C1}
-  #C24 = 15.0
-  #C25 = wid::_Location {file:#C2, line:#C11, column:#C24, name:#C20, parameterLocations:#C1}
-  #C26 = 8.0
-  #C27 = wid::_Location {file:#C2, line:#C26, column:#C11, name:#C20, parameterLocations:#C1}
-  #C28 = 9.0
-  #C29 = 128.0
-  #C30 = "Boz"
-  #C31 = wid::_Location {file:#C2, line:#C28, column:#C29, name:#C30, parameterLocations:#C1}
-  #C32 = foo::Boz {_location:#C31}
-  #C33 = wid::_Location {file:#C2, line:#C28, column:#C8, name:#C30, parameterLocations:#C1}
-  #C34 = 10.0
-  #C35 = wid::_Location {file:#C2, line:#C34, column:#C11, name:#C30, parameterLocations:#C1}
-  #C36 = "org-dartlang-test:///main.dart"
-  #C37 = 18.0
-  #C38 = wid::_Location {file:#C36, line:#C3, column:#C37, name:#C5, parameterLocations:#C1}
-  #C39 = wid::_Location {file:#C36, line:#C10, column:#C37, name:#C15, parameterLocations:#C1}
-  #C40 = 22.0
-  #C41 = wid::_Location {file:#C36, line:#C13, column:#C40, name:#C15, parameterLocations:#C1}
-  #C42 = foo::Bar {_location:#C41}
-  #C43 = wid::_Location {file:#C36, line:#C17, column:#C37, name:#C20, parameterLocations:#C1}
-  #C44 = wid::_Location {file:#C36, line:#C19, column:#C37, name:#C30, parameterLocations:#C1}
-  #C45 = 20.0
-  #C46 = wid::_Location {file:#C36, line:#C11, column:#C45, name:#C30, parameterLocations:#C1}
+  #C13 = constructor-tearoff foo::Bar::•
+  #C14 = 4.0
+  #C15 = 42.0
+  #C16 = "Bar"
+  #C17 = wid::_Location {file:#C2, line:#C14, column:#C15, name:#C16, parameterLocations:#C1}
+  #C18 = 5.0
+  #C19 = wid::_Location {file:#C2, line:#C18, column:#C11, name:#C16, parameterLocations:#C1}
+  #C20 = constructor-tearoff foo::Baz::_
+  #C21 = 6.0
+  #C22 = "Baz"
+  #C23 = wid::_Location {file:#C2, line:#C21, column:#C4, name:#C22, parameterLocations:#C1}
+  #C24 = foo::Baz {_location:#C23}
+  #C25 = wid::_Location {file:#C2, line:#C21, column:#C8, name:#C22, parameterLocations:#C1}
+  #C26 = 15.0
+  #C27 = wid::_Location {file:#C2, line:#C11, column:#C26, name:#C22, parameterLocations:#C1}
+  #C28 = 8.0
+  #C29 = wid::_Location {file:#C2, line:#C28, column:#C11, name:#C22, parameterLocations:#C1}
+  #C30 = 9.0
+  #C31 = 128.0
+  #C32 = "Boz"
+  #C33 = wid::_Location {file:#C2, line:#C30, column:#C31, name:#C32, parameterLocations:#C1}
+  #C34 = foo::Boz {_location:#C33}
+  #C35 = wid::_Location {file:#C2, line:#C30, column:#C8, name:#C32, parameterLocations:#C1}
+  #C36 = 10.0
+  #C37 = wid::_Location {file:#C2, line:#C36, column:#C11, name:#C32, parameterLocations:#C1}
+  #C38 = "org-dartlang-test:///main.dart"
+  #C39 = 18.0
+  #C40 = wid::_Location {file:#C38, line:#C3, column:#C39, name:#C5, parameterLocations:#C1}
+  #C41 = wid::_Location {file:#C38, line:#C10, column:#C39, name:#C16, parameterLocations:#C1}
+  #C42 = 22.0
+  #C43 = wid::_Location {file:#C38, line:#C14, column:#C42, name:#C16, parameterLocations:#C1}
+  #C44 = foo::Bar {_location:#C43}
+  #C45 = wid::_Location {file:#C38, line:#C18, column:#C39, name:#C22, parameterLocations:#C1}
+  #C46 = wid::_Location {file:#C38, line:#C21, column:#C39, name:#C32, parameterLocations:#C1}
+  #C47 = 20.0
+  #C48 = wid::_Location {file:#C38, line:#C11, column:#C47, name:#C32, parameterLocations:#C1}
 }
diff --git a/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect b/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect
index 008ff7a..20a26f1 100644
--- a/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect
@@ -2,7 +2,7 @@
 library from "org-dartlang-test:///foo.dart" as foo {
 
   abstract class Key extends dart.core::Object /*hasConstConstructor*/  {
-    static final field dynamic _redirecting# = <dynamic>[foo::Key::•];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     const constructor empty() → foo::Key*
       : super dart.core::Object::•()
       ;
@@ -45,3 +45,6 @@
     dart.core::print("${k}");
   }
 }
+constants  {
+  #C1 = constructor-tearoff foo::Key::•
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect
index 02964ab..b8a5016 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect
@@ -4,7 +4,7 @@
   import "org-dartlang-test:///lib2.dart";
 
   class Foo extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[lib1::Foo::•];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     static factory •() → lib1::Foo*
       return new lib2::Bar::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
@@ -51,3 +51,6 @@
     lib1::libMethod();
   }
 }
+constants  {
+  #C1 = constructor-tearoff lib1::Foo::•
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect
index 14d998a..ba249a3 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect
@@ -4,7 +4,7 @@
   import "org-dartlang-test:///lib2.dart";
 
   class Foo extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[lib1::Foo::•];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     static factory •() → lib1::Foo*
       return new lib2::Bar::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
@@ -52,3 +52,6 @@
     lib1::libMethod();
   }
 }
+constants  {
+  #C1 = constructor-tearoff lib1::Foo::•
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect
index 8cde08e..7aa880b 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect
@@ -2,7 +2,7 @@
 library from "org-dartlang-test:///main.dart" as main {
 
   class Foo extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[main::Foo::bar];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     constructor •() → main::Foo*
       : super dart.core::Object::•()
       ;
@@ -26,3 +26,6 @@
       ;
   }
 }
+constants  {
+  #C1 = constructor-tearoff main::Foo::bar
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect
index 8cde08e..7aa880b 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect
@@ -2,7 +2,7 @@
 library from "org-dartlang-test:///main.dart" as main {
 
   class Foo extends dart.core::Object {
-    static final field dynamic _redirecting# = <dynamic>[main::Foo::bar];
+    static final field dynamic _redirecting# = <dynamic>[#C1];
     constructor •() → main::Foo*
       : super dart.core::Object::•()
       ;
@@ -26,3 +26,6 @@
       ;
   }
 }
+constants  {
+  #C1 = constructor-tearoff main::Foo::bar
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect
index ec2714c..7f8c3dd 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   abstract get t() → self::C::T*;
   abstract set t(covariant-by-class self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
@@ -38,3 +38,7 @@
 static method main() → dynamic {
   self::C<core::int*>* x = new self::CImpl::•<core::int*>(42);
 }
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect
index a882ba7..f6167ed 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect
@@ -36,3 +36,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructors_infer_from_arguments_redirecting_factory.dart:8:16 -> ConstructorTearOffConstant(C.)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect
index ec2714c..7f8c3dd 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   abstract get t() → self::C::T*;
   abstract set t(covariant-by-class self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
@@ -38,3 +38,7 @@
 static method main() → dynamic {
   self::C<core::int*>* x = new self::CImpl::•<core::int*>(42);
 }
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect
index cf8581d..a2fd0ae 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   abstract get t() → self::C::T*;
   abstract set t(covariant-by-class self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
@@ -40,3 +40,7 @@
 static method main() → dynamic {
   self::C<core::int*>* x = self::CImpl::•<core::int*>(42);
 }
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect
index f2e7522..0980409 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect
@@ -38,3 +38,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructors_infer_from_arguments_redirecting_factory_to_factory.dart:8:16 -> ConstructorTearOffConstant(C.)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect
index cf8581d..a2fd0ae 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   abstract get t() → self::C::T*;
   abstract set t(covariant-by-class self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
@@ -40,3 +40,7 @@
 static method main() → dynamic {
   self::C<core::int*>* x = self::CImpl::•<core::int*>(42);
 }
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
index 937b216..a033796 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
@@ -177,13 +177,13 @@
 
 constants  {
   #C1 = static-tearoff math::max
-  #C2 = instantiation math::max <core::int*>
-  #C3 = instantiation math::max <core::double*>
-  #C4 = instantiation math::max <core::num*>
-  #C5 = instantiation math::max <core::Object*>
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::double*>
+  #C4 = instantiation #C1 <core::num*>
+  #C5 = instantiation #C1 <core::Object*>
   #C6 = static-tearoff math::min
-  #C7 = instantiation math::min <core::int*>
-  #C8 = instantiation math::min <core::double*>
-  #C9 = instantiation math::min <core::num*>
-  #C10 = instantiation math::min <core::Object*>
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = instantiation #C6 <core::double*>
+  #C9 = instantiation #C6 <core::num*>
+  #C10 = instantiation #C6 <core::Object*>
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
index 937b216..a033796 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
@@ -177,13 +177,13 @@
 
 constants  {
   #C1 = static-tearoff math::max
-  #C2 = instantiation math::max <core::int*>
-  #C3 = instantiation math::max <core::double*>
-  #C4 = instantiation math::max <core::num*>
-  #C5 = instantiation math::max <core::Object*>
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::double*>
+  #C4 = instantiation #C1 <core::num*>
+  #C5 = instantiation #C1 <core::Object*>
   #C6 = static-tearoff math::min
-  #C7 = instantiation math::min <core::int*>
-  #C8 = instantiation math::min <core::double*>
-  #C9 = instantiation math::min <core::num*>
-  #C10 = instantiation math::min <core::Object*>
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = instantiation #C6 <core::double*>
+  #C9 = instantiation #C6 <core::num*>
+  #C10 = instantiation #C6 <core::Object*>
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect
index 5a16fe2..5a1deb3 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect
@@ -45,5 +45,5 @@
 
 constants  {
   #C1 = static-tearoff math::max
-  #C2 = instantiation math::max <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect
index 39218a6..28f2a02 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect
@@ -45,5 +45,5 @@
 
 constants  {
   #C1 = static-tearoff math::max
-  #C2 = instantiation math::max <core::int*>
+  #C2 = instantiation #C1 <core::int*>
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
index ba2952c..f272f74 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
@@ -45,7 +45,7 @@
 
 constants  {
   #C1 = static-tearoff self::f
-  #C2 = instantiation self::f <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::C::g
-  #C4 = instantiation self::C::g <core::int*>
+  #C4 = instantiation #C3 <core::int*>
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect
index ba2952c..f272f74 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect
@@ -45,7 +45,7 @@
 
 constants  {
   #C1 = static-tearoff self::f
-  #C2 = instantiation self::f <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = static-tearoff self::C::g
-  #C4 = instantiation self::C::g <core::int*>
+  #C4 = instantiation #C3 <core::int*>
 }
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
index 5ea885d..22f41cf 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
@@ -90,7 +90,7 @@
 constants  {
   #C1 = TypeLiteralConstant(core::Object)
   #C2 = static-tearoff con::id
-  #C3 = instantiation con::id <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = 0
   #C5 = con::Class<core::int> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) → dynamic)
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
index 5ea885d..22f41cf 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
@@ -90,7 +90,7 @@
 constants  {
   #C1 = TypeLiteralConstant(core::Object)
   #C2 = static-tearoff con::id
-  #C3 = instantiation con::id <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = 0
   #C5 = con::Class<core::int> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) → dynamic)
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
index 17a63c7..9af4cec 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
@@ -90,7 +90,7 @@
 constants  {
   #C1 = TypeLiteralConstant(core::Object*)
   #C2 = static-tearoff con::id
-  #C3 = instantiation con::id <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = 0
   #C5 = con::Class<core::int*> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) →* dynamic)
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
index 17a63c7..9af4cec 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
@@ -90,7 +90,7 @@
 constants  {
   #C1 = TypeLiteralConstant(core::Object*)
   #C2 = static-tearoff con::id
-  #C3 = instantiation con::id <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = 0
   #C5 = con::Class<core::int*> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) →* dynamic)
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
index 26a075c..b233a23 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
@@ -103,121 +103,131 @@
 
 class A extends core::Object {
   final field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::A::factory3, self::A::factory4, self::A::factory5, self::A::factory6, self::A::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::A
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::A
+  constructor constructor2({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::A
+  constructor constructor3([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::A
+  constructor constructor4({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::A
+  constructor constructor5([core::int? i = #C6]) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::A
+  constructor constructor6({core::int? i = #C6}) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::A
+  constructor constructor7({required core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  external constructor constructor8([core::int i = #C1]) → self::A
+  external constructor constructor8([core::int i = #C6]) → self::A
     : super core::Object::•()
     ;
-  external constructor constructor9({core::int i = #C1}) → self::A
+  external constructor constructor9({core::int i = #C6}) → self::A
     : super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::A
+  static factory factory3([core::int i = #C6]) → self::A
     return new self::A::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::A
+  static factory factory4({core::int i = #C6}) → self::A
     return new self::A::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::A
+  static factory factory5([core::int? i = #C6]) → self::A
     return new self::A::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::A
+  static factory factory6({core::int? i = #C6}) → self::A
     return new self::A::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::A
+  static factory factory7({required core::int i = #C6}) → self::A
     return new self::A::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::A
+  static factory factory8([core::int i = #C6]) → self::A
     return new self::A::constructor3();
-  static factory factory9({core::int i = #C1}) → self::A
+  static factory factory9({core::int i = #C6}) → self::A
     return new self::A::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
-  external method method8([core::int i = #C1]) → dynamic;
-  external method method9({core::int i = #C1}) → dynamic;
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
+  external method method8([core::int i = #C6]) → dynamic;
+  external method method9({core::int i = #C6}) → dynamic;
 }
 abstract class B extends core::Object {
   field core::int i = 42;
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract method method3([core::int i = #C1]) → dynamic;
-  abstract method method4({core::int i = #C1}) → dynamic;
-  abstract method method5([core::int? i = #C1]) → dynamic;
-  abstract method method6({core::int? i = #C1}) → dynamic;
-  abstract method method7({required core::int i = #C1}) → dynamic;
+  abstract method method3([core::int i = #C6]) → dynamic;
+  abstract method method4({core::int i = #C6}) → dynamic;
+  abstract method method5([core::int? i = #C6]) → dynamic;
+  abstract method method6({core::int? i = #C6}) → dynamic;
+  abstract method method7({required core::int i = #C6}) → dynamic;
 }
 class C extends core::Object implements self::B {
   field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::C::factory3, self::C::factory4, self::C::factory5, self::C::factory6, self::C::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10, #C11]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::C
+  constructor constructor2({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::C
+  constructor constructor3([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::C
+  constructor constructor4({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::C
+  constructor constructor5([core::int? i = #C6]) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::C
+  constructor constructor6({core::int? i = #C6}) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::C
+  constructor constructor7({required core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::C
+  static factory factory3([core::int i = #C6]) → self::C
     return new self::C::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::C
+  static factory factory4({core::int i = #C6}) → self::C
     return new self::C::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::C
+  static factory factory5([core::int? i = #C6]) → self::C
     return new self::C::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::C
+  static factory factory6({core::int? i = #C6}) → self::C
     return new self::C::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::C
+  static factory factory7({required core::int i = #C6}) → self::C
     return new self::C::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::C
+  static factory factory8([core::int i = #C6]) → self::C
     return new self::C::constructor3();
-  static factory factory9({core::int i = #C1}) → self::C
+  static factory factory9({core::int i = #C6}) → self::C
     return new self::C::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
 }
 static method main() → void {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::A::factory3
+  #C2 = constructor-tearoff self::A::factory4
+  #C3 = constructor-tearoff self::A::factory5
+  #C4 = constructor-tearoff self::A::factory6
+  #C5 = constructor-tearoff self::A::factory7
+  #C6 = null
+  #C7 = constructor-tearoff self::C::factory3
+  #C8 = constructor-tearoff self::C::factory4
+  #C9 = constructor-tearoff self::C::factory5
+  #C10 = constructor-tearoff self::C::factory6
+  #C11 = constructor-tearoff self::C::factory7
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
index b672730..0c4486a 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
@@ -103,121 +103,131 @@
 
 class A extends core::Object {
   final field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::A::factory3, self::A::factory4, self::A::factory5, self::A::factory6, self::A::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::A
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::A
+  constructor constructor2({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::A
+  constructor constructor3([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::A
+  constructor constructor4({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::A
+  constructor constructor5([core::int? i = #C6]) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in let core::int? #t1 = i in #t1 == null ?{core::int} #t1 as{TypeError,ForNonNullableByDefault} core::int : #t1{core::int}, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::A
+  constructor constructor6({core::int? i = #C6}) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in let core::int? #t2 = i in #t2 == null ?{core::int} #t2 as{TypeError,ForNonNullableByDefault} core::int : #t2{core::int}, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::A
+  constructor constructor7({required core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  external constructor constructor8([core::int i = #C1]) → self::A
+  external constructor constructor8([core::int i = #C6]) → self::A
     : super core::Object::•()
     ;
-  external constructor constructor9({core::int i = #C1}) → self::A
+  external constructor constructor9({core::int i = #C6}) → self::A
     : super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::A
+  static factory factory3([core::int i = #C6]) → self::A
     return new self::A::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::A
+  static factory factory4({core::int i = #C6}) → self::A
     return new self::A::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::A
+  static factory factory5([core::int? i = #C6]) → self::A
     return new self::A::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::A
+  static factory factory6({core::int? i = #C6}) → self::A
     return new self::A::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::A
+  static factory factory7({required core::int i = #C6}) → self::A
     return new self::A::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::A
+  static factory factory8([core::int i = #C6]) → self::A
     return new self::A::constructor3();
-  static factory factory9({core::int i = #C1}) → self::A
+  static factory factory9({core::int i = #C6}) → self::A
     return new self::A::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
-  external method method8([core::int i = #C1]) → dynamic;
-  external method method9({core::int i = #C1}) → dynamic;
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
+  external method method8([core::int i = #C6]) → dynamic;
+  external method method9({core::int i = #C6}) → dynamic;
 }
 abstract class B extends core::Object {
   field core::int i = 42;
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract method method3([core::int i = #C1]) → dynamic;
-  abstract method method4({core::int i = #C1}) → dynamic;
-  abstract method method5([core::int? i = #C1]) → dynamic;
-  abstract method method6({core::int? i = #C1}) → dynamic;
-  abstract method method7({required core::int i = #C1}) → dynamic;
+  abstract method method3([core::int i = #C6]) → dynamic;
+  abstract method method4({core::int i = #C6}) → dynamic;
+  abstract method method5([core::int? i = #C6]) → dynamic;
+  abstract method method6({core::int? i = #C6}) → dynamic;
+  abstract method method7({required core::int i = #C6}) → dynamic;
 }
 class C extends core::Object implements self::B {
   field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::C::factory3, self::C::factory4, self::C::factory5, self::C::factory6, self::C::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10, #C11]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::C
+  constructor constructor2({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::C
+  constructor constructor3([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::C
+  constructor constructor4({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::C
+  constructor constructor5([core::int? i = #C6]) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in let core::int? #t3 = i in #t3 == null ?{core::int} #t3 as{TypeError,ForNonNullableByDefault} core::int : #t3{core::int}, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::C
+  constructor constructor6({core::int? i = #C6}) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in let core::int? #t4 = i in #t4 == null ?{core::int} #t4 as{TypeError,ForNonNullableByDefault} core::int : #t4{core::int}, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::C
+  constructor constructor7({required core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::C
+  static factory factory3([core::int i = #C6]) → self::C
     return new self::C::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::C
+  static factory factory4({core::int i = #C6}) → self::C
     return new self::C::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::C
+  static factory factory5([core::int? i = #C6]) → self::C
     return new self::C::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::C
+  static factory factory6({core::int? i = #C6}) → self::C
     return new self::C::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::C
+  static factory factory7({required core::int i = #C6}) → self::C
     return new self::C::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::C
+  static factory factory8([core::int i = #C6]) → self::C
     return new self::C::constructor3();
-  static factory factory9({core::int i = #C1}) → self::C
+  static factory factory9({core::int i = #C6}) → self::C
     return new self::C::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
 }
 static method main() → void {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::A::factory3
+  #C2 = constructor-tearoff self::A::factory4
+  #C3 = constructor-tearoff self::A::factory5
+  #C4 = constructor-tearoff self::A::factory6
+  #C5 = constructor-tearoff self::A::factory7
+  #C6 = null
+  #C7 = constructor-tearoff self::C::factory3
+  #C8 = constructor-tearoff self::C::factory4
+  #C9 = constructor-tearoff self::C::factory5
+  #C10 = constructor-tearoff self::C::factory6
+  #C11 = constructor-tearoff self::C::factory7
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
index 26a075c..b233a23 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
@@ -103,121 +103,131 @@
 
 class A extends core::Object {
   final field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::A::factory3, self::A::factory4, self::A::factory5, self::A::factory6, self::A::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::A
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::A
+  constructor constructor2({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::A
+  constructor constructor3([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::A
+  constructor constructor4({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::A
+  constructor constructor5([core::int? i = #C6]) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::A
+  constructor constructor6({core::int? i = #C6}) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::A
+  constructor constructor7({required core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  external constructor constructor8([core::int i = #C1]) → self::A
+  external constructor constructor8([core::int i = #C6]) → self::A
     : super core::Object::•()
     ;
-  external constructor constructor9({core::int i = #C1}) → self::A
+  external constructor constructor9({core::int i = #C6}) → self::A
     : super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::A
+  static factory factory3([core::int i = #C6]) → self::A
     return new self::A::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::A
+  static factory factory4({core::int i = #C6}) → self::A
     return new self::A::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::A
+  static factory factory5([core::int? i = #C6]) → self::A
     return new self::A::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::A
+  static factory factory6({core::int? i = #C6}) → self::A
     return new self::A::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::A
+  static factory factory7({required core::int i = #C6}) → self::A
     return new self::A::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::A
+  static factory factory8([core::int i = #C6]) → self::A
     return new self::A::constructor3();
-  static factory factory9({core::int i = #C1}) → self::A
+  static factory factory9({core::int i = #C6}) → self::A
     return new self::A::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
-  external method method8([core::int i = #C1]) → dynamic;
-  external method method9({core::int i = #C1}) → dynamic;
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
+  external method method8([core::int i = #C6]) → dynamic;
+  external method method9({core::int i = #C6}) → dynamic;
 }
 abstract class B extends core::Object {
   field core::int i = 42;
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract method method3([core::int i = #C1]) → dynamic;
-  abstract method method4({core::int i = #C1}) → dynamic;
-  abstract method method5([core::int? i = #C1]) → dynamic;
-  abstract method method6({core::int? i = #C1}) → dynamic;
-  abstract method method7({required core::int i = #C1}) → dynamic;
+  abstract method method3([core::int i = #C6]) → dynamic;
+  abstract method method4({core::int i = #C6}) → dynamic;
+  abstract method method5([core::int? i = #C6]) → dynamic;
+  abstract method method6({core::int? i = #C6}) → dynamic;
+  abstract method method7({required core::int i = #C6}) → dynamic;
 }
 class C extends core::Object implements self::B {
   field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::C::factory3, self::C::factory4, self::C::factory5, self::C::factory6, self::C::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10, #C11]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::C
+  constructor constructor2({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::C
+  constructor constructor3([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::C
+  constructor constructor4({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::C
+  constructor constructor5([core::int? i = #C6]) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::C
+  constructor constructor6({core::int? i = #C6}) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::C
+  constructor constructor7({required core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::C
+  static factory factory3([core::int i = #C6]) → self::C
     return new self::C::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::C
+  static factory factory4({core::int i = #C6}) → self::C
     return new self::C::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::C
+  static factory factory5([core::int? i = #C6]) → self::C
     return new self::C::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::C
+  static factory factory6({core::int? i = #C6}) → self::C
     return new self::C::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::C
+  static factory factory7({required core::int i = #C6}) → self::C
     return new self::C::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::C
+  static factory factory8([core::int i = #C6]) → self::C
     return new self::C::constructor3();
-  static factory factory9({core::int i = #C1}) → self::C
+  static factory factory9({core::int i = #C6}) → self::C
     return new self::C::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
 }
 static method main() → void {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::A::factory3
+  #C2 = constructor-tearoff self::A::factory4
+  #C3 = constructor-tearoff self::A::factory5
+  #C4 = constructor-tearoff self::A::factory6
+  #C5 = constructor-tearoff self::A::factory7
+  #C6 = null
+  #C7 = constructor-tearoff self::C::factory3
+  #C8 = constructor-tearoff self::C::factory4
+  #C9 = constructor-tearoff self::C::factory5
+  #C10 = constructor-tearoff self::C::factory6
+  #C11 = constructor-tearoff self::C::factory7
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
index 0040b41..48dab81 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
@@ -187,3 +187,17 @@
 }
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:5:7 -> ConstructorTearOffConstant(A.factory3)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:5:7 -> ConstructorTearOffConstant(A.factory4)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:5:7 -> ConstructorTearOffConstant(A.factory5)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:5:7 -> ConstructorTearOffConstant(A.factory6)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:5:7 -> ConstructorTearOffConstant(A.factory7)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:74:7 -> ConstructorTearOffConstant(C.factory3)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:74:7 -> ConstructorTearOffConstant(C.factory4)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:74:7 -> ConstructorTearOffConstant(C.factory5)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:74:7 -> ConstructorTearOffConstant(C.factory6)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42362.dart:74:7 -> ConstructorTearOffConstant(C.factory7)
+Extra constant evaluation: evaluated: 32, effectively constant: 10
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
index 94f4fab..8ee747f 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
@@ -103,121 +103,131 @@
 
 class A extends core::Object {
   final field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::A::factory3, self::A::factory4, self::A::factory5, self::A::factory6, self::A::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::A
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::A
+  constructor constructor2({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::A
+  constructor constructor3([core::int i = #C6]) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::A
+  constructor constructor4({core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::A
+  constructor constructor5([core::int? i = #C6]) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::A
+  constructor constructor6({core::int? i = #C6}) → self::A
     : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::A
+  constructor constructor7({required core::int i = #C6}) → self::A
     : self::A::i = i, super core::Object::•()
     ;
-  external constructor constructor8([core::int i = #C1]) → self::A
+  external constructor constructor8([core::int i = #C6]) → self::A
     : super core::Object::•()
     ;
-  external constructor constructor9({core::int i = #C1}) → self::A
+  external constructor constructor9({core::int i = #C6}) → self::A
     : super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::A
+  static factory factory3([core::int i = #C6]) → self::A
     return new self::A::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::A
+  static factory factory4({core::int i = #C6}) → self::A
     return new self::A::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::A
+  static factory factory5([core::int? i = #C6]) → self::A
     return new self::A::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::A
+  static factory factory6({core::int? i = #C6}) → self::A
     return new self::A::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::A
+  static factory factory7({required core::int i = #C6}) → self::A
     return new self::A::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::A
+  static factory factory8([core::int i = #C6]) → self::A
     return new self::A::constructor3();
-  static factory factory9({core::int i = #C1}) → self::A
+  static factory factory9({core::int i = #C6}) → self::A
     return new self::A::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
-  external method method8([core::int i = #C1]) → dynamic;
-  external method method9({core::int i = #C1}) → dynamic;
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
+  external method method8([core::int i = #C6]) → dynamic;
+  external method method9({core::int i = #C6}) → dynamic;
 }
 abstract class B extends core::Object {
   field core::int i = 42;
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract method method3([core::int i = #C1]) → dynamic;
-  abstract method method4({core::int i = #C1}) → dynamic;
-  abstract method method5([core::int? i = #C1]) → dynamic;
-  abstract method method6({core::int? i = #C1}) → dynamic;
-  abstract method method7({required core::int i = #C1}) → dynamic;
+  abstract method method3([core::int i = #C6]) → dynamic;
+  abstract method method4({core::int i = #C6}) → dynamic;
+  abstract method method5([core::int? i = #C6]) → dynamic;
+  abstract method method6({core::int? i = #C6}) → dynamic;
+  abstract method method7({required core::int i = #C6}) → dynamic;
 }
 class C extends core::Object implements self::B {
   field core::int i;
-  static final field dynamic _redirecting# = <dynamic>[self::C::factory3, self::C::factory4, self::C::factory5, self::C::factory6, self::C::factory7]/*isLegacy*/;
-  constructor constructor1([core::int i = #C1]) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10, #C11]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor2({core::int i = #C1}) → self::C
+  constructor constructor2({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor3([core::int i = #C1]) → self::C
+  constructor constructor3([core::int i = #C6]) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor4({core::int i = #C1}) → self::C
+  constructor constructor4({core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  constructor constructor5([core::int? i = #C1]) → self::C
+  constructor constructor5([core::int? i = #C6]) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i, super core::Object::•()
     ;
-  constructor constructor6({core::int? i = #C1}) → self::C
+  constructor constructor6({core::int? i = #C6}) → self::C
     : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i, super core::Object::•()
     ;
-  constructor constructor7({required core::int i = #C1}) → self::C
+  constructor constructor7({required core::int i = #C6}) → self::C
     : self::C::i = i, super core::Object::•()
     ;
-  static factory factory3([core::int i = #C1]) → self::C
+  static factory factory3([core::int i = #C6]) → self::C
     return new self::C::constructor3(i);
-  static factory factory4({core::int i = #C1}) → self::C
+  static factory factory4({core::int i = #C6}) → self::C
     return new self::C::constructor4(i: i);
-  static factory factory5([core::int? i = #C1]) → self::C
+  static factory factory5([core::int? i = #C6]) → self::C
     return new self::C::constructor5(i);
-  static factory factory6({core::int? i = #C1}) → self::C
+  static factory factory6({core::int? i = #C6}) → self::C
     return new self::C::constructor6(i: i);
-  static factory factory7({required core::int i = #C1}) → self::C
+  static factory factory7({required core::int i = #C6}) → self::C
     return new self::C::constructor7(i: i);
-  static factory factory8([core::int i = #C1]) → self::C
+  static factory factory8([core::int i = #C6]) → self::C
     return new self::C::constructor3();
-  static factory factory9({core::int i = #C1}) → self::C
+  static factory factory9({core::int i = #C6}) → self::C
     return new self::C::constructor4();
-  method method3([core::int i = #C1]) → dynamic {}
-  method method4({core::int i = #C1}) → dynamic {}
-  method method5([core::int? i = #C1]) → dynamic {}
-  method method6({core::int? i = #C1}) → dynamic {}
-  method method7({required core::int i = #C1}) → dynamic {}
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
 }
 static method main() → void {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::A::factory3
+  #C2 = constructor-tearoff self::A::factory4
+  #C3 = constructor-tearoff self::A::factory5
+  #C4 = constructor-tearoff self::A::factory6
+  #C5 = constructor-tearoff self::A::factory7
+  #C6 = null
+  #C7 = constructor-tearoff self::C::factory3
+  #C8 = constructor-tearoff self::C::factory4
+  #C9 = constructor-tearoff self::C::factory5
+  #C10 = constructor-tearoff self::C::factory6
+  #C11 = constructor-tearoff self::C::factory7
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
index 66fe67c..276acf3 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
@@ -15,5 +15,5 @@
 
 constants  {
   #C1 = static-tearoff self::checkme
-  #C2 = instantiation self::checkme <self::X>
+  #C2 = instantiation #C1 <self::X>
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
index 66fe67c..276acf3 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -15,5 +15,5 @@
 
 constants  {
   #C1 = static-tearoff self::checkme
-  #C2 = instantiation self::checkme <self::X>
+  #C2 = instantiation #C1 <self::X>
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
index 17ca8c8..b570b8b 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
@@ -15,5 +15,5 @@
 
 constants  {
   #C1 = static-tearoff self::checkme
-  #C2 = instantiation self::checkme <self::X*>
+  #C2 = instantiation #C1 <self::X*>
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
index 17ca8c8..b570b8b 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -15,5 +15,5 @@
 
 constants  {
   #C1 = static-tearoff self::checkme
-  #C2 = instantiation self::checkme <self::X*>
+  #C2 = instantiation #C1 <self::X*>
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect
index 0c168d7..2637180 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field Never n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(Never n) → self::C
     return new self::D::•(n);
 }
@@ -22,3 +22,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect
index 0c168d7..2637180 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field Never n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(Never n) → self::C
     return new self::D::•(n);
 }
@@ -22,3 +22,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect
index 0c168d7..2637180 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field Never n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(Never n) → self::C
     return new self::D::•(n);
 }
@@ -22,3 +22,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect
index 18f72ef..fd5c0b5 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect
@@ -15,3 +15,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42844_1.dart:5:7 -> ConstructorTearOffConstant(C.)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect
index 0c168d7..2637180 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field Never n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(Never n) → self::C
     return new self::D::•(n);
 }
@@ -22,3 +22,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect
index bd950c6..d84e75e 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect
@@ -12,7 +12,7 @@
 
 class C extends core::Object {
   final field dynamic n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(dynamic n) → self::C
     return new self::D::•(n);
 }
@@ -23,3 +23,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect
index bd950c6..d84e75e 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
 
 class C extends core::Object {
   final field dynamic n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(dynamic n) → self::C
     return new self::D::•(n);
 }
@@ -23,3 +23,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect
index bd950c6..d84e75e 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect
@@ -12,7 +12,7 @@
 
 class C extends core::Object {
   final field dynamic n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(dynamic n) → self::C
     return new self::D::•(n);
 }
@@ -23,3 +23,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect
index 53f7e37..967bc12 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect
@@ -15,3 +15,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue42844_2.dart:5:7 -> ConstructorTearOffConstant(C.)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect
index bd950c6..d84e75e 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
 
 class C extends core::Object {
   final field dynamic n = null;
-  static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •(dynamic n) → self::C
     return new self::D::•(n);
 }
@@ -23,3 +23,7 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
index a02c4ef..46f6782 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -221,7 +221,7 @@
   }
 }
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
     self::A<self::A<Null>>? a;
@@ -259,3 +259,7 @@
   self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
index a02c4ef..46f6782 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -221,7 +221,7 @@
   }
 }
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
     self::A<self::A<Null>>? a;
@@ -259,3 +259,7 @@
   self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
index a02c4ef..46f6782 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -221,7 +221,7 @@
   }
 }
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
     self::A<self::A<Null>>? a;
@@ -259,3 +259,7 @@
   self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
index 39eaec6..ffca4b4 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
@@ -149,3 +149,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue43211.dart:35:7 -> ConstructorTearOffConstant(C.redirect)
+Extra constant evaluation: evaluated: 14, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
index a02c4ef..46f6782 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -221,7 +221,7 @@
   }
 }
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
     self::A<self::A<Null>>? a;
@@ -259,3 +259,7 @@
   self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect
index fd4ab1f..6fe128e 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect
@@ -16,14 +16,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
-  constructor gen({core::int i = #C1}) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor gen({core::int i = #C2}) → self::C
     : super core::Object::•()
     ;
-  static factory fact({core::int i = #C1}) → self::C {
+  static factory fact({core::int i = #C2}) → self::C {
     return new self::C::gen();
   }
-  static factory redirect({core::int i = #C1}) → self::C
+  static factory redirect({core::int i = #C2}) → self::C
     return new self::C::gen(i: i);
 }
 class D extends core::Object {
@@ -34,5 +34,6 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::C::redirect
+  #C2 = null
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect
index fd4ab1f..6fe128e 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect
@@ -16,14 +16,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
-  constructor gen({core::int i = #C1}) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor gen({core::int i = #C2}) → self::C
     : super core::Object::•()
     ;
-  static factory fact({core::int i = #C1}) → self::C {
+  static factory fact({core::int i = #C2}) → self::C {
     return new self::C::gen();
   }
-  static factory redirect({core::int i = #C1}) → self::C
+  static factory redirect({core::int i = #C2}) → self::C
     return new self::C::gen(i: i);
 }
 class D extends core::Object {
@@ -34,5 +34,6 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::C::redirect
+  #C2 = null
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect
index fd4ab1f..6fe128e 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect
@@ -16,14 +16,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
-  constructor gen({core::int i = #C1}) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor gen({core::int i = #C2}) → self::C
     : super core::Object::•()
     ;
-  static factory fact({core::int i = #C1}) → self::C {
+  static factory fact({core::int i = #C2}) → self::C {
     return new self::C::gen();
   }
-  static factory redirect({core::int i = #C1}) → self::C
+  static factory redirect({core::int i = #C2}) → self::C
     return new self::C::gen(i: i);
 }
 class D extends core::Object {
@@ -34,5 +34,6 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::C::redirect
+  #C2 = null
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
index bff1a1e..110f141 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
@@ -30,3 +30,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue43276.dart:5:7 -> ConstructorTearOffConstant(C.redirect)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect
index fd4ab1f..6fe128e 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect
@@ -16,14 +16,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isLegacy*/;
-  constructor gen({core::int i = #C1}) → self::C
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor gen({core::int i = #C2}) → self::C
     : super core::Object::•()
     ;
-  static factory fact({core::int i = #C1}) → self::C {
+  static factory fact({core::int i = #C2}) → self::C {
     return new self::C::gen();
   }
-  static factory redirect({core::int i = #C1}) → self::C
+  static factory redirect({core::int i = #C2}) → self::C
     return new self::C::gen(i: i);
 }
 class D extends core::Object {
@@ -34,5 +34,6 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = null
+  #C1 = constructor-tearoff self::C::redirect
+  #C2 = null
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
index e038284..9882343 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
     return new self::_A::•<self::A::•::T%>(value);
 }
@@ -13,7 +13,7 @@
     ;
 }
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
     return new self::_B::•<self::B::•::T%>(value);
 }
@@ -23,3 +23,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
index e038284..9882343 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
     return new self::_A::•<self::A::•::T%>(value);
 }
@@ -13,7 +13,7 @@
     ;
 }
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
     return new self::_B::•<self::B::•::T%>(value);
 }
@@ -23,3 +23,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
index e038284..9882343 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
     return new self::_A::•<self::A::•::T%>(value);
 }
@@ -13,7 +13,7 @@
     ;
 }
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
     return new self::_B::•<self::B::•::T%>(value);
 }
@@ -23,3 +23,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect
index a50e08b..59597d6 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect
@@ -22,3 +22,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue43918.dart:5:16 -> ConstructorTearOffConstant(A.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue43918.dart:13:16 -> ConstructorTearOffConstant(B.)
+Extra constant evaluation: evaluated: 8, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
index e038284..9882343 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
     return new self::_A::•<self::A::•::T%>(value);
 }
@@ -13,7 +13,7 @@
     ;
 }
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
     return new self::_B::•<self::B::•::T%>(value);
 }
@@ -23,3 +23,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
index 2640926..ba12861 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
@@ -62,7 +62,7 @@
   method hest(core::num value) → void {}
 }
 class C1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::C1
     return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
 Try using a different type as argument.
@@ -75,7 +75,7 @@
     ;
 }
 class D extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor foo(core::num x) → self::D
     : super core::Object::•()
     ;
@@ -86,3 +86,8 @@
                           ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C1::•
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
index 2640926..ba12861 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
@@ -62,7 +62,7 @@
   method hest(core::num value) → void {}
 }
 class C1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::C1
     return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
 Try using a different type as argument.
@@ -75,7 +75,7 @@
     ;
 }
 class D extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor foo(core::num x) → self::D
     : super core::Object::•()
     ;
@@ -86,3 +86,8 @@
                           ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C1::•
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
index 2640926..ba12861 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
@@ -62,7 +62,7 @@
   method hest(core::num value) → void {}
 }
 class C1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::C1
     return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
 Try using a different type as argument.
@@ -75,7 +75,7 @@
     ;
 }
 class D extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor foo(core::num x) → self::D
     : super core::Object::•()
     ;
@@ -86,3 +86,8 @@
                           ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C1::•
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
index 1f2f60e..115a6f4 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
@@ -85,3 +85,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///override_checks.dart:19:7 -> ConstructorTearOffConstant(C1.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///override_checks.dart:25:7 -> ConstructorTearOffConstant(D.bar)
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
index 2640926..ba12861 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
@@ -62,7 +62,7 @@
   method hest(core::num value) → void {}
 }
 class C1 extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   static factory •() → self::C1
     return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
 Try using a different type as argument.
@@ -75,7 +75,7 @@
     ;
 }
 class D extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor foo(core::num x) → self::D
     : super core::Object::•()
     ;
@@ -86,3 +86,8 @@
                           ^";
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C1::•
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect
index 3fe3e9d..7948117 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect
@@ -226,7 +226,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = 0
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect
index 3fe3e9d..7948117 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect
@@ -226,7 +226,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = 0
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect
index c410aaa..752b8a6 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect
@@ -217,7 +217,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = 0
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num*> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect
index c410aaa..752b8a6 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect
@@ -217,7 +217,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = 0
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num*> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect
index 7045d9b..fb57de9 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect
@@ -81,7 +81,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = true
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect
index 7045d9b..fb57de9 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect
@@ -81,7 +81,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int>
+  #C3 = instantiation #C2 <core::int>
   #C4 = true
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect
index c7c169f..3b6c8a8 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect
@@ -81,7 +81,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = true
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num*> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect
index c7c169f..3b6c8a8 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect
@@ -81,7 +81,7 @@
 constants  {
   #C1 = 3
   #C2 = static-tearoff self::idFunction
-  #C3 = instantiation self::idFunction <core::int*>
+  #C3 = instantiation #C2 <core::int*>
   #C4 = true
   #C5 = self::Class<dynamic> {field:#C4}
   #C6 = self::Class<core::num*> {field:#C4}
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
index b504950..f72fa11 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
@@ -82,7 +82,7 @@
 
 constants  {
   #C1 = static-tearoff con::id
-  #C2 = instantiation con::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = 0
   #C4 = con::Class<core::int*> {field:#C3}
   #C5 = <core::int*>[#C3]
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
index b504950..f72fa11 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
@@ -82,7 +82,7 @@
 
 constants  {
   #C1 = static-tearoff con::id
-  #C2 = instantiation con::id <core::int*>
+  #C2 = instantiation #C1 <core::int*>
   #C3 = 0
   #C4 = con::Class<core::int*> {field:#C3}
   #C5 = <core::int*>[#C3]
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect
index 9f5ab6a..ffdea68 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::Class
     : super core::Object::•()
     ;
@@ -11,3 +11,7 @@
     return new self::Class::•();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect
index 2dad0b1..96a3670 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect
@@ -11,3 +11,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_factory.dart:8:7 -> ConstructorTearOffConstant(Class.redirect)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect
index 9f5ab6a..ffdea68 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor •() → self::Class
     : super core::Object::•()
     ;
@@ -11,3 +11,7 @@
     return new self::Class::•();
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
index 34cee4f..e605bd9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
@@ -34,7 +34,7 @@
 import "dart:core" as core;
 
 class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class1::redirect, opt::Class1::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6, #C7]/*isLegacy*/;
   const constructor _() → opt::Class1<opt::Class1::T%>
     : super core::Object::•()
     ;
@@ -46,7 +46,7 @@
     return new opt::Class1::_<opt::Class1::fact::T%>();
 }
 class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class2::redirect, opt::Class2::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8, #C9]/*isLegacy*/;
   const constructor _() → opt::Class2<opt::Class2::T>
     : super core::Object::•()
     ;
@@ -58,7 +58,7 @@
     return new opt::Class2::_<opt::Class2::fact::T>();
 }
 class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class3::redirect, opt::Class3::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C10, #C11]/*isLegacy*/;
   const constructor _() → opt::Class3<opt::Class3::T>
     : super core::Object::•()
     ;
@@ -70,7 +70,7 @@
     return new opt::Class3::_<opt::Class3::fact::T>();
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class4::redirect, opt::Class4::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C12, #C13]/*isLegacy*/;
   const constructor _() → opt::Class4<opt::Class4::T%>
     : super core::Object::•()
     ;
@@ -82,7 +82,7 @@
     return new opt::Class4::_<opt::Class4::fact::T%>();
 }
 class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class5::redirect, opt::Class5::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C14, #C15]/*isLegacy*/;
   const constructor _() → opt::Class5<opt::Class5::T%>
     : super core::Object::•()
     ;
@@ -96,7 +96,7 @@
 static method testOptIn() → dynamic {
   new opt::Class1::_<core::Object?>();
   new opt::Class1::_<core::Object?>();
-  #C6;
+  #C16;
   opt::Class1::fact<core::Object?>();
   new opt::Class2::_<core::Object>();
   new opt::Class2::_<core::Object>();
@@ -122,7 +122,17 @@
   #C3 = opt::Class3<core::String*> {}
   #C4 = opt::Class4<dynamic> {}
   #C5 = opt::Class5<dynamic> {}
-  #C6 = opt::Class1<core::Object?> {}
+  #C6 = constructor-tearoff opt::Class1::redirect
+  #C7 = constructor-tearoff opt::Class1::constRedirect
+  #C8 = constructor-tearoff opt::Class2::redirect
+  #C9 = constructor-tearoff opt::Class2::constRedirect
+  #C10 = constructor-tearoff opt::Class3::redirect
+  #C11 = constructor-tearoff opt::Class3::constRedirect
+  #C12 = constructor-tearoff opt::Class4::redirect
+  #C13 = constructor-tearoff opt::Class4::constRedirect
+  #C14 = constructor-tearoff opt::Class5::redirect
+  #C15 = constructor-tearoff opt::Class5::constRedirect
+  #C16 = opt::Class1<core::Object?> {}
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
index 958ab4c..e1a0b96 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
@@ -72,3 +72,17 @@
 }
 static method testOptIn() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:5:7 -> ConstructorTearOffConstant(Class1.redirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:5:7 -> ConstructorTearOffConstant(Class1.constRedirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:13:7 -> ConstructorTearOffConstant(Class2.redirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:13:7 -> ConstructorTearOffConstant(Class2.constRedirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:21:7 -> ConstructorTearOffConstant(Class3.redirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:21:7 -> ConstructorTearOffConstant(Class3.constRedirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:29:7 -> ConstructorTearOffConstant(Class4.redirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:29:7 -> ConstructorTearOffConstant(Class4.constRedirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:37:7 -> ConstructorTearOffConstant(Class5.redirect)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:37:7 -> ConstructorTearOffConstant(Class5.constRedirect)
+Extra constant evaluation: evaluated: 25, effectively constant: 10
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
index 34cee4f..e605bd9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
 import "dart:core" as core;
 
 class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class1::redirect, opt::Class1::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6, #C7]/*isLegacy*/;
   const constructor _() → opt::Class1<opt::Class1::T%>
     : super core::Object::•()
     ;
@@ -46,7 +46,7 @@
     return new opt::Class1::_<opt::Class1::fact::T%>();
 }
 class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class2::redirect, opt::Class2::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8, #C9]/*isLegacy*/;
   const constructor _() → opt::Class2<opt::Class2::T>
     : super core::Object::•()
     ;
@@ -58,7 +58,7 @@
     return new opt::Class2::_<opt::Class2::fact::T>();
 }
 class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class3::redirect, opt::Class3::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C10, #C11]/*isLegacy*/;
   const constructor _() → opt::Class3<opt::Class3::T>
     : super core::Object::•()
     ;
@@ -70,7 +70,7 @@
     return new opt::Class3::_<opt::Class3::fact::T>();
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class4::redirect, opt::Class4::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C12, #C13]/*isLegacy*/;
   const constructor _() → opt::Class4<opt::Class4::T%>
     : super core::Object::•()
     ;
@@ -82,7 +82,7 @@
     return new opt::Class4::_<opt::Class4::fact::T%>();
 }
 class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::Class5::redirect, opt::Class5::constRedirect]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C14, #C15]/*isLegacy*/;
   const constructor _() → opt::Class5<opt::Class5::T%>
     : super core::Object::•()
     ;
@@ -96,7 +96,7 @@
 static method testOptIn() → dynamic {
   new opt::Class1::_<core::Object?>();
   new opt::Class1::_<core::Object?>();
-  #C6;
+  #C16;
   opt::Class1::fact<core::Object?>();
   new opt::Class2::_<core::Object>();
   new opt::Class2::_<core::Object>();
@@ -122,7 +122,17 @@
   #C3 = opt::Class3<core::String*> {}
   #C4 = opt::Class4<dynamic> {}
   #C5 = opt::Class5<dynamic> {}
-  #C6 = opt::Class1<core::Object?> {}
+  #C6 = constructor-tearoff opt::Class1::redirect
+  #C7 = constructor-tearoff opt::Class1::constRedirect
+  #C8 = constructor-tearoff opt::Class2::redirect
+  #C9 = constructor-tearoff opt::Class2::constRedirect
+  #C10 = constructor-tearoff opt::Class3::redirect
+  #C11 = constructor-tearoff opt::Class3::constRedirect
+  #C12 = constructor-tearoff opt::Class4::redirect
+  #C13 = constructor-tearoff opt::Class4::constRedirect
+  #C14 = constructor-tearoff opt::Class5::redirect
+  #C15 = constructor-tearoff opt::Class5::constRedirect
+  #C16 = opt::Class1<core::Object?> {}
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
index 2cb6f54..342dcae 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
@@ -50,7 +50,7 @@
     ;
 }
 class CP<T extends core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::CP::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
   const constructor _(core::Object token) → opt::CP<opt::CP::T>
     : super opt::P::_(token)
     ;
@@ -63,7 +63,7 @@
     ;
 }
 class VP<T extends core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::VP::forToken]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   const constructor _(core::Object token, opt::VP::T useValue) → opt::VP<opt::VP::T>
     : super opt::P::_(token)
     ;
@@ -72,7 +72,7 @@
 }
 class M extends core::Object /*hasConstConstructor*/  {
   final field core::List<opt::P<core::Object>> list;
-  const constructor •({core::List<opt::P<core::Object>> list = #C7}) → opt::M
+  const constructor •({core::List<opt::P<core::Object>> list = #C9}) → opt::M
     : opt::M::list = list, super core::Object::•()
     ;
 }
@@ -84,7 +84,9 @@
   #C4 = opt::VP<core::Object*> {token:#C3}
   #C5 = <opt::P<core::Object*>*>[#C2, #C4]
   #C6 = opt::M {list:#C5}
-  #C7 = <opt::P<core::Object*>*>[]
+  #C7 = constructor-tearoff opt::CP::•
+  #C8 = constructor-tearoff opt::VP::forToken
+  #C9 = <opt::P<core::Object*>*>[]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
index ee92a0d..98b7803 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
@@ -81,5 +81,7 @@
 Extra constant evaluation status:
 Evaluated: ListLiteral @ org-dartlang-testcase:///main.dart:15:14 -> ListConstant(const <P<Object*>*>[const CP<Object*>{P.token: Class*}, const VP<Object*>{P.token: const XToken{}}])
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:20:11 -> InstanceConstant(const M{M.list: const <P<Object*>*>[const CP<Object*>{P.token: Class*}, const VP<Object*>{P.token: const XToken{}}]})
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:11:7 -> ConstructorTearOffConstant(CP.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:21:7 -> ConstructorTearOffConstant(VP.forToken)
 Evaluated: ListLiteral @ org-dartlang-testcase:///opt_in_lib.dart:36:24 -> ListConstant(const <P<Object*>*>[])
-Extra constant evaluation: evaluated: 16, effectively constant: 3
+Extra constant evaluation: evaluated: 16, effectively constant: 5
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
index 2cb6f54..342dcae 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
@@ -50,7 +50,7 @@
     ;
 }
 class CP<T extends core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::CP::•]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
   const constructor _(core::Object token) → opt::CP<opt::CP::T>
     : super opt::P::_(token)
     ;
@@ -63,7 +63,7 @@
     ;
 }
 class VP<T extends core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[opt::VP::forToken]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
   const constructor _(core::Object token, opt::VP::T useValue) → opt::VP<opt::VP::T>
     : super opt::P::_(token)
     ;
@@ -72,7 +72,7 @@
 }
 class M extends core::Object /*hasConstConstructor*/  {
   final field core::List<opt::P<core::Object>> list;
-  const constructor •({core::List<opt::P<core::Object>> list = #C7}) → opt::M
+  const constructor •({core::List<opt::P<core::Object>> list = #C9}) → opt::M
     : opt::M::list = list, super core::Object::•()
     ;
 }
@@ -84,7 +84,9 @@
   #C4 = opt::VP<core::Object*> {token:#C3}
   #C5 = <opt::P<core::Object*>*>[#C2, #C4]
   #C6 = opt::M {list:#C5}
-  #C7 = <opt::P<core::Object*>*>[]
+  #C7 = constructor-tearoff opt::CP::•
+  #C8 = constructor-tearoff opt::VP::forToken
+  #C9 = <opt::P<core::Object*>*>[]
 }
 
 
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect
index 3df2a9b..ae8fcc4 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef BAlias = self::B;
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   static factory •() → self::A
     return new self::B::•();
   static factory named() → self::A
@@ -19,3 +19,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::A::named
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect
index 3df2a9b..ae8fcc4 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef BAlias = self::B;
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   static factory •() → self::A
     return new self::B::•();
   static factory named() → self::A
@@ -19,3 +19,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::A::named
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect
index 3df2a9b..ae8fcc4 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect
@@ -4,7 +4,7 @@
 
 typedef BAlias = self::B;
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   static factory •() → self::A
     return new self::B::•();
   static factory named() → self::A
@@ -19,3 +19,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::A::named
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect
index 978eeea..9cd6482 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect
@@ -18,3 +18,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45051.dart:5:7 -> ConstructorTearOffConstant(A.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45051.dart:5:7 -> ConstructorTearOffConstant(A.named)
+Extra constant evaluation: evaluated: 5, effectively constant: 2
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect
index 3df2a9b..ae8fcc4 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef BAlias = self::B;
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
   static factory •() → self::A
     return new self::B::•();
   static factory named() → self::A
@@ -19,3 +19,8 @@
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::A::named
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect
index 1d4c9d2..14a187b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect
@@ -69,7 +69,7 @@
 typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
 typedef B<X extends (self::D<X>) → self::D<X> = (self::D<dynamic>) → self::D<dynamic>> = self::D<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::C<self::C::X%>
     : super core::Object::•() {}
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
@@ -78,7 +78,7 @@
     return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor •() → self::D<self::D::X%>
     : super core::Object::•()
     ;
@@ -108,3 +108,8 @@
   return self::D::foo<self::_#B#foo#tearOff::X>();
 static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
   return self::D::bar<self::_#B#bar#tearOff::X>();
+
+constants  {
+  #C1 = constructor-tearoff self::C::bar
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect
index 1d4c9d2..14a187b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect
@@ -69,7 +69,7 @@
 typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
 typedef B<X extends (self::D<X>) → self::D<X> = (self::D<dynamic>) → self::D<dynamic>> = self::D<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::C<self::C::X%>
     : super core::Object::•() {}
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
@@ -78,7 +78,7 @@
     return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor •() → self::D<self::D::X%>
     : super core::Object::•()
     ;
@@ -108,3 +108,8 @@
   return self::D::foo<self::_#B#foo#tearOff::X>();
 static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
   return self::D::bar<self::_#B#bar#tearOff::X>();
+
+constants  {
+  #C1 = constructor-tearoff self::C::bar
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect
index 1d4c9d2..14a187b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect
@@ -69,7 +69,7 @@
 typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
 typedef B<X extends (self::D<X>) → self::D<X> = (self::D<dynamic>) → self::D<dynamic>> = self::D<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::C<self::C::X%>
     : super core::Object::•() {}
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
@@ -78,7 +78,7 @@
     return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor •() → self::D<self::D::X%>
     : super core::Object::•()
     ;
@@ -108,3 +108,8 @@
   return self::D::foo<self::_#B#foo#tearOff::X>();
 static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
   return self::D::bar<self::_#B#bar#tearOff::X>();
+
+constants  {
+  #C1 = constructor-tearoff self::C::bar
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect
index 218a88b..e8f791f 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect
@@ -39,3 +39,9 @@
   return self::D::foo<self::_#B#foo#tearOff::X>();
 static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
   return self::D::bar<self::_#B#bar#tearOff::X>();
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45519_2.dart:5:7 -> ConstructorTearOffConstant(C.bar)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45519_2.dart:10:7 -> ConstructorTearOffConstant(D.bar)
+Extra constant evaluation: evaluated: 12, effectively constant: 2
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect
index 1d4c9d2..14a187b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect
@@ -69,7 +69,7 @@
 typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
 typedef B<X extends (self::D<X>) → self::D<X> = (self::D<dynamic>) → self::D<dynamic>> = self::D<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
   constructor foo() → self::C<self::C::X%>
     : super core::Object::•() {}
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
@@ -78,7 +78,7 @@
     return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
   constructor •() → self::D<self::D::X%>
     : super core::Object::•()
     ;
@@ -108,3 +108,8 @@
   return self::D::foo<self::_#B#foo#tearOff::X>();
 static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
   return self::D::bar<self::_#B#bar#tearOff::X>();
+
+constants  {
+  #C1 = constructor-tearoff self::C::bar
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect
index 4ca626f..b641197 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect
@@ -75,7 +75,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class D extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •() → self::D*
     return invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
   factory D() = Missing;
@@ -99,3 +99,7 @@
   factory D() = Missing;
                 ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::D::•
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect
index 5a0190f..b631f32 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect
@@ -91,3 +91,8 @@
 }
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///class_hierarchy.dart:11:7 -> ConstructorTearOffConstant(D.)
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect
index 4ca626f..b641197 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect
@@ -75,7 +75,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class D extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::D::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •() → self::D*
     return invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
   factory D() = Missing;
@@ -99,3 +99,7 @@
   factory D() = Missing;
                 ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::D::•
+}
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect
index 900f8a7..05e4007 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect
@@ -73,7 +73,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3];
   constructor internal() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -102,7 +102,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
+  static final field dynamic _redirecting# = <dynamic>[#C4, #C5];
   constructor internal() → self::B<self::B::S*>*
     : super self::A::internal()
     ;
@@ -140,3 +140,11 @@
   factory A.c() = Missing;
                   ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::a
+  #C2 = constructor-tearoff self::A::b
+  #C3 = constructor-tearoff self::A::c
+  #C4 = constructor-tearoff self::B::a
+  #C5 = constructor-tearoff self::B::b
+}
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect
index 12ffeef..ba2de86 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect
@@ -117,3 +117,12 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_factory.dart:11:7 -> ConstructorTearOffConstant(A.a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_factory.dart:11:7 -> ConstructorTearOffConstant(A.b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_factory.dart:11:7 -> ConstructorTearOffConstant(A.c)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_factory.dart:19:7 -> ConstructorTearOffConstant(B.a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_factory.dart:19:7 -> ConstructorTearOffConstant(B.b)
+Extra constant evaluation: evaluated: 9, effectively constant: 5
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect
index 900f8a7..05e4007 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect
@@ -73,7 +73,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class A<T extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3];
   constructor internal() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -102,7 +102,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
+  static final field dynamic _redirecting# = <dynamic>[#C4, #C5];
   constructor internal() → self::B<self::B::S*>*
     : super self::A::internal()
     ;
@@ -140,3 +140,11 @@
   factory A.c() = Missing;
                   ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::a
+  #C2 = constructor-tearoff self::A::b
+  #C3 = constructor-tearoff self::A::c
+  #C4 = constructor-tearoff self::B::a
+  #C5 = constructor-tearoff self::B::b
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect
index 58f3e10..b0dbf3f 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect
@@ -63,7 +63,7 @@
 import "dart:core" as core;
 
 class C extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::C::good];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   const constructor constant() → self::C*
     : super core::Object::•()
     ;
@@ -98,17 +98,18 @@
          ^";
 static method main() → dynamic {
   self::C* c = null;
-  core::print(#C1);
+  core::print(#C2);
   core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
 Try using a constructor or factory that is 'const'.
   print(const C.missingFactoryKeyword());
               ^");
-  core::print(#C1);
+  core::print(#C2);
   core::print(new self::C::constant().{self::C::notEvenAConstructor}(null){(dynamic) →* self::C*});
 }
 
 constants  {
-  #C1 = self::C {}
+  #C1 = constructor-tearoff self::C::good
+  #C2 = self::C {}
 }
 
 
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect
index 49eadbc..19384f6 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect
@@ -54,3 +54,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_000044.dart:9:7 -> ConstructorTearOffConstant(C.good)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect
index 41ab0dd..b406cc3 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect
@@ -63,7 +63,7 @@
 import "dart:core" as core;
 
 class C extends core::Object /*hasConstConstructor*/  {
-  static final field dynamic _redirecting# = <dynamic>[self::C::good];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   const constructor constant() → self::C*
     : super core::Object::•()
     ;
@@ -98,17 +98,18 @@
          ^";
 static method main() → dynamic {
   self::C* c = null;
-  core::print(#C1);
+  core::print(#C2);
   core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
 Try using a constructor or factory that is 'const'.
   print(const C.missingFactoryKeyword());
               ^");
-  core::print(#C1);
+  core::print(#C2);
   core::print(new self::C::constant().{self::C::notEvenAConstructor}(null){(dynamic) →* self::C*});
 }
 
 constants  {
-  #C1 = self::C {}
+  #C1 = constructor-tearoff self::C::good
+  #C2 = self::C {}
 }
 
 
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect
index 3f594b7..66f50c0 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::foo];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•() {}
   static factory foo() → self::A*
@@ -24,7 +24,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends self::A {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor •() → self::C*
     : super self::A::•() {}
   static factory bar() → self::C*
@@ -45,3 +45,8 @@
   self::A* a = new self::D::•();
   exp::Expect::equals(2, a.{self::A::m}(){() →* core::int*});
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo
+  #C2 = constructor-tearoff self::C::bar
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect
index b498bf4..1f48749 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect
@@ -40,3 +40,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_000067.dart:7:7 -> ConstructorTearOffConstant(A.foo)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_000067.dart:13:7 -> ConstructorTearOffConstant(C.bar)
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect
index 3f594b7..66f50c0 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 class A extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::A::foo];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::A*
     : super core::Object::•() {}
   static factory foo() → self::A*
@@ -24,7 +24,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends self::A {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor •() → self::C*
     : super self::A::•() {}
   static factory bar() → self::C*
@@ -45,3 +45,8 @@
   self::A* a = new self::D::•();
   exp::Expect::equals(2, a.{self::A::m}(){() →* core::int*});
 }
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo
+  #C2 = constructor-tearoff self::C::bar
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect
index 89937c2..6a366d0 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect
@@ -33,7 +33,7 @@
 import "dart:core" as core;
 
 class Supertype extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •() → self::Supertype*
     return invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
   factory Supertype() = Unresolved;
@@ -54,3 +54,7 @@
   print(new Supertype());
             ^");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::Supertype::•
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect
index e164c58..da1fe3e 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect
@@ -47,3 +47,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_35259.dart:5:7 -> ConstructorTearOffConstant(Supertype.)
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect
index 89937c2..6a366d0 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect
@@ -33,7 +33,7 @@
 import "dart:core" as core;
 
 class Supertype extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •() → self::Supertype*
     return invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
   factory Supertype() = Unresolved;
@@ -54,3 +54,7 @@
   print(new Supertype());
             ^");
 }
+
+constants  {
+  #C1 = constructor-tearoff self::Supertype::•
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect
index 27e321c..0b4828a 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class Supertype extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •() → self::Supertype*
     return new self::X::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -51,3 +51,7 @@
   X x = new Supertype();
             ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::Supertype::•
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect
index 5198fda..fd0802b 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect
@@ -43,3 +43,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_35260.dart:5:7 -> ConstructorTearOffConstant(Supertype.)
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect
index 27e321c..0b4828a 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class Supertype extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   static factory •() → self::Supertype*
     return new self::X::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -51,3 +51,7 @@
   X x = new Supertype();
             ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::Supertype::•
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect
index 6e380a7..9885c52 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::foo];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::B<self::B::T*>*
     : super self::C::•()
     ;
@@ -25,7 +25,7 @@
     return new self::B::•<self::B::foo::T*>();
 }
 class C<K extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor •() → self::C<self::C::K*>*
     : super core::Object::•()
     ;
@@ -49,3 +49,8 @@
   factory C.bar() = B<K>.foo;
                     ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::B::foo
+  #C2 = constructor-tearoff self::C::bar
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect
index b64319b..c71adb4 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect
@@ -44,3 +44,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_35266.dart:5:7 -> ConstructorTearOffConstant(B.foo)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue_35266.dart:11:7 -> ConstructorTearOffConstant(C.bar)
+Extra constant evaluation: evaluated: 5, effectively constant: 2
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect
index 6e380a7..9885c52 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
-  static final field dynamic _redirecting# = <dynamic>[self::B::foo];
+  static final field dynamic _redirecting# = <dynamic>[#C1];
   constructor •() → self::B<self::B::T*>*
     : super self::C::•()
     ;
@@ -25,7 +25,7 @@
     return new self::B::•<self::B::foo::T*>();
 }
 class C<K extends core::Object* = dynamic> extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[self::C::bar];
+  static final field dynamic _redirecting# = <dynamic>[#C2];
   constructor •() → self::C<self::C::K*>*
     : super core::Object::•()
     ;
@@ -49,3 +49,8 @@
   factory C.bar() = B<K>.foo;
                     ^";
 }
+
+constants  {
+  #C1 = constructor-tearoff self::B::foo
+  #C2 = constructor-tearoff self::C::bar
+}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 3bddafe..86800bb 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -4921,7 +4921,8 @@
   Reference targetReference;
 
   StaticGet(Member target)
-      : this.byReference(getNonNullableMemberReferenceGetter(target));
+      : assert(target is Field || (target is Procedure && target.isGetter)),
+        this.targetReference = getNonNullableMemberReferenceGetter(target);
 
   StaticGet.byReference(this.targetReference);
 
@@ -4969,7 +4970,10 @@
   Reference targetReference;
 
   StaticTearOff(Procedure target)
-      : this.byReference(getNonNullableMemberReferenceGetter(target));
+      : assert(target.isStatic, "Unexpected static tear off target: $target"),
+        assert(target.kind == ProcedureKind.Method,
+            "Unexpected static tear off target: $target"),
+        this.targetReference = getNonNullableMemberReferenceGetter(target);
 
   StaticTearOff.byReference(this.targetReference);
 
@@ -8619,8 +8623,9 @@
   Reference targetReference;
 
   ConstructorTearOff(Member target)
-      : assert(target is Constructor ||
-            (target is Procedure && target.kind == ProcedureKind.Factory)),
+      : assert(
+            target is Constructor || (target is Procedure && target.isFactory),
+            "Unexpected constructor tear off target: $target"),
         this.targetReference = getNonNullableMemberReferenceGetter(target);
 
   ConstructorTearOff.byReference(this.targetReference);
@@ -13170,10 +13175,11 @@
   @override
   final Reference targetReference;
 
-  StaticTearOffConstant(Procedure procedure)
-      : targetReference = procedure.reference {
-    assert(procedure.isStatic);
-  }
+  StaticTearOffConstant(Procedure target)
+      : assert(target.isStatic),
+        assert(target.kind == ProcedureKind.Method,
+            "Unexpected static tear off target: $target"),
+        targetReference = target.reference;
 
   StaticTearOffConstant.byReference(this.targetReference);
 
@@ -13231,8 +13237,9 @@
   final Reference targetReference;
 
   ConstructorTearOffConstant(Member target)
-      : assert(target is Constructor ||
-            (target is Procedure && target.kind == ProcedureKind.Factory)),
+      : assert(
+            target is Constructor || (target is Procedure && target.isFactory),
+            "Unexpected constructor tear off target: $target"),
         this.targetReference = getNonNullableMemberReferenceGetter(target);
 
   ConstructorTearOffConstant.byReference(this.targetReference);
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 42babc4..6a24e52 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2849,12 +2849,7 @@
     writeSpaced('=');
     writeWord('instantiation');
     writeSpace();
-    Constant tearOffConstant = node.tearOffConstant;
-    if (tearOffConstant is TearOffConstant) {
-      writeMemberReferenceFromReference(tearOffConstant.targetReference);
-    } else {
-      writeConstantReference(tearOffConstant);
-    }
+    writeConstantReference(node.tearOffConstant);
     writeSpace();
     writeSymbol('<');
     writeList(node.types, writeType);
diff --git a/tools/VERSION b/tools/VERSION
index 6743daf..9ab1341 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 253
+PRERELEASE 254
 PRERELEASE_PATCH 0
\ No newline at end of file