library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:27:8: Error: Expected 1 type arguments.
//     f1a<int, String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:35:8: Error: Expected 0 type arguments.
//     f1b<int>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_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_redirecting_factory_tear_off.dart:75:8: Error: Expected 1 type arguments.
//     f2a<int, String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_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_redirecting_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_redirecting_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 {
  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
  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 new self::Class1::_<self::Class1::_#new#tearOff::T%>();
}
class Class2<T extends core::num> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class2::•]/*isLegacy*/;
  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 new self::Class2::_<self::Class2::_#new#tearOff::T>();
}
class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
  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 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 {
  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
  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 new self::Class4::_<self::Class4::_#new#tearOff::T>();
}
class Class4int extends self::Class4<self::Class4int> {
  static final field dynamic _redirecting# = <dynamic>[self::Class4int::•]/*isLegacy*/;
  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 new self::Class4int::_();
}
static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) 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_redirecting_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 {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_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>};
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_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
}
