Version 2.14.0-347.0.dev

Merge commit '80b05d07e84468caadd2b9d63e4f2efecc9499f1' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 9e9b67d..01cf218 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -217,6 +217,7 @@
   @override
   ExpressionInferenceResult visitConstructorTearOff(
       ConstructorTearOff node, DartType typeContext) {
+    inferrer.ensureMemberType(node.target);
     DartType type =
         node.target.function!.computeFunctionType(inferrer.library.nonNullable);
     return inferrer.instantiateTearOff(type, typeContext, node);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index f157d7b..a0be20e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -363,6 +363,14 @@
     }
   }
 
+  /// Ensures that the type of [member] has been computed.
+  // TODO(johnniwinther): Expand this to handle lowerings.
+  void ensureMemberType(Member member) {
+    if (member is Constructor) {
+      inferConstructorParameterTypes(member);
+    }
+  }
+
   @override
   void inferConstructorParameterTypes(Constructor target) {
     ConstructorBuilder? constructor = engine.beingInferred[target];
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart
new file mode 100644
index 0000000..1750b68
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart
@@ -0,0 +1,76 @@
+// 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.
+
+final bool inSoundMode = <int?>[] is! List<int>;
+
+main() {
+  print('inSoundMode: $inSoundMode');
+  testInferred();
+}
+
+class Class1 {
+  int field;
+
+  Class1(this.field);
+}
+
+abstract class Interface2 {
+  int get field;
+}
+
+class Class2 implements Interface2 {
+  final field;
+
+  Class2(this.field);
+}
+
+var Class1_new = Class1.new;
+var Class2_new = Class2.new;
+
+testInferred() {
+  var f1a = Class1.new;
+  expect(true, f1a is Class1 Function(int));
+  expect(false, f1a is Class1 Function(String));
+  var c1a = f1a(0);
+  expect(true, c1a is Class1);
+  () {
+    f1a(''); // error
+  };
+
+  dynamic f1b = Class1.new;
+  var c1b = f1b(0);
+  expect(true, c1b is Class1);
+  throws(() => f1b(''));
+
+  var f2a = Class2.new;
+  expect(true, f2a is Class2 Function(int));
+  expect(false, f2a is Class2 Function(String));
+  var c2a = f2a(0);
+  expect(true, c2a is Class2);
+  () {
+    f2a(''); // error
+  };
+
+  dynamic f2b = Class2.new;
+  var c2b = f2b(0);
+  expect(true, c2b is Class2);
+  throws(() => f2b(''));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
+
+throws(Function() f, {bool inSoundModeOnly: false}) {
+  try {
+    f();
+  } catch (e) {
+    print('Thrown: $e');
+    return;
+  }
+  if (!inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.strong.expect
new file mode 100644
index 0000000..e2692d7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.strong.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f1a(''); // error
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f2a(''); // error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static field (core::int) → self::Class1 Class1_new = #C1;
+static field (core::int) → self::Class2 Class2_new = #C2;
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testInferred();
+}
+static method testInferred() → dynamic {
+  (core::int) → self::Class1 f1a = #C1;
+  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
+  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
+  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  () → Null {
+    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call(0);
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::throws(() → dynamic => f1b{dynamic}.call(""));
+  (core::int) → self::Class2 f2a = #C2;
+  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
+  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
+  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  () → Null {
+    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call(0);
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::throws(() → dynamic => f2b{dynamic}.call(""));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C3}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.strong.transformed.expect
new file mode 100644
index 0000000..6a6db60
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.strong.transformed.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f1a(''); // error
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f2a(''); // error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+}
+static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
+static field (core::int) → self::Class1 Class1_new = #C1;
+static field (core::int) → self::Class2 Class2_new = #C2;
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testInferred();
+}
+static method testInferred() → dynamic {
+  (core::int) → self::Class1 f1a = #C1;
+  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
+  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
+  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  () → Null {
+    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call(0);
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::throws(() → dynamic => f1b{dynamic}.call(""));
+  (core::int) → self::Class2 f2a = #C2;
+  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
+  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
+  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  () → Null {
+    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call(0);
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::throws(() → dynamic => f2b{dynamic}.call(""));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C3}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.textual_outline.expect
new file mode 100644
index 0000000..94115d1
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+final bool inSoundMode = <int?>[] is! List<int>;
+main() {}
+class Class1 {
+  int field;
+  Class1(this.field);
+}
+abstract class Interface2 {
+  int get field;
+}
+class Class2 implements Interface2 {
+  final field;
+  Class2(this.field);
+}
+var Class1_new = Class1.new;
+var Class2_new = Class2.new;
+testInferred() {}
+expect(expected, actual) {}
+throws(Function() f, {bool inSoundModeOnly: false}) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.expect
new file mode 100644
index 0000000..e2692d7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f1a(''); // error
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f2a(''); // error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static field (core::int) → self::Class1 Class1_new = #C1;
+static field (core::int) → self::Class2 Class2_new = #C2;
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testInferred();
+}
+static method testInferred() → dynamic {
+  (core::int) → self::Class1 f1a = #C1;
+  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
+  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
+  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  () → Null {
+    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call(0);
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::throws(() → dynamic => f1b{dynamic}.call(""));
+  (core::int) → self::Class2 f2a = #C2;
+  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
+  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
+  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  () → Null {
+    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call(0);
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::throws(() → dynamic => f2b{dynamic}.call(""));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C3}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.outline.expect
new file mode 100644
index 0000000..73a2bca
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.outline.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    ;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    ;
+}
+static final field core::bool inSoundMode;
+static field (core::int) → self::Class1 Class1_new;
+static field (core::int) → self::Class2 Class2_new;
+static method main() → dynamic
+  ;
+static method testInferred() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.transformed.expect
new file mode 100644
index 0000000..6a6db60
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.transformed.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f1a(''); // error
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f2a(''); // error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+}
+static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
+static field (core::int) → self::Class1 Class1_new = #C1;
+static field (core::int) → self::Class2 Class2_new = #C2;
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testInferred();
+}
+static method testInferred() → dynamic {
+  (core::int) → self::Class1 f1a = #C1;
+  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
+  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
+  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  () → Null {
+    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call(0);
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::throws(() → dynamic => f1b{dynamic}.call(""));
+  (core::int) → self::Class2 f2a = #C2;
+  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
+  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
+  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  () → Null {
+    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call(0);
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::throws(() → dynamic => f2b{dynamic}.call(""));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C3}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart
index fc8cba1..1750b68 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart
@@ -25,6 +25,9 @@
   Class2(this.field);
 }
 
+var Class1_new = Class1.new;
+var Class2_new = Class2.new;
+
 testInferred() {
   var f1a = Class1.new;
   expect(true, f1a is Class1 Function(int));
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.expect
index f11dd53..8770854 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.expect
@@ -2,11 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+//  - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class1_new = Class1.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+//  - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class2_new = Class2.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f1a(''); // error
 //         ^
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f2a(''); // error
 //         ^
 //
@@ -36,6 +46,14 @@
     return new self::Class2::•(field);
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static field (dynamic) → self::Class1 Class1_new = let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+ - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class1_new = Class1.new;
+                 ^" in (#C1) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class1;
+static field (dynamic) → self::Class2 Class2_new = let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+ - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class2_new = Class2.new;
+                 ^" in (#C2) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class2;
 static method main() → dynamic {
   core::print("inSoundMode: ${self::inSoundMode}");
   self::testInferred();
@@ -47,7 +65,7 @@
   self::Class1 c1a = f1a(0){(core::int) → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
   () → Null {
-    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f1a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
   };
@@ -61,7 +79,7 @@
   self::Class2 c2a = f2a(0){(core::int) → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
   () → Null {
-    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f2a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
   };
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.transformed.expect
index ff0482b..2d658941 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.strong.transformed.expect
@@ -2,11 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+//  - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class1_new = Class1.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+//  - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class2_new = Class2.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f1a(''); // error
 //         ^
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f2a(''); // error
 //         ^
 //
@@ -36,6 +46,14 @@
     return new self::Class2::•(field);
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
+static field (dynamic) → self::Class1 Class1_new = let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+ - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class1_new = Class1.new;
+                 ^" in (#C1) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class1;
+static field (dynamic) → self::Class2 Class2_new = let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+ - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class2_new = Class2.new;
+                 ^" in (#C2) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class2;
 static method main() → dynamic {
   core::print("inSoundMode: ${self::inSoundMode}");
   self::testInferred();
@@ -47,7 +65,7 @@
   self::Class1 c1a = f1a(0){(core::int) → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
   () → Null {
-    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f1a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
   };
@@ -61,7 +79,7 @@
   self::Class2 c2a = f2a(0){(core::int) → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
   () → Null {
-    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f2a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
   };
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.textual_outline.expect
index 9e086db..94115d1 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.textual_outline.expect
@@ -1,20 +1,18 @@
 final bool inSoundMode = <int?>[] is! List<int>;
 main() {}
-
 class Class1 {
   int field;
   Class1(this.field);
 }
-
 abstract class Interface2 {
   int get field;
 }
-
 class Class2 implements Interface2 {
   final field;
   Class2(this.field);
 }
-
+var Class1_new = Class1.new;
+var Class2_new = Class2.new;
 testInferred() {}
 expect(expected, actual) {}
 throws(Function() f, {bool inSoundModeOnly: false}) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.expect
index f11dd53..8770854 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.expect
@@ -2,11 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+//  - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class1_new = Class1.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+//  - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class2_new = Class2.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f1a(''); // error
 //         ^
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f2a(''); // error
 //         ^
 //
@@ -36,6 +46,14 @@
     return new self::Class2::•(field);
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static field (dynamic) → self::Class1 Class1_new = let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+ - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class1_new = Class1.new;
+                 ^" in (#C1) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class1;
+static field (dynamic) → self::Class2 Class2_new = let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+ - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class2_new = Class2.new;
+                 ^" in (#C2) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class2;
 static method main() → dynamic {
   core::print("inSoundMode: ${self::inSoundMode}");
   self::testInferred();
@@ -47,7 +65,7 @@
   self::Class1 c1a = f1a(0){(core::int) → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
   () → Null {
-    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f1a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
   };
@@ -61,7 +79,7 @@
   self::Class2 c2a = f2a(0){(core::int) → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
   () → Null {
-    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f2a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
   };
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.outline.expect
index 802525c..a9eb8a4 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.outline.expect
@@ -22,6 +22,8 @@
     return new self::Class2::•(field);
 }
 static final field core::bool inSoundMode;
+static field (dynamic) → self::Class1 Class1_new;
+static field (dynamic) → self::Class2 Class2_new;
 static method main() → dynamic
   ;
 static method testInferred() → dynamic
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.transformed.expect
index ff0482b..2d658941 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.transformed.expect
@@ -2,11 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+//  - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class1_new = Class1.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+//  - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+// var Class2_new = Class2.new;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f1a(''); // error
 //         ^
 //
-// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 //     f2a(''); // error
 //         ^
 //
@@ -36,6 +46,14 @@
     return new self::Class2::•(field);
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
+static field (dynamic) → self::Class1 Class1_new = let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:28:18: Error: A value of type 'Class1 Function(int)' can't be assigned to a variable of type 'Class1 Function(dynamic)'.
+ - 'Class1' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class1_new = Class1.new;
+                 ^" in (#C1) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class1;
+static field (dynamic) → self::Class2 Class2_new = let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:29:18: Error: A value of type 'Class2 Function(int)' can't be assigned to a variable of type 'Class2 Function(dynamic)'.
+ - 'Class2' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart'.
+var Class2_new = Class2.new;
+                 ^" in (#C2) as{TypeError,ForNonNullableByDefault} (dynamic) → self::Class2;
 static method main() → dynamic {
   core::print("inSoundMode: ${self::inSoundMode}");
   self::testInferred();
@@ -47,7 +65,7 @@
   self::Class1 c1a = f1a(0){(core::int) → self::Class1};
   self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
   () → Null {
-    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:35:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f1a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
   };
@@ -61,7 +79,7 @@
   self::Class2 c2a = f2a(0){(core::int) → self::Class2};
   self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
   () → Null {
-    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:49:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
     f2a(''); // error
         ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
   };
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 96b0f76..0b30a52 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -9,6 +9,7 @@
 dart2js/late_statics: SemiFuzzFailure # dartbug.com/45854
 
 constructor_tearoffs/const_tear_off: RuntimeError
+constructor_tearoffs/inferred_constructor_tear_off: RuntimeError
 constructor_tearoffs/redirecting_constructors: RuntimeError
 constructor_tearoffs/redirecting_factory_tear_off: RuntimeError
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 0aa79ba..29295ce 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -7,6 +7,7 @@
 # Kernel files are produced by compiling Dart code via Fasta.
 
 constructor_tearoffs/const_tear_off: RuntimeError
+constructor_tearoffs/inferred_constructor_tear_off: RuntimeError
 constructor_tearoffs/redirecting_constructors: RuntimeError
 constructor_tearoffs/redirecting_factory_tear_off: RuntimeError
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 3f5fe28..b961189 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -29,7 +29,9 @@
 constructor_tearoffs/generic_tearoff_with_context: FormatterCrash
 constructor_tearoffs/generic_tearoff_without_context: FormatterCrash
 constructor_tearoffs/identical_instantiated_function_tearoffs: FormatterCrash
+constructor_tearoffs/inferred_constructor_tear_off: FormatterCrash
 constructor_tearoffs/instantiation: FormatterCrash
+constructor_tearoffs/lowering/inferred_constructor_tear_off: FormatterCrash
 constructor_tearoffs/nongeneric_tearoff_with_context: FormatterCrash
 constructor_tearoffs/nongeneric_tearoff_without_context: FormatterCrash
 constructor_tearoffs/redirecting_constructors: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index b92823f..569aa45 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -12,6 +12,7 @@
 dart2js/late_statics: SemiFuzzFailure # dartbug.com/45854
 
 constructor_tearoffs/const_tear_off: RuntimeError
+constructor_tearoffs/inferred_constructor_tear_off: RuntimeError
 constructor_tearoffs/redirecting_constructors: RuntimeError
 constructor_tearoffs/redirecting_factory_tear_off: RuntimeError
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
diff --git a/tools/VERSION b/tools/VERSION
index ca41d7f..c32c3d3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 346
+PRERELEASE 347
 PRERELEASE_PATCH 0
\ No newline at end of file