Version 2.14.0-211.0.dev

Merge commit '5c0b3877e35166e1d79f39ba8b700729a5be00e0' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index 036786e..cfbdb7f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -31,6 +31,10 @@
     var expression = request.dotTarget;
 
     if (expression == null) {
+      if (!request.includeIdentifiers) {
+        return;
+      }
+
       var classOrMixin = request.target.containingNode
           .thisOrAncestorOfType<ClassOrMixinDeclaration>();
       if (classOrMixin != null) {
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 08d3056..fd933fa 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -538,6 +538,23 @@
     expect(suggestions, isEmpty);
   }
 
+  Future<void> test_inDartDoc3() async {
+    addTestFile('''
+class MyClass {
+  /// ^
+  void foo() {}
+
+  void bar() {}
+}
+
+extension MyClassExtension on MyClass {
+  void baz() {}
+}
+  ''');
+    await getSuggestions();
+    expect(suggestions, isEmpty);
+  }
+
   Future<void> test_inDartDoc_reference1() async {
     newFile('/testA.dart', content: '''
   part of libA;
@@ -564,6 +581,24 @@
     assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'main');
   }
 
+  Future<void> test_inDartDoc_reference3() async {
+    addTestFile('''
+class MyClass {
+  /// [^]
+  void foo() {}
+
+  void bar() {}
+}
+
+extension MyClassExtension on MyClass {
+  void baz() {}
+}
+  ''');
+    await getSuggestions();
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'bar');
+    assertHasResult(CompletionSuggestionKind.INVOCATION, 'baz');
+  }
+
   Future<void> test_inherited() {
     addTestFile('''
 class A {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 91da0d0..8736d5a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -3577,7 +3577,7 @@
     // limitation of Kernel.
     if (typeParameter != null &&
         typeParameter.fileOffset != -1 &&
-        typeParameter.parent != null) {
+        typeParameter.location != null) {
       // It looks like when parameters come from patch files, they don't
       // have a reportable location.
       (context ??= <LocatedMessage>[]).add(
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart
index da236c6..ff2f3fe4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart
@@ -5,9 +5,17 @@
 class A<X> {
   A.foo1(X x) {}
   A.foo2(X x, int y) {}
+  A();
 }
 
-A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-A<X> Function<X>(X) bar2() => A.foo2; // Error.
+A<X> Function<X>(X) test1() => A.foo1; // Ok.
+A<X> Function<X>(X) test2() => A.foo2; // Error.
+A<X> Function<X>(X) test3() => A.new; // Error.
+A<X> Function<X>(X) test4() => A<int>.new; // Error.
+A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
 
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
index 95d69d7..31c797b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
@@ -2,13 +2,71 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-// A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test1() => A.foo1; // Ok.
+//                                  ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-// A<X> Function<X>(X) bar2() => A.foo2; // Error.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test2() => A.foo2; // Error.
+//                                  ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test3() => A.new; // Error.
+//                                  ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                               ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                               ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                               ^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +76,44 @@
     : super core::Object::•() {}
   constructor foo2(self::A::X% x, core::int y) → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
 }
-static method bar1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-                                ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
-static method bar2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-A<X> Function<X>(X) bar2() => A.foo2; // Error.
-                                ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test1() => A.foo1; // Ok.
+                                 ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test2() => A.foo2; // Error.
+                                 ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test3() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test3() => A.new; // Error.
+                                 ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test4() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test4() => A<int>.new; // Error.
+                                      ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test5() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+                                              ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test6() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+                                      ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test7() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+                                              ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test8() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+                                      ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test9() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+                                              ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
index a746dcf..5b92215 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
@@ -2,13 +2,71 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-// A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test1() => A.foo1; // Ok.
+//                                  ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-// A<X> Function<X>(X) bar2() => A.foo2; // Error.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test2() => A.foo2; // Error.
+//                                  ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test3() => A.new; // Error.
+//                                  ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                               ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                               ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                               ^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +76,44 @@
     : super core::Object::•() {}
   constructor foo2(self::A::X% x, core::int y) → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
 }
-static method bar1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-                                ^^^^";
-static method bar2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-A<X> Function<X>(X) bar2() => A.foo2; // Error.
-                                ^^^^";
+static method test1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test1() => A.foo1; // Ok.
+                                 ^^^^";
+static method test2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test2() => A.foo2; // Error.
+                                 ^^^^";
+static method test3() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test3() => A.new; // Error.
+                                 ^^^";
+static method test4() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test4() => A<int>.new; // Error.
+                                      ^^^";
+static method test5() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+                                              ^^^";
+static method test6() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+                                      ^^^^";
+static method test7() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+                                              ^^^^";
+static method test8() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+                                      ^^^^";
+static method test9() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+                                              ^^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.textual_outline.expect
index b3ddfbc..6aba9ce 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.textual_outline.expect
@@ -1,8 +1,15 @@
 class A<X> {
   A.foo1(X x) {}
   A.foo2(X x, int y) {}
+  A();
 }
-
-A<X> Function<X>(X) bar1() => A.foo1;
-A<X> Function<X>(X) bar2() => A.foo2;
+A<X> Function<X>(X) test1() => A.foo1;
+A<X> Function<X>(X) test2() => A.foo2;
+A<X> Function<X>(X) test3() => A.new;
+A<X> Function<X>(X) test4() => A<int>.new;
+A<X> Function<X>(X) test5() => A<int, String>.new;
+A<X> Function<X>(X) test6() => A<int>.foo1;
+A<X> Function<X>(X) test7() => A<int, String>.foo1;
+A<X> Function<X>(X) test8() => A<int>.foo2;
+A<X> Function<X>(X) test9() => A<int, String>.foo2;
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
index 95d69d7..31c797b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
@@ -2,13 +2,71 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-// A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test1() => A.foo1; // Ok.
+//                                  ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-// A<X> Function<X>(X) bar2() => A.foo2; // Error.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test2() => A.foo2; // Error.
+//                                  ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test3() => A.new; // Error.
+//                                  ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                               ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                               ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                               ^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +76,44 @@
     : super core::Object::•() {}
   constructor foo2(self::A::X% x, core::int y) → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
 }
-static method bar1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-                                ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
-static method bar2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-A<X> Function<X>(X) bar2() => A.foo2; // Error.
-                                ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test1() => A.foo1; // Ok.
+                                 ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test2() => A.foo2; // Error.
+                                 ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test3() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test3() => A.new; // Error.
+                                 ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test4() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test4() => A<int>.new; // Error.
+                                      ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test5() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+                                              ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test6() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+                                      ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test7() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+                                              ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test8() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+                                      ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
+static method test9() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+                                              ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} <X extends core::Object? = dynamic>(X%) → self::A<X%>;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.outline.expect
index 8de528e..4e4b8c9 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.outline.expect
@@ -7,10 +7,26 @@
     ;
   constructor foo2(self::A::X% x, core::int y) → self::A<self::A::X%>
     ;
+  constructor •() → self::A<self::A::X%>
+    ;
 }
-static method bar1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+static method test1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
   ;
-static method bar2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+static method test2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test3() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test4() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test5() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test6() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test7() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test8() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  ;
+static method test9() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
index a746dcf..5b92215 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
@@ -2,13 +2,71 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-// A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test1() => A.foo1; // Ok.
+//                                  ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-// A<X> Function<X>(X) bar2() => A.foo2; // Error.
-//                                 ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test2() => A.foo2; // Error.
+//                                  ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test3() => A.new; // Error.
+//                                  ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                               ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                               ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                       ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                               ^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +76,44 @@
     : super core::Object::•() {}
   constructor foo2(self::A::X% x, core::int y) → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
 }
-static method bar1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:10:33: Error: Getter not found: 'foo1'.
-A<X> Function<X>(X) bar1() => A.foo1; // Ok.
-                                ^^^^";
-static method bar2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:33: Error: Getter not found: 'foo2'.
-A<X> Function<X>(X) bar2() => A.foo2; // Error.
-                                ^^^^";
+static method test1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:11:34: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test1() => A.foo1; // Ok.
+                                 ^^^^";
+static method test2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:12:34: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test2() => A.foo2; // Error.
+                                 ^^^^";
+static method test3() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:34: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test3() => A.new; // Error.
+                                 ^^^";
+static method test4() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test4() => A<int>.new; // Error.
+                                      ^^^";
+static method test5() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
+A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+                                              ^^^";
+static method test6() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+                                      ^^^^";
+static method test7() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
+A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+                                              ^^^^";
+static method test8() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+                                      ^^^^";
+static method test9() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
+A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+                                              ^^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart
index 4d3ffb7..8536334 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart
@@ -4,8 +4,15 @@
 
 class A<X> {
   A.foo() {}
+  A() {}
 }
 
-bar() => A.foo;
+testFoo() => A.foo; // Ok.
+testFooArgs() => A<int>.foo; // Ok.
+testNew() => A.new; // Ok.
+testNewArgs() => A<int>.new; // Ok.
+
+testFooExtraArgs() => A<int, String>.foo; // Error.
+testNewExtraArgs() => A<int, String>.new; // Error.
 
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
index 0a46636..264979c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
@@ -2,9 +2,49 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewArgs() => A<int>.new; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+// testNewArgs() => A<int>.new; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                                      ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +52,31 @@
 class A<X extends core::Object? = dynamic> extends core::Object {
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testFooArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+testFooArgs() => A<int>.foo; // Ok.
+                        ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testNewArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+testNewArgs() => A<int>.new; // Ok.
+                        ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int, String>.foo; // Error.
+                                     ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int, String>.new; // Error.
+                                     ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
index 0a46636..264979c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
@@ -2,9 +2,49 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewArgs() => A<int>.new; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+// testNewArgs() => A<int>.new; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                                      ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +52,31 @@
 class A<X extends core::Object? = dynamic> extends core::Object {
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testFooArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+testFooArgs() => A<int>.foo; // Ok.
+                        ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testNewArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+testNewArgs() => A<int>.new; // Ok.
+                        ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int, String>.foo; // Error.
+                                     ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int, String>.new; // Error.
+                                     ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.textual_outline.expect
index 515382f..79f321c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.textual_outline.expect
@@ -1,6 +1,11 @@
 class A<X> {
   A.foo() {}
+  A() {}
 }
-
-bar() => A.foo;
+testFoo() => A.foo;
+testFooArgs() => A<int>.foo;
+testNew() => A.new;
+testNewArgs() => A<int>.new;
+testFooExtraArgs() => A<int, String>.foo;
+testNewExtraArgs() => A<int, String>.new;
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
index 0a46636..264979c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
@@ -2,9 +2,49 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewArgs() => A<int>.new; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+// testNewArgs() => A<int>.new; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                                      ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +52,31 @@
 class A<X extends core::Object? = dynamic> extends core::Object {
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testFooArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+testFooArgs() => A<int>.foo; // Ok.
+                        ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testNewArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+testNewArgs() => A<int>.new; // Ok.
+                        ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int, String>.foo; // Error.
+                                     ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int, String>.new; // Error.
+                                     ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.outline.expect
index ff77296..b51752b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.outline.expect
@@ -5,8 +5,20 @@
 class A<X extends core::Object? = dynamic> extends core::Object {
   constructor foo() → self::A<self::A::X%>
     ;
+  constructor •() → self::A<self::A::X%>
+    ;
 }
-static method bar() → dynamic
+static method testFoo() → dynamic
+  ;
+static method testFooArgs() → dynamic
+  ;
+static method testNew() → dynamic
+  ;
+static method testNewArgs() → dynamic
+  ;
+static method testFooExtraArgs() → dynamic
+  ;
+static method testNewExtraArgs() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
index 0a46636..264979c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
@@ -2,9 +2,49 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+// testFooArgs() => A<int>.foo; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewArgs() => A<int>.new; // Ok.
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+// testNewArgs() => A<int>.new; // Ok.
+//                         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                                      ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +52,31 @@
 class A<X extends core::Object? = dynamic> extends core::Object {
   constructor foo() → self::A<self::A::X%>
     : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testFooArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
+testFooArgs() => A<int>.foo; // Ok.
+                        ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:12:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testNewArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
+testNewArgs() => A<int>.new; // Ok.
+                        ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int, String>.foo; // Error.
+                                     ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int, String>.new; // Error.
+                                     ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart
index 4f840e8..5128252 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart
@@ -4,10 +4,17 @@
 
 class A<X extends num> {
   A.foo(X x) {}
+  A(X x) {}
 }
 
-A<num> Function(num) bar1() => A.foo; // Ok.
-A<int> Function(int) bar2() => A.foo; // Ok.
-A<dynamic> Function(String) bar3() => A.foo; // Error.
+A<num> Function(num) test1() => A.foo; // Ok.
+A<int> Function(int) test2() => A.foo; // Ok.
+A<num> Function(num) test3() => A.new; // Ok.
+A<int> Function(int) test4() => A.new; // Ok.
+
+A<dynamic> Function(String) test5() => A.foo; // Error.
+A<dynamic> Function(String) test6() => A.new; // Error.
+A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+A<dynamic> Function(num) test8() => A<num>.new; // Error.
 
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
index 2020766..7444b68 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
@@ -2,17 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-// A<num> Function(num) bar1() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+// A<num> Function(num) test1() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-// A<int> Function(int) bar2() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+// A<int> Function(int) test2() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-// A<dynamic> Function(String) bar3() => A.foo; // Error.
-//                                         ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+// A<num> Function(num) test3() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+// A<int> Function(int) test4() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+// A<dynamic> Function(String) test5() => A.foo; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+// A<dynamic> Function(String) test6() => A.new; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                            ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -20,17 +50,39 @@
 class A<X extends core::num> extends core::Object {
   constructor foo(self::A::X x) → self::A<self::A::X>
     : super core::Object::•() {}
+  constructor •(self::A::X x) → self::A<self::A::X>
+    : super core::Object::•() {}
 }
-static method bar1() → (core::num) → self::A<core::num>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-A<num> Function(num) bar1() => A.foo; // Ok.
-                                 ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<core::num>;
-static method bar2() → (core::int) → self::A<core::int>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-A<int> Function(int) bar2() => A.foo; // Ok.
-                                 ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A<core::int>;
-static method bar3() → (core::String) → self::A<dynamic>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-A<dynamic> Function(String) bar3() => A.foo; // Error.
-                                        ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::String) → self::A<dynamic>;
+static method test1() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+A<num> Function(num) test1() => A.foo; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<core::num>;
+static method test2() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+A<int> Function(int) test2() => A.foo; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A<core::int>;
+static method test3() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+A<num> Function(num) test3() => A.new; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<core::num>;
+static method test4() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+A<int> Function(int) test4() => A.new; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A<core::int>;
+static method test5() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+A<dynamic> Function(String) test5() => A.foo; // Error.
+                                         ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::String) → self::A<dynamic>;
+static method test6() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+A<dynamic> Function(String) test6() => A.new; // Error.
+                                         ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::String) → self::A<dynamic>;
+static method test7() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+                                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<dynamic>;
+static method test8() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+A<dynamic> Function(num) test8() => A<num>.new; // Error.
+                                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<dynamic>;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
index c3344f6..3a5a5ad 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
@@ -2,17 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-// A<num> Function(num) bar1() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+// A<num> Function(num) test1() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-// A<int> Function(int) bar2() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+// A<int> Function(int) test2() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-// A<dynamic> Function(String) bar3() => A.foo; // Error.
-//                                         ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+// A<num> Function(num) test3() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+// A<int> Function(int) test4() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+// A<dynamic> Function(String) test5() => A.foo; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+// A<dynamic> Function(String) test6() => A.new; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                            ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -20,17 +50,39 @@
 class A<X extends core::num> extends core::Object {
   constructor foo(self::A::X x) → self::A<self::A::X>
     : super core::Object::•() {}
+  constructor •(self::A::X x) → self::A<self::A::X>
+    : super core::Object::•() {}
 }
-static method bar1() → (core::num) → self::A<core::num>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-A<num> Function(num) bar1() => A.foo; // Ok.
-                                 ^^^";
-static method bar2() → (core::int) → self::A<core::int>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-A<int> Function(int) bar2() => A.foo; // Ok.
-                                 ^^^";
-static method bar3() → (core::String) → self::A<dynamic>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-A<dynamic> Function(String) bar3() => A.foo; // Error.
-                                        ^^^";
+static method test1() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+A<num> Function(num) test1() => A.foo; // Ok.
+                                  ^^^";
+static method test2() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+A<int> Function(int) test2() => A.foo; // Ok.
+                                  ^^^";
+static method test3() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+A<num> Function(num) test3() => A.new; // Ok.
+                                  ^^^";
+static method test4() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+A<int> Function(int) test4() => A.new; // Ok.
+                                  ^^^";
+static method test5() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+A<dynamic> Function(String) test5() => A.foo; // Error.
+                                         ^^^";
+static method test6() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+A<dynamic> Function(String) test6() => A.new; // Error.
+                                         ^^^";
+static method test7() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+                                           ^^^";
+static method test8() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+A<dynamic> Function(num) test8() => A<num>.new; // Error.
+                                           ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.textual_outline.expect
index 2b61a62..11dd004 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.textual_outline.expect
@@ -1,8 +1,13 @@
 class A<X extends num> {
   A.foo(X x) {}
+  A(X x) {}
 }
-
-A<num> Function(num) bar1() => A.foo;
-A<int> Function(int) bar2() => A.foo;
-A<dynamic> Function(String) bar3() => A.foo;
+A<num> Function(num) test1() => A.foo;
+A<int> Function(int) test2() => A.foo;
+A<num> Function(num) test3() => A.new;
+A<int> Function(int) test4() => A.new;
+A<dynamic> Function(String) test5() => A.foo;
+A<dynamic> Function(String) test6() => A.new;
+A<dynamic> Function(num) test7() => A<num>.foo;
+A<dynamic> Function(num) test8() => A<num>.new;
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
index 2020766..7444b68 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
@@ -2,17 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-// A<num> Function(num) bar1() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+// A<num> Function(num) test1() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-// A<int> Function(int) bar2() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+// A<int> Function(int) test2() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-// A<dynamic> Function(String) bar3() => A.foo; // Error.
-//                                         ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+// A<num> Function(num) test3() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+// A<int> Function(int) test4() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+// A<dynamic> Function(String) test5() => A.foo; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+// A<dynamic> Function(String) test6() => A.new; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                            ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -20,17 +50,39 @@
 class A<X extends core::num> extends core::Object {
   constructor foo(self::A::X x) → self::A<self::A::X>
     : super core::Object::•() {}
+  constructor •(self::A::X x) → self::A<self::A::X>
+    : super core::Object::•() {}
 }
-static method bar1() → (core::num) → self::A<core::num>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-A<num> Function(num) bar1() => A.foo; // Ok.
-                                 ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<core::num>;
-static method bar2() → (core::int) → self::A<core::int>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-A<int> Function(int) bar2() => A.foo; // Ok.
-                                 ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A<core::int>;
-static method bar3() → (core::String) → self::A<dynamic>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-A<dynamic> Function(String) bar3() => A.foo; // Error.
-                                        ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::String) → self::A<dynamic>;
+static method test1() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+A<num> Function(num) test1() => A.foo; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<core::num>;
+static method test2() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+A<int> Function(int) test2() => A.foo; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A<core::int>;
+static method test3() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+A<num> Function(num) test3() => A.new; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<core::num>;
+static method test4() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+A<int> Function(int) test4() => A.new; // Ok.
+                                  ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A<core::int>;
+static method test5() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+A<dynamic> Function(String) test5() => A.foo; // Error.
+                                         ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::String) → self::A<dynamic>;
+static method test6() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+A<dynamic> Function(String) test6() => A.new; // Error.
+                                         ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::String) → self::A<dynamic>;
+static method test7() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+                                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<dynamic>;
+static method test8() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+A<dynamic> Function(num) test8() => A<num>.new; // Error.
+                                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::num) → self::A<dynamic>;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.outline.expect
index a528382..c33b72e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.outline.expect
@@ -5,12 +5,24 @@
 class A<X extends core::num> extends core::Object {
   constructor foo(self::A::X x) → self::A<self::A::X>
     ;
+  constructor •(self::A::X x) → self::A<self::A::X>
+    ;
 }
-static method bar1() → (core::num) → self::A<core::num>
+static method test1() → (core::num) → self::A<core::num>
   ;
-static method bar2() → (core::int) → self::A<core::int>
+static method test2() → (core::int) → self::A<core::int>
   ;
-static method bar3() → (core::String) → self::A<dynamic>
+static method test3() → (core::num) → self::A<core::num>
+  ;
+static method test4() → (core::int) → self::A<core::int>
+  ;
+static method test5() → (core::String) → self::A<dynamic>
+  ;
+static method test6() → (core::String) → self::A<dynamic>
+  ;
+static method test7() → (core::num) → self::A<dynamic>
+  ;
+static method test8() → (core::num) → self::A<dynamic>
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
index c3344f6..3a5a5ad 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
@@ -2,17 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-// A<num> Function(num) bar1() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+// A<num> Function(num) test1() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-// A<int> Function(int) bar2() => A.foo; // Ok.
-//                                  ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+// A<int> Function(int) test2() => A.foo; // Ok.
+//                                   ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-// A<dynamic> Function(String) bar3() => A.foo; // Error.
-//                                         ^^^
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+// A<num> Function(num) test3() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+// A<int> Function(int) test4() => A.new; // Ok.
+//                                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+// A<dynamic> Function(String) test5() => A.foo; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+// A<dynamic> Function(String) test6() => A.new; // Error.
+//                                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+//                                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+// A<dynamic> Function(num) test8() => A<num>.new; // Error.
+//                                            ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -20,17 +50,39 @@
 class A<X extends core::num> extends core::Object {
   constructor foo(self::A::X x) → self::A<self::A::X>
     : super core::Object::•() {}
+  constructor •(self::A::X x) → self::A<self::A::X>
+    : super core::Object::•() {}
 }
-static method bar1() → (core::num) → self::A<core::num>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:9:34: Error: Getter not found: 'foo'.
-A<num> Function(num) bar1() => A.foo; // Ok.
-                                 ^^^";
-static method bar2() → (core::int) → self::A<core::int>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:34: Error: Getter not found: 'foo'.
-A<int> Function(int) bar2() => A.foo; // Ok.
-                                 ^^^";
-static method bar3() → (core::String) → self::A<dynamic>
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:41: Error: Getter not found: 'foo'.
-A<dynamic> Function(String) bar3() => A.foo; // Error.
-                                        ^^^";
+static method test1() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:10:35: Error: Getter not found: 'foo'.
+A<num> Function(num) test1() => A.foo; // Ok.
+                                  ^^^";
+static method test2() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:11:35: Error: Getter not found: 'foo'.
+A<int> Function(int) test2() => A.foo; // Ok.
+                                  ^^^";
+static method test3() → (core::num) → self::A<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:12:35: Error: Getter not found: 'new'.
+A<num> Function(num) test3() => A.new; // Ok.
+                                  ^^^";
+static method test4() → (core::int) → self::A<core::int>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:13:35: Error: Getter not found: 'new'.
+A<int> Function(int) test4() => A.new; // Ok.
+                                  ^^^";
+static method test5() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:15:42: Error: Getter not found: 'foo'.
+A<dynamic> Function(String) test5() => A.foo; // Error.
+                                         ^^^";
+static method test6() → (core::String) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:42: Error: Getter not found: 'new'.
+A<dynamic> Function(String) test6() => A.new; // Error.
+                                         ^^^";
+static method test7() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
+A<dynamic> Function(num) test7() => A<num>.foo; // Error.
+                                           ^^^";
+static method test8() → (core::num) → self::A<dynamic>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
+A<dynamic> Function(num) test8() => A<num>.new; // Error.
+                                           ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart
index 1cfbb36..32eda21 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart
@@ -5,9 +5,12 @@
 class A {
   A.foo1() {}
   A.foo2(int x) {}
+  A() {}
 }
 
-A Function() bar1() => A.foo1; // Ok.
-A Function() bar2() => A.foo2; // Error.
+A Function() test1() => A.foo1; // Ok.
+A Function() test2() => A.foo2; // Error.
+A Function() test3() => A.new; // Ok.
+A Function(int) test4() => A.new; // Error.
 
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect
index 3b24555..905eda3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.expect
@@ -2,13 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-// A Function() bar1() => A.foo1; // Ok.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+// A Function() test1() => A.foo1; // Ok.
+//                           ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-// A Function() bar2() => A.foo2; // Error.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+// A Function() test2() => A.foo2; // Error.
+//                           ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+// A Function() test3() => A.new; // Ok.
+//                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+// A Function(int) test4() => A.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +26,23 @@
     : super core::Object::•() {}
   constructor foo2(core::int x) → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar1() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-A Function() bar1() => A.foo1; // Ok.
-                         ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
-static method bar2() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-A Function() bar2() => A.foo2; // Error.
-                         ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test1() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+A Function() test1() => A.foo1; // Ok.
+                          ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test2() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+A Function() test2() => A.foo2; // Error.
+                          ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test3() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+A Function() test3() => A.new; // Ok.
+                          ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test4() → (core::int) → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+A Function(int) test4() => A.new; // Error.
+                             ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect
index 9e2a295..26fd1c7 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.strong.transformed.expect
@@ -2,13 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-// A Function() bar1() => A.foo1; // Ok.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+// A Function() test1() => A.foo1; // Ok.
+//                           ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-// A Function() bar2() => A.foo2; // Error.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+// A Function() test2() => A.foo2; // Error.
+//                           ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+// A Function() test3() => A.new; // Ok.
+//                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+// A Function(int) test4() => A.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +26,23 @@
     : super core::Object::•() {}
   constructor foo2(core::int x) → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar1() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-A Function() bar1() => A.foo1; // Ok.
-                         ^^^^";
-static method bar2() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-A Function() bar2() => A.foo2; // Error.
-                         ^^^^";
+static method test1() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+A Function() test1() => A.foo1; // Ok.
+                          ^^^^";
+static method test2() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+A Function() test2() => A.foo2; // Error.
+                          ^^^^";
+static method test3() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+A Function() test3() => A.new; // Ok.
+                          ^^^";
+static method test4() → (core::int) → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+A Function(int) test4() => A.new; // Error.
+                             ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.textual_outline.expect
index f247550..9ff49d9 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.textual_outline.expect
@@ -1,8 +1,10 @@
 class A {
   A.foo1() {}
   A.foo2(int x) {}
+  A() {}
 }
-
-A Function() bar1() => A.foo1;
-A Function() bar2() => A.foo2;
+A Function() test1() => A.foo1;
+A Function() test2() => A.foo2;
+A Function() test3() => A.new;
+A Function(int) test4() => A.new;
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect
index 3b24555..905eda3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.expect
@@ -2,13 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-// A Function() bar1() => A.foo1; // Ok.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+// A Function() test1() => A.foo1; // Ok.
+//                           ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-// A Function() bar2() => A.foo2; // Error.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+// A Function() test2() => A.foo2; // Error.
+//                           ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+// A Function() test3() => A.new; // Ok.
+//                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+// A Function(int) test4() => A.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +26,23 @@
     : super core::Object::•() {}
   constructor foo2(core::int x) → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar1() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-A Function() bar1() => A.foo1; // Ok.
-                         ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
-static method bar2() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-A Function() bar2() => A.foo2; // Error.
-                         ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test1() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+A Function() test1() => A.foo1; // Ok.
+                          ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test2() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+A Function() test2() => A.foo2; // Error.
+                          ^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test3() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+A Function() test3() => A.new; // Ok.
+                          ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+static method test4() → (core::int) → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+A Function(int) test4() => A.new; // Error.
+                             ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::A;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.outline.expect
index f822cfc..72f6e7a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.outline.expect
@@ -7,10 +7,16 @@
     ;
   constructor foo2(core::int x) → self::A
     ;
+  constructor •() → self::A
+    ;
 }
-static method bar1() → () → self::A
+static method test1() → () → self::A
   ;
-static method bar2() → () → self::A
+static method test2() → () → self::A
+  ;
+static method test3() → () → self::A
+  ;
+static method test4() → (core::int) → self::A
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect
index 9e2a295..26fd1c7 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.transformed.expect
@@ -2,13 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-// A Function() bar1() => A.foo1; // Ok.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+// A Function() test1() => A.foo1; // Ok.
+//                           ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-// A Function() bar2() => A.foo2; // Error.
-//                          ^^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+// A Function() test2() => A.foo2; // Error.
+//                           ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+// A Function() test3() => A.new; // Ok.
+//                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+// A Function(int) test4() => A.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,13 +26,23 @@
     : super core::Object::•() {}
   constructor foo2(core::int x) → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar1() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:10:26: Error: Getter not found: 'foo1'.
-A Function() bar1() => A.foo1; // Ok.
-                         ^^^^";
-static method bar2() → () → self::A
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:26: Error: Getter not found: 'foo2'.
-A Function() bar2() => A.foo2; // Error.
-                         ^^^^";
+static method test1() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:11:27: Error: Getter not found: 'foo1'.
+A Function() test1() => A.foo1; // Ok.
+                          ^^^^";
+static method test2() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:12:27: Error: Getter not found: 'foo2'.
+A Function() test2() => A.foo2; // Error.
+                          ^^^^";
+static method test3() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:27: Error: Getter not found: 'new'.
+A Function() test3() => A.new; // Ok.
+                          ^^^";
+static method test4() → (core::int) → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:14:30: Error: Getter not found: 'new'.
+A Function(int) test4() => A.new; // Error.
+                             ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart
index b2f8b30..d132fae 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart
@@ -4,8 +4,13 @@
 
 class A {
   A.foo() {}
+  A() {}
 }
 
-bar() => A.foo;
+testFoo() => A.foo; // Ok.
+testNew() => A.new; // Ok.
+
+testFooExtraArgs() => A<int>.foo; // Error.
+testNewExtraArgs() => A<int>.new; // Error.
 
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
index 2cbc6e8..4374264 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
@@ -2,9 +2,31 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +34,23 @@
 class A extends core::Object {
   constructor foo() → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int>.foo; // Error.
+                             ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int>.new; // Error.
+                             ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
index 2cbc6e8..4374264 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
@@ -2,9 +2,31 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +34,23 @@
 class A extends core::Object {
   constructor foo() → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int>.foo; // Error.
+                             ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int>.new; // Error.
+                             ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.textual_outline.expect
index 1a79c8b..7f58e61 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.textual_outline.expect
@@ -1,6 +1,9 @@
 class A {
   A.foo() {}
+  A() {}
 }
-
-bar() => A.foo;
+testFoo() => A.foo;
+testNew() => A.new;
+testFooExtraArgs() => A<int>.foo;
+testNewExtraArgs() => A<int>.new;
 main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
index 2cbc6e8..4374264 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
@@ -2,9 +2,31 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +34,23 @@
 class A extends core::Object {
   constructor foo() → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int>.foo; // Error.
+                             ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int>.new; // Error.
+                             ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.outline.expect
index ef14ea5..f5e6c30 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.outline.expect
@@ -5,8 +5,16 @@
 class A extends core::Object {
   constructor foo() → self::A
     ;
+  constructor •() → self::A
+    ;
 }
-static method bar() → dynamic
+static method testFoo() → dynamic
+  ;
+static method testNew() → dynamic
+  ;
+static method testFooExtraArgs() → dynamic
+  ;
+static method testNewExtraArgs() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
index 2cbc6e8..4374264 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
@@ -2,9 +2,31 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-// bar() => A.foo;
-//            ^^^
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+// testFoo() => A.foo; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+// testNew() => A.new; // Ok.
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                              ^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -12,9 +34,23 @@
 class A extends core::Object {
   constructor foo() → self::A
     : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
 }
-static method bar() → dynamic
-  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:9:12: Error: Getter not found: 'foo'.
-bar() => A.foo;
-           ^^^";
+static method testFoo() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:10:16: Error: Getter not found: 'foo'.
+testFoo() => A.foo; // Ok.
+               ^^^";
+static method testNew() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:11:16: Error: Getter not found: 'new'.
+testNew() => A.new; // Ok.
+               ^^^";
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
+testFooExtraArgs() => A<int>.foo; // Error.
+                             ^^^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
+testNewExtraArgs() => A<int>.new; // Error.
+                             ^^^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index da0c0e1..2e24e68 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -23,6 +23,11 @@
 const_functions/const_functions_const_ctor: FormatterCrash
 const_functions/const_functions_const_ctor_error: FormatterCrash
 const_functions/const_functions_const_factory: FormatterCrash
+constructor_tearoffs/generic_tearoff_with_context: FormatterCrash
+constructor_tearoffs/generic_tearoff_without_context: FormatterCrash
+constructor_tearoffs/instantiation: FormatterCrash
+constructor_tearoffs/nongeneric_tearoff_with_context: FormatterCrash
+constructor_tearoffs/nongeneric_tearoff_without_context: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
 extensions/extension_constructor: FormatterCrash
diff --git a/pkg/frontend_server/lib/compute_kernel.dart b/pkg/frontend_server/lib/compute_kernel.dart
new file mode 100644
index 0000000..b6c5616
--- /dev/null
+++ b/pkg/frontend_server/lib/compute_kernel.dart
@@ -0,0 +1,426 @@
+// 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.
+
+// @dart = 2.8
+
+/// A library to invoke the CFE to compute kernel summary files.
+///
+/// Used by `utils/bazel/kernel_worker.dart`.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
+import 'package:compiler/src/kernel/dart2js_target.dart';
+import 'package:dev_compiler/src/kernel/target.dart';
+import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
+import 'package:kernel/ast.dart' show Component, Library, Reference;
+import 'package:kernel/target/targets.dart';
+import 'package:vm/target/flutter.dart';
+import 'package:vm/target/flutter_runner.dart';
+import 'package:vm/target/vm.dart';
+
+/// If the last arg starts with `@`, this reads the file it points to and treats
+/// each line as an additional arg.
+///
+/// This is how individual work request args are differentiated from startup
+/// args in bazel (individual work request args go in that file).
+List<String> preprocessArgs(List<String> args) {
+  args = new List.from(args);
+  if (args.isEmpty) {
+    return args;
+  }
+  String lastArg = args.last;
+  if (lastArg.startsWith('@')) {
+    File argsFile = new File(lastArg.substring(1));
+    try {
+      args.removeLast();
+      args.addAll(argsFile.readAsLinesSync());
+    } on FileSystemException catch (e) {
+      throw new Exception('Failed to read file specified by $lastArg : $e');
+    }
+  }
+  return args;
+}
+
+/// An [ArgParser] for generating kernel summaries.
+final summaryArgsParser = new ArgParser()
+  ..addFlag('help', negatable: false, abbr: 'h')
+  ..addFlag('exclude-non-sources',
+      negatable: false,
+      help: 'Whether source files loaded implicitly should be included as '
+          'part of the summary.')
+  ..addFlag('summary-only',
+      defaultsTo: true,
+      negatable: true,
+      help: 'Whether to only build summary files.')
+  ..addOption('target',
+      allowed: const [
+        'vm',
+        'flutter',
+        'flutter_runner',
+        'dart2js',
+        'ddc',
+      ],
+      help: 'Build kernel for the vm, flutter, flutter_runner, dart2js or ddc')
+  ..addOption('dart-sdk-summary')
+  ..addMultiOption('input-summary')
+  ..addMultiOption('input-linked')
+  ..addMultiOption('multi-root')
+  ..addOption('multi-root-scheme', defaultsTo: 'org-dartlang-multi-root')
+  ..addOption('libraries-file')
+  ..addOption('packages-file')
+  ..addMultiOption('source')
+  ..addOption('output')
+  ..addFlag('reuse-compiler-result', defaultsTo: false)
+  ..addFlag('use-incremental-compiler', defaultsTo: false)
+  ..addOption('used-inputs')
+  ..addFlag('track-widget-creation', defaultsTo: false)
+  ..addMultiOption('enable-experiment',
+      help: 'Enable a language experiment when invoking the CFE.')
+  ..addMultiOption('define', abbr: 'D')
+  ..addFlag('verbose', defaultsTo: false)
+  ..addFlag('sound-null-safety', defaultsTo: false)
+  ..addOption('verbosity',
+      defaultsTo: fe.Verbosity.defaultValue,
+      help: 'Sets the verbosity level used for filtering messages during '
+          'compilation.',
+      allowed: fe.Verbosity.allowedValues,
+      allowedHelp: fe.Verbosity.allowedValuesHelp);
+
+class ComputeKernelResult {
+  final bool succeeded;
+  final fe.InitializedCompilerState previousState;
+
+  ComputeKernelResult(this.succeeded, this.previousState);
+}
+
+/// Computes a kernel file based on [args].
+///
+/// If [isWorker] is true then exit codes will not be set on failure.
+///
+/// If [outputBuffer] is provided then messages will be written to that buffer
+/// instead of printed to the console.
+///
+/// Returns whether or not the summary was successfully output.
+Future<ComputeKernelResult> computeKernel(List<String> args,
+    {bool isWorker: false,
+    StringBuffer outputBuffer,
+    Map<Uri, List<int>> inputDigests,
+    fe.InitializedCompilerState previousState}) async {
+  inputDigests ??= <Uri, List<int>>{};
+  dynamic out = outputBuffer ?? stderr;
+  bool succeeded = true;
+
+  var parsedArgs = summaryArgsParser.parse(args);
+
+  if (parsedArgs['help']) {
+    out.writeln(summaryArgsParser.usage);
+    if (!isWorker) exit(0);
+    return new ComputeKernelResult(false, previousState);
+  }
+
+  // Bazel creates an overlay file system where some files may be located in the
+  // source tree, some in a gendir, and some in a bindir. The multi-root file
+  // system hides this from the front end.
+  var multiRoots = parsedArgs['multi-root'].map(Uri.base.resolve).toList();
+  if (multiRoots.isEmpty) multiRoots.add(Uri.base);
+  var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
+      multiRoots, fe.StandardFileSystem.instance);
+  var sources = (parsedArgs['source'] as List<String>).map(toUri).toList();
+  var excludeNonSources = parsedArgs['exclude-non-sources'] as bool;
+
+  var nnbdMode = parsedArgs['sound-null-safety'] as bool
+      ? fe.NnbdMode.Strong
+      : fe.NnbdMode.Weak;
+  var summaryOnly = parsedArgs['summary-only'] as bool;
+  var trackWidgetCreation = parsedArgs['track-widget-creation'] as bool;
+
+  // TODO(sigmund,jakemac): make target mandatory. We allow null to be backwards
+  // compatible while we migrate existing clients of this tool.
+  var targetName =
+      (parsedArgs['target'] as String) ?? (summaryOnly ? 'ddc' : 'vm');
+  var targetFlags = new TargetFlags(
+      trackWidgetCreation: trackWidgetCreation,
+      enableNullSafety: nnbdMode == fe.NnbdMode.Strong);
+  Target target;
+  switch (targetName) {
+    case 'vm':
+      target = new VmTarget(targetFlags);
+      if (summaryOnly) {
+        out.writeln('error: --summary-only not supported for the vm target');
+      }
+      break;
+    case 'flutter':
+      target = new FlutterTarget(targetFlags);
+      if (summaryOnly) {
+        throw new ArgumentError(
+            'error: --summary-only not supported for the flutter target');
+      }
+      break;
+    case 'flutter_runner':
+      target = new FlutterRunnerTarget(targetFlags);
+      if (summaryOnly) {
+        throw new ArgumentError('error: --summary-only not supported for the '
+            'flutter_runner target');
+      }
+      break;
+    case 'dart2js':
+      target = new Dart2jsTarget('dart2js', targetFlags);
+      if (summaryOnly) {
+        out.writeln(
+            'error: --summary-only not supported for the dart2js target');
+      }
+      break;
+    case 'ddc':
+      // TODO(jakemac):If `generateKernel` changes to return a summary
+      // component, process the component instead.
+      target =
+          new DevCompilerSummaryTarget(sources, excludeNonSources, targetFlags);
+      if (!summaryOnly) {
+        out.writeln('error: --no-summary-only not supported for the '
+            'ddc target');
+      }
+      break;
+    default:
+      out.writeln('error: unsupported target: $targetName');
+  }
+
+  List<Uri> linkedInputs =
+      (parsedArgs['input-linked'] as List<String>).map(toUri).toList();
+
+  List<Uri> summaryInputs =
+      (parsedArgs['input-summary'] as List<String>).map(toUri).toList();
+
+  fe.InitializedCompilerState state;
+  bool usingIncrementalCompiler = false;
+  bool recordUsedInputs = parsedArgs["used-inputs"] != null;
+  var environmentDefines = _parseEnvironmentDefines(parsedArgs['define']);
+  var verbose = parsedArgs['verbose'] as bool;
+  var verbosity = fe.Verbosity.parseArgument(parsedArgs['verbosity']);
+
+  if (parsedArgs['use-incremental-compiler']) {
+    usingIncrementalCompiler = true;
+
+    // If digests weren't given and if not in worker mode, create fake data and
+    // ensure we don't have a previous state (as that wouldn't be safe with
+    // fake input digests).
+    if (!isWorker && inputDigests.isEmpty) {
+      previousState = null;
+      inputDigests[toUri(parsedArgs['dart-sdk-summary'])] = const [0];
+      for (Uri uri in summaryInputs) {
+        inputDigests[uri] = const [0];
+      }
+      for (Uri uri in linkedInputs) {
+        inputDigests[uri] = const [0];
+      }
+    }
+
+    state = await fe.initializeIncrementalCompiler(
+        previousState,
+        {
+          "target=$targetName",
+          "trackWidgetCreation=$trackWidgetCreation",
+          "multiRootScheme=${fileSystem.markerScheme}",
+          "multiRootRoots=${fileSystem.roots}",
+        },
+        toUri(parsedArgs['dart-sdk-summary']),
+        toUri(parsedArgs['packages-file']),
+        toUri(parsedArgs['libraries-file']),
+        [...summaryInputs, ...linkedInputs],
+        inputDigests,
+        target,
+        fileSystem,
+        (parsedArgs['enable-experiment'] as List<String>),
+        summaryOnly,
+        environmentDefines,
+        trackNeededDillLibraries: recordUsedInputs,
+        verbose: verbose,
+        nnbdMode: nnbdMode);
+  } else {
+    state = await fe.initializeCompiler(
+        // TODO(sigmund): pass an old state once we can make use of it.
+        null,
+        toUri(parsedArgs['dart-sdk-summary']),
+        toUri(parsedArgs['libraries-file']),
+        toUri(parsedArgs['packages-file']),
+        [...summaryInputs, ...linkedInputs],
+        target,
+        fileSystem,
+        parsedArgs['enable-experiment'] as List<String>,
+        environmentDefines,
+        verbose: verbose,
+        nnbdMode: nnbdMode);
+  }
+
+  void onDiagnostic(fe.DiagnosticMessage message) {
+    if (fe.Verbosity.shouldPrint(verbosity, message)) {
+      fe.printDiagnosticMessage(message, out.writeln);
+    }
+    if (message.severity == fe.Severity.error) {
+      succeeded = false;
+    }
+  }
+
+  List<int> kernel;
+  bool wroteUsedDills = false;
+  if (usingIncrementalCompiler) {
+    state.options.onDiagnostic = onDiagnostic;
+    Component incrementalComponent = await state.incrementalCompiler
+        .computeDelta(entryPoints: sources, fullComponent: true);
+
+    if (recordUsedInputs) {
+      Set<Uri> usedOutlines = {};
+      for (Library lib in state.incrementalCompiler.neededDillLibraries) {
+        if (lib.importUri.scheme == "dart") continue;
+        Uri uri = state.libraryToInputDill[lib.importUri];
+        if (uri == null) {
+          throw new StateError("Library ${lib.importUri} was recorded as used, "
+              "but was not in the list of known libraries.");
+        }
+        usedOutlines.add(uri);
+      }
+      var outputUsedFile = new File(parsedArgs["used-inputs"]);
+      outputUsedFile.createSync(recursive: true);
+      outputUsedFile.writeAsStringSync(usedOutlines.join("\n"));
+      wroteUsedDills = true;
+    }
+
+    kernel = await state.incrementalCompiler.context.runInContext((_) {
+      if (summaryOnly) {
+        incrementalComponent.uriToSource.clear();
+        incrementalComponent.problemsAsJson = null;
+        incrementalComponent.setMainMethodAndMode(
+            null, true, incrementalComponent.mode);
+        target.performOutlineTransformations(incrementalComponent);
+        makeStable(incrementalComponent);
+        return Future.value(fe.serializeComponent(incrementalComponent,
+            includeSources: false, includeOffsets: false));
+      }
+
+      makeStable(incrementalComponent);
+
+      return Future.value(fe.serializeComponent(incrementalComponent,
+          filter: excludeNonSources
+              ? (library) => sources.contains(library.importUri)
+              : null,
+          includeOffsets: true));
+    });
+  } else if (summaryOnly) {
+    kernel = await fe.compileSummary(state, sources, onDiagnostic,
+        includeOffsets: false);
+  } else {
+    Component component =
+        await fe.compileComponent(state, sources, onDiagnostic);
+    kernel = fe.serializeComponent(component,
+        filter: excludeNonSources
+            ? (library) => sources.contains(library.importUri)
+            : null,
+        includeOffsets: true);
+  }
+  state.options.onDiagnostic = null; // See http://dartbug.com/36983.
+
+  if (!wroteUsedDills && recordUsedInputs) {
+    // The path taken didn't record inputs used: Say we used everything.
+    var outputUsedFile = new File(parsedArgs["used-inputs"]);
+    outputUsedFile.createSync(recursive: true);
+    Set<Uri> allFiles = {...summaryInputs, ...linkedInputs};
+    outputUsedFile.writeAsStringSync(allFiles.join("\n"));
+    wroteUsedDills = true;
+  }
+
+  if (kernel != null) {
+    var outputFile = new File(parsedArgs['output']);
+    outputFile.createSync(recursive: true);
+    outputFile.writeAsBytesSync(kernel);
+  } else {
+    assert(!succeeded);
+  }
+
+  return new ComputeKernelResult(succeeded, state);
+}
+
+/// Make sure the output is stable by sorting libraries and additional exports.
+void makeStable(Component c) {
+  // Make sure the output is stable.
+  c.libraries.sort((l1, l2) {
+    return "${l1.fileUri}".compareTo("${l2.fileUri}");
+  });
+  c.problemsAsJson?.sort();
+  c.computeCanonicalNames();
+  for (Library library in c.libraries) {
+    library.additionalExports.sort((Reference r1, Reference r2) {
+      return "${r1.canonicalName}".compareTo("${r2.canonicalName}");
+    });
+    library.problemsAsJson?.sort();
+  }
+}
+
+/// Extends the DevCompilerTarget to transform outlines to meet the requirements
+/// of summaries in bazel and package-build.
+///
+/// Build systems like package-build may provide the same input file twice to
+/// the summary worker, but only intends to have it in one output summary.  The
+/// convention is that if it is listed as a source, it is intended to be part of
+/// the output, if the source file was loaded as a dependency, then it was
+/// already included in a different summary.  The transformation below ensures
+/// that the output summary doesn't include those implicit inputs.
+///
+/// Note: this transformation is destructive and is only intended to be used
+/// when generating summaries.
+class DevCompilerSummaryTarget extends DevCompilerTarget {
+  final List<Uri> sources;
+  final bool excludeNonSources;
+
+  DevCompilerSummaryTarget(
+      this.sources, this.excludeNonSources, TargetFlags targetFlags)
+      : super(targetFlags);
+
+  @override
+  void performOutlineTransformations(Component component) {
+    super.performOutlineTransformations(component);
+    if (!excludeNonSources) return;
+
+    List<Library> libraries = new List.from(component.libraries);
+    component.libraries.clear();
+    Set<Uri> include = sources.toSet();
+    for (var lib in libraries) {
+      if (include.contains(lib.importUri)) {
+        component.libraries.add(lib);
+      } else {
+        // Excluding the library also means that their canonical names will not
+        // be computed as part of serialization, so we need to do that
+        // preemtively here to avoid errors when serializing references to
+        // elements of these libraries.
+        component.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
+        lib.computeCanonicalNames();
+      }
+    }
+  }
+}
+
+Uri toUri(String uriString) {
+  if (uriString == null) return null;
+  // Windows-style paths use '\', so convert them to '/' in case they've been
+  // concatenated with Unix-style paths.
+  return Uri.base.resolve(uriString.replaceAll("\\", "/"));
+}
+
+Map<String, String> _parseEnvironmentDefines(List<String> args) {
+  var environment = <String, String>{};
+
+  for (var arg in args) {
+    var eq = arg.indexOf('=');
+    if (eq <= 0) {
+      var kind = eq == 0 ? 'name' : 'value';
+      throw FormatException('no $kind given to -D option `$arg`');
+    }
+    var name = arg.substring(0, eq);
+    var value = arg.substring(eq + 1);
+    environment[name] = value;
+  }
+
+  return environment;
+}
diff --git a/pkg/frontend_server/pubspec.yaml b/pkg/frontend_server/pubspec.yaml
index 7932dab..504c493 100644
--- a/pkg/frontend_server/pubspec.yaml
+++ b/pkg/frontend_server/pubspec.yaml
@@ -8,6 +8,10 @@
 
 dependencies:
   args: ^1.4.4
+  build_integration:
+    path: ../build_integration
+  compiler:
+    path: ../compiler
   dev_compiler:
     path: ../dev_compiler
   front_end:
diff --git a/pkg/test_runner/lib/src/static_error.dart b/pkg/test_runner/lib/src/static_error.dart
index bf3571a..397ebad 100644
--- a/pkg/test_runner/lib/src/static_error.dart
+++ b/pkg/test_runner/lib/src/static_error.dart
@@ -455,15 +455,23 @@
   /// Matches an explicit error location with a length, like:
   ///
   ///     // [error line 1, column 17, length 3]
-  static final _explicitLocationAndLengthRegExp =
-      RegExp(r"^\s*//\s*\[\s*error line\s+(\d+)\s*,\s*column\s+(\d+)\s*,\s*"
-          r"length\s+(\d+)\s*\]\s*$");
+  ///
+  /// or implicitly on the previous line
+  ///
+  ///     // [error column 17, length 3]
+  static final _explicitLocationAndLengthRegExp = RegExp(
+      r"^\s*//\s*\[\s*error (?:line\s+(\d+)\s*,)?\s*column\s+(\d+)\s*,\s*"
+      r"length\s+(\d+)\s*\]\s*$");
 
   /// Matches an explicit error location without a length, like:
   ///
   ///     // [error line 1, column 17]
-  static final _explicitLocationRegExp =
-      RegExp(r"^\s*//\s*\[\s*error line\s+(\d+)\s*,\s*column\s+(\d+)\s*\]\s*$");
+  ///
+  /// or implicitly on the previous line.
+  ///
+  ///     // [error column 17]
+  static final _explicitLocationRegExp = RegExp(
+      r"^\s*//\s*\[\s*error (?:line\s+(\d+)\s*,)?\s*column\s+(\d+)\s*\]\s*$");
 
   /// Matches the beginning of an error message, like `// [analyzer]`.
   ///
@@ -518,25 +526,28 @@
         _parseErrors(
             line: _lastRealLine,
             column: sourceLine.indexOf("^") + 1,
-            length: match.group(1).length);
+            length: match[1].length);
         _advance();
         continue;
       }
 
       match = _explicitLocationAndLengthRegExp.firstMatch(sourceLine);
       if (match != null) {
+        var lineCapture = match[1];
         _parseErrors(
-            line: int.parse(match.group(1)),
-            column: int.parse(match.group(2)),
-            length: int.parse(match.group(3)));
+            line: lineCapture == null ? _lastRealLine : int.parse(lineCapture),
+            column: int.parse(match[2]),
+            length: int.parse(match[3]));
         _advance();
         continue;
       }
 
       match = _explicitLocationRegExp.firstMatch(sourceLine);
       if (match != null) {
+        var lineCapture = match[1];
         _parseErrors(
-            line: int.parse(match.group(1)), column: int.parse(match.group(2)));
+            line: lineCapture == null ? _lastRealLine : int.parse(lineCapture),
+            column: int.parse(match[2]));
         _advance();
         continue;
       }
@@ -559,16 +570,16 @@
       var match = _errorMessageRegExp.firstMatch(_peek(1));
       if (match == null) break;
 
-      var number = match.group(2) != null ? int.parse(match.group(2)) : null;
+      var number = match[2] != null ? int.parse(match[2]) : null;
 
-      var sourceName = match.group(1);
+      var sourceName = match[1];
       var source = ErrorSource.find(sourceName);
       if (source == null) _fail("Unknown front end '[$sourceName]'.");
       if (source == ErrorSource.context && number == null) {
         _fail("Context messages must have an error number.");
       }
 
-      var message = match.group(3);
+      var message = match[3];
       _advance();
       var sourceLines = {locationLine, _currentLine};
 
@@ -587,7 +598,7 @@
         var messageMatch = _errorMessageRestRegExp.firstMatch(nextLine);
         if (messageMatch == null) break;
 
-        message += "\n" + messageMatch.group(1);
+        message += "\n" + messageMatch[1];
         _advance();
         sourceLines.add(_currentLine);
       }
diff --git a/pkg/test_runner/lib/src/update_errors.dart b/pkg/test_runner/lib/src/update_errors.dart
index 7ef97fe..b4b53ef 100644
--- a/pkg/test_runner/lib/src/update_errors.dart
+++ b/pkg/test_runner/lib/src/update_errors.dart
@@ -85,19 +85,12 @@
 
   // Rebuild the source file a line at a time.
   var previousIndent = 0;
-  var codeLine = 1;
   var result = <String>[];
   for (var i = 0; i < lines.length; i++) {
     // Keep the code.
     if (lines[i] != null) {
       result.add(lines[i]);
       previousIndent = _countIndentation(lines[i]);
-
-      // Keep track of the resulting line number of the last line containing
-      // real code. We use this when outputting explicit line numbers instead
-      // the error's reported line to compensate for added or removed lines
-      // above the error.
-      codeLine = result.length;
     }
 
     // Add expectations for any errors reported on this line.
@@ -124,13 +117,13 @@
               error.length != null &&
               error.length != previousLength)) {
         // If the error can't fit in a line comment, or no source location is
-        // sepcified, use an explicit location.
+        // specified, use an explicit location.
         if (error.column <= 2 || error.length == 0) {
           if (error.length == null) {
-            result.add("$comment [error line $codeLine, column "
+            result.add("$comment [error column "
                 "${error.column}]");
           } else {
-            result.add("$comment [error line $codeLine, column "
+            result.add("$comment [error column "
                 "${error.column}, length ${error.length}]");
           }
         } else {
diff --git a/pkg/test_runner/test/update_errors_test.dart b/pkg/test_runner/test/update_errors_test.dart
index afe5db9..365ed14 100644
--- a/pkg/test_runner/test/update_errors_test.dart
+++ b/pkg/test_runner/test/update_errors_test.dart
@@ -268,12 +268,12 @@
   ], expected: """
 int i =
 "bad";
-/\/ [error line 2, column 1, length 5]
+/\/ [error column 1, length 5]
 /\/ [analyzer] updated.error
 
 int j =
 "bad";
-/\/ [error line 7, column 1, length 5]
+/\/ [error column 1, length 5]
 /\/ [cfe] Error.
 """);
 
@@ -293,7 +293,7 @@
 """, errors: [makeError(line: 2, column: 1, cfeError: "Error.")], expected: """
 int i =
 "bad";
-/\/ [error line 2, column 1]
+/\/ [error column 1]
 /\/ [cfe] Error.
 """);
 
@@ -314,9 +314,9 @@
 main() {
 }
 Error here;
-/\/ [error line 3, column 1, length 5]
+/\/ [error column 1, length 5]
 /\/ [analyzer] NEW.ERROR
-/\/ [error line 3, column 2, length 3]
+/\/ [error column 2, length 3]
 /\/ [cfe] Error.
 """);
 
@@ -400,7 +400,7 @@
     makeError(line: 1, column: 1, length: 0, cfeError: "Foo"),
   ], expected: """
 x
-// [error line 1, column 1, length 0]
+// [error column 1, length 0]
 // [cfe] Foo""");
 
   contextMessages();
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 996d92d..9fb91ee 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -257,35 +257,6 @@
   return OneByteString::New(receiver, start, end - start, Heap::kNew);
 }
 
-// This is high-performance code.
-DEFINE_NATIVE_ENTRY(OneByteString_splitWithCharCode, 0, 2) {
-  const String& receiver =
-      String::CheckedHandle(zone, arguments->NativeArgAt(0));
-  ASSERT(receiver.IsOneByteString());
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_split_code, arguments->NativeArgAt(1));
-  const intptr_t len = receiver.Length();
-  const intptr_t split_code = smi_split_code.Value();
-  const GrowableObjectArray& result = GrowableObjectArray::Handle(
-      zone, GrowableObjectArray::New(16, Heap::kNew));
-  String& str = String::Handle(zone);
-  intptr_t start = 0;
-  intptr_t i = 0;
-  for (; i < len; i++) {
-    if (split_code == OneByteString::CharAt(receiver, i)) {
-      str = OneByteString::SubStringUnchecked(receiver, start, (i - start),
-                                              Heap::kNew);
-      result.Add(str);
-      start = i + 1;
-    }
-  }
-  str = OneByteString::SubStringUnchecked(receiver, start, (i - start),
-                                          Heap::kNew);
-  result.Add(str);
-  result.SetTypeArguments(TypeArguments::Handle(
-      zone, isolate->group()->object_store()->type_argument_string()));
-  return result.ptr();
-}
-
 DEFINE_NATIVE_ENTRY(Internal_allocateOneByteString, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, length_obj, arguments->NativeArgAt(0));
   const int64_t length = length_obj.AsInt64Value();
diff --git a/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart b/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart
index 0b0e237..dac054c6 100644
--- a/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart
@@ -70,7 +70,6 @@
       'Root',
       '[Unoptimized] test',
       '[Unoptimized] test',
-      '[Unoptimized] _Closure.call',
       '[Unoptimized] _ServiceTesteeRunner.run',
     ];
     for (var i = 0; i < expected.length; i++) {
diff --git a/runtime/observatory_2/tests/service_2/get_allocation_traces_test.dart b/runtime/observatory_2/tests/service_2/get_allocation_traces_test.dart
index dadf082..2334658 100644
--- a/runtime/observatory_2/tests/service_2/get_allocation_traces_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_allocation_traces_test.dart
@@ -89,7 +89,6 @@
       'Root',
       '[Unoptimized] test',
       '[Unoptimized] test',
-      '[Unoptimized] _Closure.call',
       '[Unoptimized] _ServiceTesteeRunner.run',
     ];
     for (var i = 0; i < expected.length; i++) {
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 359d482..373dffb 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -130,7 +130,6 @@
   V(StringBase_joinReplaceAllResult, 4)                                        \
   V(StringBuffer_createStringFromUint16Array, 3)                               \
   V(OneByteString_substringUnchecked, 3)                                       \
-  V(OneByteString_splitWithCharCode, 2)                                        \
   V(OneByteString_allocateFromOneByteList, 3)                                  \
   V(TwoByteString_allocateFromTwoByteList, 3)                                  \
   V(String_getHashCode, 1)                                                     \
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index d748f67..869d90c 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -3318,7 +3318,8 @@
 
 Fragment StreamingFlowGraphBuilder::BuildFunctionInvocation(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;  // Include the tag.
-  ReadByte();                                  // read kind.
+  const FunctionAccessKind function_access_kind =
+      static_cast<FunctionAccessKind>(ReadByte());  // read kind.
   const TokenPosition position = ReadPosition();    // read position.
   if (p != nullptr) *p = position;
 
@@ -3328,8 +3329,9 @@
       call_site_attributes_metadata_helper_.GetCallSiteAttributes(offset);
 
   const bool is_unchecked_closure_call =
-      (call_site_attributes.receiver_type != nullptr) &&
-      call_site_attributes.receiver_type->IsFunctionType();
+      ((call_site_attributes.receiver_type != nullptr) &&
+       call_site_attributes.receiver_type->IsFunctionType()) ||
+      (function_access_kind == FunctionAccessKind::kFunctionType);
   Fragment instructions;
 
   instructions += BuildExpression();  // read receiver.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
index a688d7c..1bd0f27 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
@@ -288,4 +288,56 @@
   EXPECT(call_add->entry_kind() == Code::EntryKind::kUnchecked);
 }
 
+ISOLATE_UNIT_TEST_CASE(StreamingFlowGraphBuilder_TypedClosureCall) {
+  // This test ensures that a typed closure call (i.e. the closure being called
+  // has a real function type as static type) ends up compiling to
+  //
+  //   CheckNull()+ClosureCall()
+  //
+  // instead of
+  //
+  //   InstanceCall(dyn:call)
+  //
+  // This is a regression test for a case where JIT support uses dynamic calls
+  // instead of typed closure calls if call-site attribute metadata is missing
+  // which is the case if an incremental kernel compiler is used. The
+  // [LoadTestScript] below uses IKG compiler, so this is a regression test for:
+  //
+  //   - https://github.com/dart-lang/sdk/issues/46320
+  //   - https://github.com/dart-lang/sdk/issues/45421
+  //
+  const char* kScript = R"(
+    int callClosure(int Function(int) fun, int value) => fun(value);
+    test() => callClosure((int a) => a + 1, 10);
+  )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  Invoke(root_library, "test");
+
+  const auto& callClosureFunction =
+      Function::Handle(GetFunction(root_library, "callClosure"));
+  TestPipeline pipeline(callClosureFunction, CompilerPass::kJIT);
+  FlowGraph* flow_graph = pipeline.RunPasses({
+      CompilerPass::kComputeSSA,
+  });
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+  EXPECT(entry != nullptr);
+
+  ILMatcher cursor(flow_graph, entry, true);
+  // clang-format off
+  RELEASE_ASSERT(cursor.TryMatch({
+    kMatchAndMoveFunctionEntry,
+    kMatchAndMoveCheckStackOverflow,
+    kMoveDebugStepChecks,
+    kMatchAndMoveCheckNull,
+    kMatchAndMoveLoadField,
+    kMoveDebugStepChecks,
+    kMatchAndMoveClosureCall,
+    kMoveDebugStepChecks,
+    kMatchReturn,
+  }));
+  // clang-format on
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 33b39af..4b0426c 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -480,7 +480,7 @@
       SkipDartType();                   // read function_type.
       return;
     case kFunctionInvocation:
-      ReadByte();                        // read kind.
+      BuildHash(ReadByte());             // read kind.
       ReadPosition();                    // read position.
       CalculateExpressionFingerprint();  // read receiver.
       CalculateArgumentsFingerprint();   // read arguments.
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 28eecaf..4c4af85 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -200,8 +200,8 @@
   V(::, reachabilityFence, ReachabilityFence, 0x619235c1)                      \
   V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x1dcaf73d)                          \
   V(_Future, timeout, FutureTimeout, 0x73041520)                               \
-  V(Future, wait, FutureWait, 0xa05d5e7b)                                      \
-  V(_RootZone, runUnary, RootZoneRunUnary, 0xa22248b6)                         \
+  V(Future, wait, FutureWait, 0x495c83cd)                                      \
+  V(_RootZone, runUnary, RootZoneRunUnary, 0xb607f8bf)                         \
   V(_FutureListener, handleValue, FutureListenerHandleValue, 0x438115a8)       \
   V(::, has63BitSmis, Has63BitSmis, 0xf61b5ab2)                                \
 
@@ -438,13 +438,13 @@
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
   V(_ListFactory, _List, ., kArrayCid, 0xd693eee6)                             \
   V(_ListFilledFactory, _List, .filled, kArrayCid, 0x7f29060d)                 \
-  V(_ListGenerateFactory, _List, .generate, kArrayCid, 0xa1e6b785)             \
+  V(_ListGenerateFactory, _List, .generate, kArrayCid, 0x95feb438)             \
   V(_GrowableListFactory, _GrowableList, ., kGrowableObjectArrayCid,           \
     0xc1b55e71)                                                                \
   V(_GrowableListFilledFactory, _GrowableList, .filled,                        \
     kGrowableObjectArrayCid, 0x37d0dc65)                                       \
   V(_GrowableListGenerateFactory, _GrowableList, .generate,                    \
-    kGrowableObjectArrayCid, 0xc0c5682d)                                       \
+    kGrowableObjectArrayCid, 0x52f61890)                                       \
   V(_GrowableListWithData, _GrowableList, ._withData, kGrowableObjectArrayCid, \
     0xa32d060b)                                                                \
   V(_Int8ArrayFactory, Int8List, ., kTypedDataInt8ArrayCid, 0x660dd888)        \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index de6a837..70256cf 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -4511,7 +4511,7 @@
         "vmName\":\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{"
         "\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
         "patch\\/string_patch.dart\",\"_kind\":\"kernel\"},\"tokenPos\":32310,"
-        "\"endTokenPos\":44332},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "\"endTokenPos\":44599},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":0,\"kind\":\"String\",\"id\":\"\",\"length\":2,"
         "\"valueAsString\":\"dw\"}",
diff --git a/sdk/lib/_internal/vm/lib/string_patch.dart b/sdk/lib/_internal/vm/lib/string_patch.dart
index a8b949a..be6b858 100644
--- a/sdk/lib/_internal/vm/lib/string_patch.dart
+++ b/sdk/lib/_internal/vm/lib/string_patch.dart
@@ -985,8 +985,19 @@
   String _substringUncheckedNative(int startIndex, int endIndex)
       native "OneByteString_substringUnchecked";
 
-  List<String> _splitWithCharCode(int charCode)
-      native "OneByteString_splitWithCharCode";
+  List<String> _splitWithCharCode(int charCode) {
+    final parts = <String>[];
+    int i = 0;
+    int start = 0;
+    for (i = 0; i < this.length; ++i) {
+      if (this.codeUnitAt(i) == charCode) {
+        parts.add(this._substringUnchecked(start, i));
+        start = i + 1;
+      }
+    }
+    parts.add(this._substringUnchecked(start, i));
+    return parts;
+  }
 
   List<String> split(Pattern pattern) {
     // TODO(vegorov) investigate if this can be rewritten as `is _OneByteString`
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 131b66a..4851883 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -435,6 +435,11 @@
   /// Use the callbacks, for example, for pausing the underlying subscription
   /// while having no subscribers to prevent losing events, or canceling the
   /// subscription when there are no listeners.
+  ///
+  /// Cancelling is intended to be used when there are no current subscribers.
+  /// If the subscription passed to `onListen` or `onCancel` is cancelled,
+  /// then no further events are ever emitted by current subscriptions on
+  /// the returned broadcast stream, not even a done event.
   Stream<T> asBroadcastStream(
       {void onListen(StreamSubscription<T> subscription)?,
       void onCancel(StreamSubscription<T> subscription)?}) {
diff --git a/tools/VERSION b/tools/VERSION
index 665452b..21694021 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 210
+PRERELEASE 211
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index 96f1e9a..3e68ac6 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -15,17 +15,9 @@
 import 'dart:io';
 import 'dart:isolate';
 
-import 'package:args/args.dart';
 import 'package:bazel_worker/bazel_worker.dart';
-import 'package:build_integration/file_system/multi_root.dart';
-import 'package:dev_compiler/src/kernel/target.dart';
 import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
-import 'package:kernel/ast.dart' show Component, Library, Reference;
-import 'package:kernel/target/targets.dart';
-import 'package:vm/target/vm.dart';
-import 'package:vm/target/flutter.dart';
-import 'package:vm/target/flutter_runner.dart';
-import 'package:compiler/src/kernel/dart2js_target.dart';
+import 'package:frontend_server/compute_kernel.dart';
 
 /// [sendPort] may be passed in when started in an isolate. If provided, it is
 /// used for bazel worker communication instead of stdin/stdout.
@@ -68,10 +60,17 @@
       } else {
         previousState = null;
       }
+
+      /// Build a map of uris to digests.
+      final inputDigests = <Uri, List<int>>{};
+      for (var input in request.inputs) {
+        inputDigests[toUri(input.path)] = input.digest;
+      }
+
       var result = await computeKernel(request.arguments,
           isWorker: true,
           outputBuffer: outputBuffer,
-          inputs: request.inputs,
+          inputDigests: inputDigests,
           previousState: previousStateToPass);
       previousState = result.previousState;
       if (!result.succeeded) {
@@ -86,413 +85,3 @@
     return response;
   }
 }
-
-/// If the last arg starts with `@`, this reads the file it points to and treats
-/// each line as an additional arg.
-///
-/// This is how individual work request args are differentiated from startup
-/// args in bazel (inidividual work request args go in that file).
-List<String> preprocessArgs(List<String> args) {
-  args = new List.from(args);
-  if (args.isEmpty) {
-    return args;
-  }
-  String lastArg = args.last;
-  if (lastArg.startsWith('@')) {
-    File argsFile = new File(lastArg.substring(1));
-    try {
-      args.removeLast();
-      args.addAll(argsFile.readAsLinesSync());
-    } on FileSystemException catch (e) {
-      throw new Exception('Failed to read file specified by $lastArg : $e');
-    }
-  }
-  return args;
-}
-
-/// An [ArgParser] for generating kernel summaries.
-final summaryArgsParser = new ArgParser()
-  ..addFlag('help', negatable: false, abbr: 'h')
-  ..addFlag('exclude-non-sources',
-      negatable: false,
-      help: 'Whether source files loaded implicitly should be included as '
-          'part of the summary.')
-  ..addFlag('summary-only',
-      defaultsTo: true,
-      negatable: true,
-      help: 'Whether to only build summary files.')
-  ..addOption('target',
-      allowed: const [
-        'vm',
-        'flutter',
-        'flutter_runner',
-        'dart2js',
-        'ddc',
-      ],
-      help: 'Build kernel for the vm, flutter, flutter_runner, dart2js or ddc')
-  ..addOption('dart-sdk-summary')
-  ..addMultiOption('input-summary')
-  ..addMultiOption('input-linked')
-  ..addMultiOption('multi-root')
-  ..addOption('multi-root-scheme', defaultsTo: 'org-dartlang-multi-root')
-  ..addOption('libraries-file')
-  ..addOption('packages-file')
-  ..addMultiOption('source')
-  ..addOption('output')
-  ..addFlag('reuse-compiler-result', defaultsTo: false)
-  ..addFlag('use-incremental-compiler', defaultsTo: false)
-  ..addOption('used-inputs')
-  ..addFlag('track-widget-creation', defaultsTo: false)
-  ..addMultiOption('enable-experiment',
-      help: 'Enable a language experiment when invoking the CFE.')
-  ..addMultiOption('define', abbr: 'D')
-  ..addFlag('verbose', defaultsTo: false)
-  ..addFlag('sound-null-safety', defaultsTo: false)
-  ..addOption('verbosity',
-      defaultsTo: fe.Verbosity.defaultValue,
-      help: 'Sets the verbosity level used for filtering messages during '
-          'compilation.',
-      allowed: fe.Verbosity.allowedValues,
-      allowedHelp: fe.Verbosity.allowedValuesHelp);
-
-class ComputeKernelResult {
-  final bool succeeded;
-  final fe.InitializedCompilerState previousState;
-
-  ComputeKernelResult(this.succeeded, this.previousState);
-}
-
-/// Computes a kernel file based on [args].
-///
-/// If [isWorker] is true then exit codes will not be set on failure.
-///
-/// If [outputBuffer] is provided then messages will be written to that buffer
-/// instead of printed to the console.
-///
-/// Returns whether or not the summary was successfully output.
-Future<ComputeKernelResult> computeKernel(List<String> args,
-    {bool isWorker: false,
-    StringBuffer outputBuffer,
-    Iterable<Input> inputs,
-    fe.InitializedCompilerState previousState}) async {
-  dynamic out = outputBuffer ?? stderr;
-  bool succeeded = true;
-
-  var parsedArgs = summaryArgsParser.parse(args);
-
-  if (parsedArgs['help']) {
-    out.writeln(summaryArgsParser.usage);
-    if (!isWorker) exit(0);
-    return new ComputeKernelResult(false, previousState);
-  }
-
-  // Bazel creates an overlay file system where some files may be located in the
-  // source tree, some in a gendir, and some in a bindir. The multi-root file
-  // system hides this from the front end.
-  var multiRoots = parsedArgs['multi-root'].map(Uri.base.resolve).toList();
-  if (multiRoots.isEmpty) multiRoots.add(Uri.base);
-  var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
-      multiRoots, fe.StandardFileSystem.instance);
-  var sources = (parsedArgs['source'] as List<String>).map(_toUri).toList();
-  var excludeNonSources = parsedArgs['exclude-non-sources'] as bool;
-
-  var nnbdMode = parsedArgs['sound-null-safety'] as bool
-      ? fe.NnbdMode.Strong
-      : fe.NnbdMode.Weak;
-  var summaryOnly = parsedArgs['summary-only'] as bool;
-  var trackWidgetCreation = parsedArgs['track-widget-creation'] as bool;
-
-  // TODO(sigmund,jakemac): make target mandatory. We allow null to be backwards
-  // compatible while we migrate existing clients of this tool.
-  var targetName =
-      (parsedArgs['target'] as String) ?? (summaryOnly ? 'ddc' : 'vm');
-  var targetFlags = new TargetFlags(
-      trackWidgetCreation: trackWidgetCreation,
-      enableNullSafety: nnbdMode == fe.NnbdMode.Strong);
-  Target target;
-  switch (targetName) {
-    case 'vm':
-      target = new VmTarget(targetFlags);
-      if (summaryOnly) {
-        out.writeln('error: --summary-only not supported for the vm target');
-      }
-      break;
-    case 'flutter':
-      target = new FlutterTarget(targetFlags);
-      if (summaryOnly) {
-        throw new ArgumentError(
-            'error: --summary-only not supported for the flutter target');
-      }
-      break;
-    case 'flutter_runner':
-      target = new FlutterRunnerTarget(targetFlags);
-      if (summaryOnly) {
-        throw new ArgumentError('error: --summary-only not supported for the '
-            'flutter_runner target');
-      }
-      break;
-    case 'dart2js':
-      target = new Dart2jsTarget('dart2js', targetFlags);
-      if (summaryOnly) {
-        out.writeln(
-            'error: --summary-only not supported for the dart2js target');
-      }
-      break;
-    case 'ddc':
-      // TODO(jakemac):If `generateKernel` changes to return a summary
-      // component, process the component instead.
-      target =
-          new DevCompilerSummaryTarget(sources, excludeNonSources, targetFlags);
-      if (!summaryOnly) {
-        out.writeln('error: --no-summary-only not supported for the '
-            'ddc target');
-      }
-      break;
-    default:
-      out.writeln('error: unsupported target: $targetName');
-  }
-
-  List<Uri> linkedInputs =
-      (parsedArgs['input-linked'] as List<String>).map(_toUri).toList();
-
-  List<Uri> summaryInputs =
-      (parsedArgs['input-summary'] as List<String>).map(_toUri).toList();
-
-  fe.InitializedCompilerState state;
-  bool usingIncrementalCompiler = false;
-  bool recordUsedInputs = parsedArgs["used-inputs"] != null;
-  var environmentDefines = _parseEnvironmentDefines(parsedArgs['define']);
-  var verbose = parsedArgs['verbose'] as bool;
-  var verbosity = fe.Verbosity.parseArgument(parsedArgs['verbosity']);
-
-  if (parsedArgs['use-incremental-compiler']) {
-    usingIncrementalCompiler = true;
-
-    /// Build a map of uris to digests.
-    final inputDigests = <Uri, List<int>>{};
-    if (inputs != null) {
-      for (var input in inputs) {
-        inputDigests[_toUri(input.path)] = input.digest;
-      }
-    }
-
-    // If digests weren't given and if not in worker mode, create fake data and
-    // ensure we don't have a previous state (as that wouldn't be safe with
-    // fake input digests).
-    if (!isWorker && inputDigests.isEmpty) {
-      previousState = null;
-      inputDigests[_toUri(parsedArgs['dart-sdk-summary'])] = const [0];
-      for (Uri uri in summaryInputs) {
-        inputDigests[uri] = const [0];
-      }
-      for (Uri uri in linkedInputs) {
-        inputDigests[uri] = const [0];
-      }
-    }
-
-    state = await fe.initializeIncrementalCompiler(
-        previousState,
-        {
-          "target=$targetName",
-          "trackWidgetCreation=$trackWidgetCreation",
-          "multiRootScheme=${fileSystem.markerScheme}",
-          "multiRootRoots=${fileSystem.roots}",
-        },
-        _toUri(parsedArgs['dart-sdk-summary']),
-        _toUri(parsedArgs['packages-file']),
-        _toUri(parsedArgs['libraries-file']),
-        [...summaryInputs, ...linkedInputs],
-        inputDigests,
-        target,
-        fileSystem,
-        (parsedArgs['enable-experiment'] as List<String>),
-        summaryOnly,
-        environmentDefines,
-        trackNeededDillLibraries: recordUsedInputs,
-        verbose: verbose,
-        nnbdMode: nnbdMode);
-  } else {
-    state = await fe.initializeCompiler(
-        // TODO(sigmund): pass an old state once we can make use of it.
-        null,
-        _toUri(parsedArgs['dart-sdk-summary']),
-        _toUri(parsedArgs['libraries-file']),
-        _toUri(parsedArgs['packages-file']),
-        [...summaryInputs, ...linkedInputs],
-        target,
-        fileSystem,
-        parsedArgs['enable-experiment'] as List<String>,
-        environmentDefines,
-        verbose: verbose,
-        nnbdMode: nnbdMode);
-  }
-
-  void onDiagnostic(fe.DiagnosticMessage message) {
-    if (fe.Verbosity.shouldPrint(verbosity, message)) {
-      fe.printDiagnosticMessage(message, out.writeln);
-    }
-    if (message.severity == fe.Severity.error) {
-      succeeded = false;
-    }
-  }
-
-  List<int> kernel;
-  bool wroteUsedDills = false;
-  if (usingIncrementalCompiler) {
-    state.options.onDiagnostic = onDiagnostic;
-    Component incrementalComponent = await state.incrementalCompiler
-        .computeDelta(entryPoints: sources, fullComponent: true);
-
-    if (recordUsedInputs) {
-      Set<Uri> usedOutlines = {};
-      for (Library lib in state.incrementalCompiler.neededDillLibraries) {
-        if (lib.importUri.scheme == "dart") continue;
-        Uri uri = state.libraryToInputDill[lib.importUri];
-        if (uri == null) {
-          throw new StateError("Library ${lib.importUri} was recorded as used, "
-              "but was not in the list of known libraries.");
-        }
-        usedOutlines.add(uri);
-      }
-      var outputUsedFile = new File(parsedArgs["used-inputs"]);
-      outputUsedFile.createSync(recursive: true);
-      outputUsedFile.writeAsStringSync(usedOutlines.join("\n"));
-      wroteUsedDills = true;
-    }
-
-    kernel = await state.incrementalCompiler.context.runInContext((_) {
-      if (summaryOnly) {
-        incrementalComponent.uriToSource.clear();
-        incrementalComponent.problemsAsJson = null;
-        incrementalComponent.setMainMethodAndMode(
-            null, true, incrementalComponent.mode);
-        target.performOutlineTransformations(incrementalComponent);
-        makeStable(incrementalComponent);
-        return Future.value(fe.serializeComponent(incrementalComponent,
-            includeSources: false, includeOffsets: false));
-      }
-
-      makeStable(incrementalComponent);
-
-      return Future.value(fe.serializeComponent(incrementalComponent,
-          filter: excludeNonSources
-              ? (library) => sources.contains(library.importUri)
-              : null,
-          includeOffsets: true));
-    });
-  } else if (summaryOnly) {
-    kernel = await fe.compileSummary(state, sources, onDiagnostic,
-        includeOffsets: false);
-  } else {
-    Component component =
-        await fe.compileComponent(state, sources, onDiagnostic);
-    kernel = fe.serializeComponent(component,
-        filter: excludeNonSources
-            ? (library) => sources.contains(library.importUri)
-            : null,
-        includeOffsets: true);
-  }
-  state.options.onDiagnostic = null; // See http://dartbug.com/36983.
-
-  if (!wroteUsedDills && recordUsedInputs) {
-    // The path taken didn't record inputs used: Say we used everything.
-    var outputUsedFile = new File(parsedArgs["used-inputs"]);
-    outputUsedFile.createSync(recursive: true);
-    Set<Uri> allFiles = {...summaryInputs, ...linkedInputs};
-    outputUsedFile.writeAsStringSync(allFiles.join("\n"));
-    wroteUsedDills = true;
-  }
-
-  if (kernel != null) {
-    var outputFile = new File(parsedArgs['output']);
-    outputFile.createSync(recursive: true);
-    outputFile.writeAsBytesSync(kernel);
-  } else {
-    assert(!succeeded);
-  }
-
-  return new ComputeKernelResult(succeeded, state);
-}
-
-/// Make sure the output is stable by sorting libraries and additional exports.
-void makeStable(Component c) {
-  // Make sure the output is stable.
-  c.libraries.sort((l1, l2) {
-    return "${l1.fileUri}".compareTo("${l2.fileUri}");
-  });
-  c.problemsAsJson?.sort();
-  c.computeCanonicalNames();
-  for (Library library in c.libraries) {
-    library.additionalExports.sort((Reference r1, Reference r2) {
-      return "${r1.canonicalName}".compareTo("${r2.canonicalName}");
-    });
-    library.problemsAsJson?.sort();
-  }
-}
-
-/// Extends the DevCompilerTarget to transform outlines to meet the requirements
-/// of summaries in bazel and package-build.
-///
-/// Build systems like package-build may provide the same input file twice to
-/// the summary worker, but only intends to have it in one output summary.  The
-/// convention is that if it is listed as a source, it is intended to be part of
-/// the output, if the source file was loaded as a dependency, then it was
-/// already included in a different summary.  The transformation below ensures
-/// that the output summary doesn't include those implicit inputs.
-///
-/// Note: this transformation is destructive and is only intended to be used
-/// when generating summaries.
-class DevCompilerSummaryTarget extends DevCompilerTarget {
-  final List<Uri> sources;
-  final bool excludeNonSources;
-
-  DevCompilerSummaryTarget(
-      this.sources, this.excludeNonSources, TargetFlags targetFlags)
-      : super(targetFlags);
-
-  @override
-  void performOutlineTransformations(Component component) {
-    super.performOutlineTransformations(component);
-    if (!excludeNonSources) return;
-
-    List<Library> libraries = new List.from(component.libraries);
-    component.libraries.clear();
-    Set<Uri> include = sources.toSet();
-    for (var lib in libraries) {
-      if (include.contains(lib.importUri)) {
-        component.libraries.add(lib);
-      } else {
-        // Excluding the library also means that their canonical names will not
-        // be computed as part of serialization, so we need to do that
-        // preemtively here to avoid errors when serializing references to
-        // elements of these libraries.
-        component.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
-        lib.computeCanonicalNames();
-      }
-    }
-  }
-}
-
-Uri _toUri(String uriString) {
-  if (uriString == null) return null;
-  // Windows-style paths use '\', so convert them to '/' in case they've been
-  // concatenated with Unix-style paths.
-  return Uri.base.resolve(uriString.replaceAll("\\", "/"));
-}
-
-Map<String, String> _parseEnvironmentDefines(List<String> args) {
-  var environment = <String, String>{};
-
-  for (var arg in args) {
-    var eq = arg.indexOf('=');
-    if (eq <= 0) {
-      var kind = eq == 0 ? 'name' : 'value';
-      throw FormatException('no $kind given to -D option `$arg`');
-    }
-    var name = arg.substring(0, eq);
-    var value = arg.substring(eq + 1);
-    environment[name] = value;
-  }
-
-  return environment;
-}