blob: eae54df568cb2b51e4c747951eba3972625a333d [file] [log] [blame]
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:27:8: Error: Expected 1 type arguments.
// f1a<int, String>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:35:8: Error: Expected 0 type arguments.
// f1b<int>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:74: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_factory_tear_off.dart:75:8: Error: Expected 1 type arguments.
// f2a<int, String>(); // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:96: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_factory_tear_off.dart:110: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_factory_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 {
constructor _() self::Class1<self::Class1::T%>
: super core::Object::•()
;
static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
static factory •<T extends core::Object? = dynamic>() self::Class1<self::Class1::•::T%>
return new self::Class1::_<self::Class1::•::T%>();
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
return self::Class1::•<self::Class1::_#new#tearOff::T%>();
}
class Class2<T extends core::num> extends core::Object {
constructor _() self::Class2<self::Class2::T>
: super core::Object::•()
;
static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
return new self::Class2::_<self::Class2::_#_#tearOff::T>();
static factory •<T extends core::num>() self::Class2<self::Class2::•::T>
return new self::Class2::_<self::Class2::•::T>();
static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
return self::Class2::•<self::Class2::_#new#tearOff::T>();
}
class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
constructor _() self::Class3<self::Class3::T%, self::Class3::S%>
: super core::Object::•()
;
static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() self::Class3<self::Class3::•::T%, self::Class3::•::S%>
return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
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 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 {
constructor _() self::Class4<self::Class4::T>
: super core::Object::•()
;
static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
return new self::Class4::_<self::Class4::_#_#tearOff::T>();
static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() self::Class4<self::Class4::•::T>
return new self::Class4::_<self::Class4::•::T>();
static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
return self::Class4::•<self::Class4::_#new#tearOff::T>();
}
class Class4int extends self::Class4<self::Class4int> {
constructor _() self::Class4int
: super self::Class4::_()
;
static method _#_#tearOff() → self::Class4int
return new self::Class4int::_();
static factory •() self::Class4int
return new self::Class4int::_();
static method _#new#tearOff() → self::Class4int
return 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_factory_tear_off.dart:27: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_factory_tear_off.dart:35: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_factory_tear_off.dart:75: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 = static-tearoff self::Class1::_#new#tearOff
#C2 = static-tearoff self::Class2::_#new#tearOff
#C3 = static-tearoff self::Class3::_#new#tearOff
#C4 = static-tearoff self::Class4::_#new#tearOff
#C5 = false
}