| library /*isNonNullableByDefault*/; |
| // |
| // Problems in library: |
| // |
| // 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: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::•() |
| ; |
| static method _#new#tearOff(core::int field) → self::Class1 |
| return new self::Class1::•(field); |
| } |
| 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 method _#new#tearOff(core::int field) → self::Class2 |
| 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(); |
| } |
| 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 #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}; |
| }; |
| 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 #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}; |
| }; |
| 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 = static-tearoff self::Class1::_#new#tearOff |
| #C2 = static-tearoff self::Class2::_#new#tearOff |
| #C3 = false |
| } |