| 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 { |
| 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 { |
| 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>}; |
| 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 = 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 |
| } |