blob: d686ae7c58d07b9b6f0d2d512902fc4bb6fa9118 [file] [log] [blame]
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:24:8: Error: Expected 1 type arguments.
// f1a<int, String>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:32:8: Error: Expected 0 type arguments.
// f1b<int>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:59:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
// Try changing type arguments so that they conform to the bounds.
// f2a<String>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:60:8: Error: Expected 1 type arguments.
// f2a<int, String>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:81:8: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'call'.
// Try changing type arguments so that they conform to the bounds.
// f3a<num, int>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:95:18: Error: Inferred type argument 'Class4<Object?>' doesn't conform to the bound 'Class4<T>' of the type variable 'T' on 'call'.
// - 'Class4' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart'.
// - 'Object' is from 'dart:core'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// var c4a = f4a(); // error
// ^
//
import self as self;
import "dart:core" as core;
class Class1<T extends core::Object? = dynamic> extends core::Object {
synthetic constructor •() → self::Class1<self::Class1::T%>
: super core::Object::•()
;
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
return new self::Class1::•<self::Class1::_#new#tearOff::T%>();
}
class Class2<T extends core::num> extends core::Object {
synthetic constructor •() → self::Class2<self::Class2::T>
: super core::Object::•()
;
static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
return new self::Class2::•<self::Class2::_#new#tearOff::T>();
}
class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
synthetic constructor •() → self::Class3<self::Class3::T%, self::Class3::S%>
: super core::Object::•()
;
static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
return new self::Class3::•<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
}
class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
synthetic constructor •() → self::Class4<self::Class4::T>
: super core::Object::•()
;
static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
return new self::Class4::•<self::Class4::_#new#tearOff::T>();
}
class Class4int extends self::Class4<self::Class4int> {
synthetic constructor •() → self::Class4int
: super self::Class4::•()
;
static method _#new#tearOff() → self::Class4int
return new self::Class4int::•();
}
static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
static method main() → dynamic {
core::print("inSoundMode: ${self::inSoundMode}");
self::testGeneric();
self::testBounded();
}
static method testGeneric() → dynamic {
<T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
self::Class1<core::int> c1b = f1a<core::int>(){() → self::Class1<core::int>};
self::expect(true, c1b is{ForNonNullableByDefault} self::Class1<core::int>);
self::expect(false, c1b is{ForNonNullableByDefault} self::Class1<core::String>);
() → Null {
let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:24:8: Error: Expected 1 type arguments.
f1a<int, String>(); // error
^" in f1a{<inapplicable>}.<core::int, core::String>();
};
() → self::Class1<core::int> f1b = f1a<core::int>;
self::Class1<core::int> c1c = f1b(){() → self::Class1<core::int>};
self::expect(true, c1c is{ForNonNullableByDefault} self::Class1<core::int>);
self::expect(false, c1c is{ForNonNullableByDefault} self::Class1<core::String>);
() → Null {
let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:32:8: Error: Expected 0 type arguments.
f1b<int>(); // error
^" in f1b{<inapplicable>}.<core::int>();
};
dynamic f1c = #C1;
dynamic c1d = f1c{dynamic}.call();
self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
}
static method testBounded() → dynamic {
<T extends core::num>() → self::Class2<T> f2a = #C2;
self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
self::Class2<core::int> c2b = f2a<core::int>(){() → self::Class2<core::int>};
self::expect(true, c2b is{ForNonNullableByDefault} self::Class2<core::int>);
self::expect(false, c2b is{ForNonNullableByDefault} self::Class2<core::double>);
() → Null {
f2a<core::String>(){() → self::Class2<core::String>};
let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:60:8: Error: Expected 1 type arguments.
f2a<int, String>(); // error
^" in f2a{<inapplicable>}.<core::int, core::String>();
};
dynamic f2b = #C2;
dynamic c2c = f2b{dynamic}.call();
self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
dynamic c2d = f2b{dynamic}.call<core::int>();
self::expect(true, c2d is{ForNonNullableByDefault} self::Class2<core::int>);
self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
<T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
self::Class3<core::int, core::num> c3b = f3a<core::int, core::num>(){() → self::Class3<core::int, core::num>};
self::expect(true, c3b is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
self::expect(false, c3b is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
() → Null {
f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
};
dynamic f3b = #C3;
dynamic c3c = f3b{dynamic}.call();
self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
dynamic c3d = f3b{dynamic}.call<core::int, core::num>();
self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
<T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
() → Null {
self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
};
dynamic f4b = #C4;
self::throws(() → dynamic => f4b{dynamic}.call());
dynamic c4b = f4b{dynamic}.call<self::Class4int>();
self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
}
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 = #C5}) → 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 = tearoff self::Class1::_#new#tearOff
#C2 = tearoff self::Class2::_#new#tearOff
#C3 = tearoff self::Class3::_#new#tearOff
#C4 = tearoff self::Class4::_#new#tearOff
#C5 = false
}