blob: 2d658941a3ee1b97766b9bbafaa489f00ab5999c [file] [log] [blame]
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::_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();
}
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
}