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