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
}
