Version 2.15.0-68.0.dev

Merge commit 'c13b0bbe9735713bcb5affdd6d56f28f0252a12e' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index a64606e..37971a9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -316,8 +316,8 @@
           Name targetName =
               new Name(constructorName, declaration.library.library);
           Procedure tearOff = tearOffs![targetName] =
-              createTypedefTearOffProcedure(
-                  name, constructorName, library, fileUri, charOffset);
+              createTypedefTearOffProcedure(name, constructorName, library,
+                  target.fileUri, target.fileOffset);
           _tearOffDependencies![tearOff] = target;
 
           buildTypedefTearOffProcedure(tearOff, target, declaration.cls,
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 91acfd5..1ecd540 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
@@ -90,19 +90,19 @@
   core::String typeName = (#C7).{core::Type::toString}(){() → core::String};
   core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
 }
-static method _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
   return core::List::•<core::List<self::_#ListList#new#tearOff::T%>>(length);
-static method _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
   return core::List::filled<core::List<self::_#ListList#filled#tearOff::T%>>(length, fill, growable: growable);
-static method _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
   return core::List::empty<core::List<self::_#ListList#empty#tearOff::T%>>(growable: growable);
-static method _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
   return core::List::from<core::List<self::_#ListList#from#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
   return core::List::of<core::List<self::_#ListList#of#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
   return core::List::generate<core::List<self::_#ListList#generate#tearOff::T%>>(length, generator, growable: growable);
-static method _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
   return core::List::unmodifiable<core::List<self::_#ListList#unmodifiable#tearOff::T%>>(elements);
 
 constants  {
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 5ba5c40..4176e23 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
@@ -98,19 +98,19 @@
   core::String typeName = (#C7).{core::Type::toString}(){() → core::String};
   core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
 }
-static method _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
   return core::_List::•<core::List<self::_#ListList#new#tearOff::T%>>(length);
-static method _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
   return core::List::filled<core::List<self::_#ListList#filled#tearOff::T%>>(length, fill, growable: growable);
-static method _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
   return core::List::empty<core::List<self::_#ListList#empty#tearOff::T%>>(growable: growable);
-static method _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
   return core::List::from<core::List<self::_#ListList#from#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
   return core::List::of<core::List<self::_#ListList#of#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
   return core::List::generate<core::List<self::_#ListList#generate#tearOff::T%>>(length, generator, growable: growable);
-static method _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
   return core::List::unmodifiable<core::List<self::_#ListList#unmodifiable#tearOff::T%>>(elements);
 
 constants  {
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 d11b021..10969f4 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
@@ -90,19 +90,19 @@
   core::String typeName = (#C7).{core::Type::toString}(){() → core::String};
   core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
 }
-static method _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
   return core::List::•<core::List<self::_#ListList#new#tearOff::T%>>(length);
-static method _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
   return core::List::filled<core::List<self::_#ListList#filled#tearOff::T%>>(length, fill, growable: growable);
-static method _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
   return core::List::empty<core::List<self::_#ListList#empty#tearOff::T%>>(growable: growable);
-static method _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
   return core::List::from<core::List<self::_#ListList#from#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
   return core::List::of<core::List<self::_#ListList#of#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
   return core::List::generate<core::List<self::_#ListList#generate#tearOff::T%>>(length, generator, growable: growable);
-static method _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
   return core::List::unmodifiable<core::List<self::_#ListList#unmodifiable#tearOff::T%>>(elements);
 
 constants  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.outline.expect
index 989a2cb..0db844e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.outline.expect
@@ -57,17 +57,17 @@
   return () → void => self::Ext|emethod(#this);
 static method main() → void
   ;
-static method _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
   return core::List::•<core::List<self::_#ListList#new#tearOff::T%>>(length);
-static method _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
   return core::List::filled<core::List<self::_#ListList#filled#tearOff::T%>>(length, fill, growable: growable);
-static method _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
   return core::List::empty<core::List<self::_#ListList#empty#tearOff::T%>>(growable: growable);
-static method _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
   return core::List::from<core::List<self::_#ListList#from#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
   return core::List::of<core::List<self::_#ListList#of#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
   return core::List::generate<core::List<self::_#ListList#generate#tearOff::T%>>(length, generator, growable: growable);
-static method _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
   return core::List::unmodifiable<core::List<self::_#ListList#unmodifiable#tearOff::T%>>(elements);
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 c8e2bba..f3202b5 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
@@ -98,19 +98,19 @@
   core::String typeName = (#C7).{core::Type::toString}(){() → core::String};
   core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
 }
-static method _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length = #C9]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
   return core::_List::•<core::List<self::_#ListList#new#tearOff::T%>>(length);
-static method _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable = #C10}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
   return core::List::filled<core::List<self::_#ListList#filled#tearOff::T%>>(length, fill, growable: growable);
-static method _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable = #C10}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
   return core::List::empty<core::List<self::_#ListList#empty#tearOff::T%>>(growable: growable);
-static method _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
   return core::List::from<core::List<self::_#ListList#from#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
   return core::List::of<core::List<self::_#ListList#of#tearOff::T%>>(elements, growable: growable);
-static method _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable = #C11}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
   return core::List::generate<core::List<self::_#ListList#generate#tearOff::T%>>(length, generator, growable: growable);
-static method _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
   return core::List::unmodifiable<core::List<self::_#ListList#unmodifiable#tearOff::T%>>(elements);
 
 constants  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart
new file mode 100644
index 0000000..6dd9ff1
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'typedef_from_lib.dart';
+
+part 'typedef_from_part.dart';
+
+main() {
+  var aNew = A.new;
+  var aNamed = A.named;
+  var aFact = A.fact;
+  var aRedirect = A.redirect;
+
+  aNew('', '');
+  aNew(0, '');
+  aNamed('');
+  aNamed(0, '');
+  aNamed('', '', 87);
+  aFact(0);
+  aFact('', b: '');
+  aFact(0, c: 87);
+  aFact('', c: 87, b: '');
+  aRedirect('');
+  aRedirect(0);
+
+  var aNewInst = aNew<bool>;
+  var aNamedInst = aNamed<bool>;
+  var aFactInst = aFact<bool>;
+  var aRedirectInst = aRedirect<bool>;
+
+  aNewInst(true, '');
+  aNamedInst(false);
+  aNamedInst(true, '');
+  aNamedInst(false, '', 87);
+  aFactInst(true);
+  aFactInst(false, b: '');
+  aFactInst(true, c: 87);
+  aFactInst(false, c: 87, b: '');
+  aRedirectInst(true);
+  
+  var bNew = B.new;
+  var bNamed = B.named;
+  var bFact = B.fact;
+  var bRedirect = B.redirect;
+
+  bNew('', 0);
+  bNew(0, 0);
+  bNamed('');
+  bNamed(0, 0);
+  bNamed('', 0, 87);
+  bFact(0);
+  bFact('', b: 0);
+  bFact(0, c: 87);
+  bFact('', c: 87, b: 0);
+  bRedirect('');
+  bRedirect(0);
+
+  var bNewInst = bNew<bool>;
+  var bNamedInst = bNamed<bool>;
+  var bFactInst = bFact<bool>;
+  var bRedirectInst = bRedirect<bool>;
+
+  bNewInst(true, 0);
+  bNamedInst(false);
+  bNamedInst(true, 0);
+  bNamedInst(false, 0, 87);
+  bFactInst(true);
+  bFactInst(false, b: 0);
+  bFactInst(true, c: 87);
+  bFactInst(false, c: 87, b: 0);
+  bRedirectInst(true);
+}
+
+class Class<S, T> {
+  Class(S a, T b);
+  Class.named(S a, [T? b, int c = 42]);
+  factory Class.fact(S a, {T? b, int c: 42}) => Class.named(a, b, c);
+  factory Class.redirect(S a) = Class.named;
+}
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
new file mode 100644
index 0000000..3f74e4e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.expect
@@ -0,0 +1,125 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_lib.dart";
+
+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*/;
+  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%>
+    : 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%>
+    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%>
+    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%>
+    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);
+  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
+    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;
+  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>};
+  aNamed<core::int>(0, ""){(core::int, [core::String?, core::int]) → self::Class<core::int, core::String>};
+  aNamed<core::String>("", "", 87){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
+  aFact<core::int>(0){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aFact<core::int>(0, c: 87){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", c: 87, b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aRedirect<core::String>(""){(core::String) → self::Class<core::String, core::String>};
+  aRedirect<core::int>(0){(core::int) → self::Class<core::int, core::String>};
+  (core::bool, core::String) → self::Class<core::bool, core::String> aNewInst = aNew<core::bool>;
+  (core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String> aNamedInst = aNamed<core::bool>;
+  (core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String> aFactInst = aFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::String> aRedirectInst = aRedirect<core::bool>;
+  aNewInst(true, ""){(core::bool, core::String) → self::Class<core::bool, core::String>};
+  aNamedInst(false){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(true, ""){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(false, "", 87){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aFactInst(true){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(false, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  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;
+  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>};
+  bNamed<core::int>(0, 0){(core::int, [core::int?, core::int]) → self::Class<core::int, core::int>};
+  bNamed<core::String>("", 0, 87){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
+  bFact<core::int>(0){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bFact<core::int>(0, c: 87){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", c: 87, b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bRedirect<core::String>(""){(core::String) → self::Class<core::String, core::int>};
+  bRedirect<core::int>(0){(core::int) → self::Class<core::int, core::int>};
+  (core::bool, core::int) → self::Class<core::bool, core::int> bNewInst = bNew<core::bool>;
+  (core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int> bNamedInst = bNamed<core::bool>;
+  (core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int> bFactInst = bFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::int> bRedirectInst = bRedirect<core::bool>;
+  bNewInst(true, 0){(core::bool, core::int) → self::Class<core::bool, core::int>};
+  bNamedInst(false){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(true, 0){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(false, 0, 87){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bFactInst(true){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(true, c: 87){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, c: 87, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bRedirectInst(true){(core::bool) → self::Class<core::bool, core::int>};
+}
+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>
+  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>
+  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);
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "typedef_from.dart" as self;
+
+import "org-dartlang-testcase:///typedef_from.dart";
+
+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>
+  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>
+  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
+}
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
new file mode 100644
index 0000000..3f74e4e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.strong.transformed.expect
@@ -0,0 +1,125 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_lib.dart";
+
+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*/;
+  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%>
+    : 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%>
+    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%>
+    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%>
+    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);
+  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
+    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;
+  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>};
+  aNamed<core::int>(0, ""){(core::int, [core::String?, core::int]) → self::Class<core::int, core::String>};
+  aNamed<core::String>("", "", 87){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
+  aFact<core::int>(0){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aFact<core::int>(0, c: 87){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", c: 87, b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aRedirect<core::String>(""){(core::String) → self::Class<core::String, core::String>};
+  aRedirect<core::int>(0){(core::int) → self::Class<core::int, core::String>};
+  (core::bool, core::String) → self::Class<core::bool, core::String> aNewInst = aNew<core::bool>;
+  (core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String> aNamedInst = aNamed<core::bool>;
+  (core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String> aFactInst = aFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::String> aRedirectInst = aRedirect<core::bool>;
+  aNewInst(true, ""){(core::bool, core::String) → self::Class<core::bool, core::String>};
+  aNamedInst(false){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(true, ""){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(false, "", 87){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aFactInst(true){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(false, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  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;
+  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>};
+  bNamed<core::int>(0, 0){(core::int, [core::int?, core::int]) → self::Class<core::int, core::int>};
+  bNamed<core::String>("", 0, 87){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
+  bFact<core::int>(0){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bFact<core::int>(0, c: 87){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", c: 87, b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bRedirect<core::String>(""){(core::String) → self::Class<core::String, core::int>};
+  bRedirect<core::int>(0){(core::int) → self::Class<core::int, core::int>};
+  (core::bool, core::int) → self::Class<core::bool, core::int> bNewInst = bNew<core::bool>;
+  (core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int> bNamedInst = bNamed<core::bool>;
+  (core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int> bFactInst = bFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::int> bRedirectInst = bRedirect<core::bool>;
+  bNewInst(true, 0){(core::bool, core::int) → self::Class<core::bool, core::int>};
+  bNamedInst(false){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(true, 0){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(false, 0, 87){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bFactInst(true){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(true, c: 87){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, c: 87, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bRedirectInst(true){(core::bool) → self::Class<core::bool, core::int>};
+}
+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>
+  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>
+  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);
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "typedef_from.dart" as self;
+
+import "org-dartlang-testcase:///typedef_from.dart";
+
+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>
+  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>
+  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
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.textual_outline.expect
new file mode 100644
index 0000000..d0244db
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import 'typedef_from_lib.dart';
+part 'typedef_from_part.dart';
+
+main() {}
+
+class Class<S, T> {
+  Class(S a, T b);
+  Class.named(S a, [T? b, int c = 42]);
+  factory Class.fact(S a, {T? b, int c: 42}) => Class.named(a, b, c);
+  factory Class.redirect(S a) = Class.named;
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..704e8ee
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import 'typedef_from_lib.dart';
+part 'typedef_from_part.dart';
+
+class Class<S, T> {
+  Class(S a, T b);
+  Class.named(S a, [T? b, int c = 42]);
+  factory Class.fact(S a, {T? b, int c: 42}) => Class.named(a, b, c);
+  factory Class.redirect(S a) = Class.named;
+}
+
+main() {}
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
new file mode 100644
index 0000000..3f74e4e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.expect
@@ -0,0 +1,125 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_lib.dart";
+
+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*/;
+  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%>
+    : 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%>
+    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%>
+    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%>
+    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);
+  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
+    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;
+  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>};
+  aNamed<core::int>(0, ""){(core::int, [core::String?, core::int]) → self::Class<core::int, core::String>};
+  aNamed<core::String>("", "", 87){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
+  aFact<core::int>(0){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aFact<core::int>(0, c: 87){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", c: 87, b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aRedirect<core::String>(""){(core::String) → self::Class<core::String, core::String>};
+  aRedirect<core::int>(0){(core::int) → self::Class<core::int, core::String>};
+  (core::bool, core::String) → self::Class<core::bool, core::String> aNewInst = aNew<core::bool>;
+  (core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String> aNamedInst = aNamed<core::bool>;
+  (core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String> aFactInst = aFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::String> aRedirectInst = aRedirect<core::bool>;
+  aNewInst(true, ""){(core::bool, core::String) → self::Class<core::bool, core::String>};
+  aNamedInst(false){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(true, ""){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(false, "", 87){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aFactInst(true){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(false, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  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;
+  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>};
+  bNamed<core::int>(0, 0){(core::int, [core::int?, core::int]) → self::Class<core::int, core::int>};
+  bNamed<core::String>("", 0, 87){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
+  bFact<core::int>(0){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bFact<core::int>(0, c: 87){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", c: 87, b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bRedirect<core::String>(""){(core::String) → self::Class<core::String, core::int>};
+  bRedirect<core::int>(0){(core::int) → self::Class<core::int, core::int>};
+  (core::bool, core::int) → self::Class<core::bool, core::int> bNewInst = bNew<core::bool>;
+  (core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int> bNamedInst = bNamed<core::bool>;
+  (core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int> bFactInst = bFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::int> bRedirectInst = bRedirect<core::bool>;
+  bNewInst(true, 0){(core::bool, core::int) → self::Class<core::bool, core::int>};
+  bNamedInst(false){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(true, 0){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(false, 0, 87){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bFactInst(true){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(true, c: 87){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, c: 87, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bRedirectInst(true){(core::bool) → self::Class<core::bool, core::int>};
+}
+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>
+  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>
+  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);
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "typedef_from.dart" as self;
+
+import "org-dartlang-testcase:///typedef_from.dart";
+
+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>
+  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>
+  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
+}
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
new file mode 100644
index 0000000..d0d9059
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_lib.dart";
+
+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*/;
+  constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
+    ;
+  constructor named(self::Class::S% a, [self::Class::T? b, core::int c]) → self::Class<self::Class::S%, self::Class::T%>
+    ;
+  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, core::int c]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b, core::int c}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+    ;
+  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b, core::int c}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
+  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);
+  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
+    return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
+}
+static method main() → dynamic
+  ;
+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, core::int c]) → 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, core::int c}) → 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);
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "typedef_from.dart" as self;
+
+import "org-dartlang-testcase:///typedef_from.dart";
+
+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, core::int c]) → 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, core::int c}) → 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);
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
new file mode 100644
index 0000000..3f74e4e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.transformed.expect
@@ -0,0 +1,125 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_lib.dart";
+
+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*/;
+  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%>
+    : 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%>
+    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%>
+    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%>
+    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);
+  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
+    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;
+  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>};
+  aNamed<core::int>(0, ""){(core::int, [core::String?, core::int]) → self::Class<core::int, core::String>};
+  aNamed<core::String>("", "", 87){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
+  aFact<core::int>(0){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aFact<core::int>(0, c: 87){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", c: 87, b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aRedirect<core::String>(""){(core::String) → self::Class<core::String, core::String>};
+  aRedirect<core::int>(0){(core::int) → self::Class<core::int, core::String>};
+  (core::bool, core::String) → self::Class<core::bool, core::String> aNewInst = aNew<core::bool>;
+  (core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String> aNamedInst = aNamed<core::bool>;
+  (core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String> aFactInst = aFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::String> aRedirectInst = aRedirect<core::bool>;
+  aNewInst(true, ""){(core::bool, core::String) → self::Class<core::bool, core::String>};
+  aNamedInst(false){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(true, ""){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(false, "", 87){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aFactInst(true){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(false, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  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;
+  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>};
+  bNamed<core::int>(0, 0){(core::int, [core::int?, core::int]) → self::Class<core::int, core::int>};
+  bNamed<core::String>("", 0, 87){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
+  bFact<core::int>(0){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bFact<core::int>(0, c: 87){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", c: 87, b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bRedirect<core::String>(""){(core::String) → self::Class<core::String, core::int>};
+  bRedirect<core::int>(0){(core::int) → self::Class<core::int, core::int>};
+  (core::bool, core::int) → self::Class<core::bool, core::int> bNewInst = bNew<core::bool>;
+  (core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int> bNamedInst = bNamed<core::bool>;
+  (core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int> bFactInst = bFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::int> bRedirectInst = bRedirect<core::bool>;
+  bNewInst(true, 0){(core::bool, core::int) → self::Class<core::bool, core::int>};
+  bNamedInst(false){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(true, 0){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(false, 0, 87){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bFactInst(true){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(true, c: 87){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, c: 87, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bRedirectInst(true){(core::bool) → self::Class<core::bool, core::int>};
+}
+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>
+  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>
+  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);
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "typedef_from.dart" as self;
+
+import "org-dartlang-testcase:///typedef_from.dart";
+
+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>
+  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>
+  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
+}
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 ad13134..90eb13b 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
   return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
   return new mai::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
   return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);
 
 library /*isNonNullableByDefault*/;
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 ad13134..90eb13b 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
   return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
   return new mai::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
   return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);
 
 library /*isNonNullableByDefault*/;
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 ad13134..90eb13b 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
   return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
   return new mai::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
   return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);
 
 library /*isNonNullableByDefault*/;
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 cd0b2f3..0e4f276 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
@@ -18,13 +18,13 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b, core::int c}) → mai::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b, core::int c}) → mai::A<self::_#H#fact#tearOff::Y%>
   return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
   return new mai::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b]) → mai::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b]) → mai::A<self::_#H#named#tearOff::Y%>
   return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);
 
 library /*isNonNullableByDefault*/;
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 ad13134..90eb13b 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
   return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
   return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
   return new mai::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
   return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_lib.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_lib.dart
new file mode 100644
index 0000000..ff58b28
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'typedef_from.dart';
+
+typedef A<T> = Class<T, String>;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_part.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_part.dart
new file mode 100644
index 0000000..5710fab
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_part.dart
@@ -0,0 +1,7 @@
+// 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.
+
+part of 'typedef_from.dart';
+
+typedef B<S> = Class<S, int>;
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 4a19911..81462df 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
   return new typ::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
   return new typ::A::named<self::_#H#named#tearOff::Y%>(a, b);
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
   return typ::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
   return typ::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
 
 library /*isNonNullableByDefault*/;
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 4a19911..81462df 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
   return new typ::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
   return new typ::A::named<self::_#H#named#tearOff::Y%>(a, b);
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
   return typ::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
   return typ::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
 
 library /*isNonNullableByDefault*/;
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 4a19911..81462df 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
   return new typ::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
   return new typ::A::named<self::_#H#named#tearOff::Y%>(a, b);
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
   return typ::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
   return typ::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
 
 library /*isNonNullableByDefault*/;
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 cca6cc2..b6ebfa4 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
@@ -18,13 +18,13 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
   return new typ::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b]) → typ::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b]) → typ::A<self::_#H#named#tearOff::Y%>
   return new typ::A::named<self::_#H#named#tearOff::Y%>(a, b);
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b, core::int c}) → typ::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b, core::int c}) → typ::A<self::_#H#fact#tearOff::Y%>
   return typ::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
   return typ::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
 
 library /*isNonNullableByDefault*/;
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 4a19911..81462df 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
@@ -68,13 +68,13 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
   return new typ::A::•<self::_#H#new#tearOff::Y%>();
-static method _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
   return new typ::A::named<self::_#H#named#tearOff::Y%>(a, b);
-static method _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
   return typ::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
-static method _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
   return typ::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect
index 7e82df9..94e4635 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect
@@ -36,17 +36,17 @@
   core::String a;
 }
 static method main() → dynamic {}
-static method _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
-static method _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect
index 7e82df9..94e4635 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect
@@ -36,17 +36,17 @@
   core::String a;
 }
 static method main() → dynamic {}
-static method _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
-static method _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect
index 7e82df9..94e4635 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect
@@ -36,17 +36,17 @@
   core::String a;
 }
 static method main() → dynamic {}
-static method _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
-static method _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect
index 3fd24b5..782f6eb 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect
@@ -28,15 +28,15 @@
   ;
 static method main() → dynamic
   ;
-static method _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start, core::int? end]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start, core::int? end]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
-static method _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start, core::int? end]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start, core::int? end]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect
index 7e82df9..94e4635 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect
@@ -36,17 +36,17 @@
   core::String a;
 }
 static method main() → dynamic {}
-static method _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
-static method _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
   return core::String::fromCharCodes(charCodes, start, end);
-static method _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
   return core::String::fromCharCode(charCode);
-static method _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
   return core::String::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
diff --git a/tools/VERSION b/tools/VERSION
index f3425e5..ef5f560 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 67
+PRERELEASE 68
 PRERELEASE_PATCH 0
\ No newline at end of file