library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:34:8: Error: Too many positional arguments: 0 allowed, but 1 found.
// Try removing the extra positional arguments.
//     f1a(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:46:8: Error: Too many positional arguments: 0 allowed, but 1 found.
// Try removing the extra positional arguments.
//     f2a(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:47:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'call'.
// Try changing type arguments so that they conform to the bounds.
//     f2a<String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:65:8: Error: Too many positional arguments: 0 allowed, but 1 found.
// Try removing the extra positional arguments.
//     f3a(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:66:8: Error: Expected 0 type arguments.
//     f3a<String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:85:8: Error: Too few positional arguments: 1 required, 0 given.
//     f3c(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:86:8: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
//     f3c(0, 0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:87:8: Error: Expected 0 type arguments.
//     f3c<String>(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:107:8: Error: Too few positional arguments: 2 required, 0 given.
//     f3e(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:108:8: Error: Too few positional arguments: 2 required, 1 given.
//     f3e(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:109:8: Error: Expected 0 type arguments.
//     f3e<String>(0, ''); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:130:8: Error: Too many positional arguments: 0 allowed, but 1 found.
// Try removing the extra positional arguments.
//     f4a(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:131:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'call'.
// Try changing type arguments so that they conform to the bounds.
//     f4a<String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:152:8: Error: Too many positional arguments: 0 allowed, but 1 found.
// Try removing the extra positional arguments.
//     f5a(0); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:153:8: Error: Expected 2 type arguments.
//     f5a<String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:154:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'call'.
// Try changing type arguments so that they conform to the bounds.
//     f5a<String, String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:155:8: Error: Type argument 'num' doesn't conform to the bound 'String' of the type variable 'Y' on 'call'.
// Try changing type arguments so that they conform to the bounds.
//     f5a<num, num>(); // error
//        ^
//
import self as self;
import "dart:core" as core;

typedef DA1 = self::A;
typedef DA2<unrelated X extends core::num> = self::A;
typedef DB1 = self::B<core::String>;
typedef DB2<X extends core::num> = self::B<X>;
typedef DB3<X extends core::num, unrelated Y extends core::String> = self::B<X>;
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  static method _#new#tearOff() → self::A
    return new self::A::•();
}
class B<X extends core::Object? = dynamic> extends core::Object {
  field core::int field1;
  field core::String field2;
  constructor _(core::int field1, core::String field2) → self::B<self::B::X%>
    : self::B::field1 = field1, self::B::field2 = field2, super core::Object::•()
    ;
  constructor •() → self::B<self::B::X%>
    : this self::B::_(0, "")
    ;
  constructor foo(core::int field1) → self::B<self::B::X%>
    : self::B::field1 = field1, self::B::field2 = "", super core::Object::•()
    ;
  static method _#_#tearOff<X extends core::Object? = dynamic>(core::int field1, core::String field2) → self::B<self::B::_#_#tearOff::X%>
    return new self::B::_<self::B::_#_#tearOff::X%>(field1, field2);
  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::X%>
    return new self::B::•<self::B::_#new#tearOff::X%>();
  static method _#foo#tearOff<X extends core::Object? = dynamic>(core::int field1) → self::B<self::B::_#foo#tearOff::X%>
    return new self::B::foo<self::B::_#foo#tearOff::X%>(field1);
  static factory bar<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::bar::X%>
    return new self::B::_<self::B::bar::X%>(i, j);
  static method _#bar#tearOff<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::_#bar#tearOff::X%>
    return self::B::bar<self::B::_#bar#tearOff::X%>(i, j);
}
static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
static method main() → dynamic {
  () → self::A f1a = #C1;
  self::A c1a = f1a(){() → self::A};
  self::expect(true, c1a is{ForNonNullableByDefault} self::A);
  () → Null {
    let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:34:8: Error: Too many positional arguments: 0 allowed, but 1 found.
Try removing the extra positional arguments.
    f1a(0); // error
       ^" in f1a{<inapplicable>}.(0);
  };
  dynamic f1b = #C1;
  dynamic c1b = f1b{dynamic}.call();
  self::expect(true, c1b is{ForNonNullableByDefault} self::A);
  self::throws(() → dynamic => f1b{dynamic}.call(0));
  <unrelated X extends core::num>() → self::A f2a = #C2;
  self::A c2a = f2a<core::num>(){() → self::A};
  self::expect(true, c2a is{ForNonNullableByDefault} self::A);
  () → Null {
    let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:46:8: Error: Too many positional arguments: 0 allowed, but 1 found.
Try removing the extra positional arguments.
    f2a(0); // error
       ^" in f2a{<inapplicable>}.<core::num>(0);
    f2a<core::String>(){() → self::A};
  };
  dynamic f2b = #C3;
  dynamic c2b = f2b{dynamic}.call();
  self::expect(true, c2b is{ForNonNullableByDefault} self::A);
  dynamic c2c = f2b{dynamic}.call<core::int>();
  self::expect(true, c2c is{ForNonNullableByDefault} self::A);
  self::throws(() → dynamic => f2b{dynamic}.call(0));
  self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
  () → self::B<core::String> f3a = #C5;
  self::B<core::String> c3a = f3a(){() → self::B<core::String>};
  self::expect(true, c3a is{ForNonNullableByDefault} self::B<core::String>);
  self::expect(false, c3a is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(0, c3a.{self::B::field1}{core::int});
  self::expect("", c3a.{self::B::field2}{core::String});
  () → Null {
    let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:65:8: Error: Too many positional arguments: 0 allowed, but 1 found.
Try removing the extra positional arguments.
    f3a(0); // error
       ^" in f3a{<inapplicable>}.(0);
    let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:66:8: Error: Expected 0 type arguments.
    f3a<String>(); // error
       ^" in f3a{<inapplicable>}.<core::String>();
  };
  dynamic f3b = #C5;
  dynamic c3b = f3b{dynamic}.call();
  self::expect(true, c3b is{ForNonNullableByDefault} self::B<core::String>);
  self::expect(false, c3b is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(0, c3a.{self::B::field1}{core::int});
  self::expect("", c3a.{self::B::field2}{core::String});
  self::throws(() → dynamic => f3b{dynamic}.call(0));
  self::throws(() → dynamic => f3b{dynamic}.call<core::String>());
  (core::int) → self::B<core::String> f3c = #C7;
  self::B<core::String> c3c = f3c(42){(core::int) → self::B<core::String>};
  self::expect(true, c3c is{ForNonNullableByDefault} self::B<core::String>);
  self::expect(false, c3c is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(42, c3c.{self::B::field1}{core::int});
  self::expect("", c3c.{self::B::field2}{core::String});
  () → Null {
    let final Never #t5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:85:8: Error: Too few positional arguments: 1 required, 0 given.
    f3c(); // error
       ^" in f3c{<inapplicable>}.();
    let final Never #t6 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:86:8: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
    f3c(0, 0); // error
       ^" in f3c{<inapplicable>}.(0, 0);
    let final Never #t7 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:87:8: Error: Expected 0 type arguments.
    f3c<String>(0); // error
       ^" in f3c{<inapplicable>}.<core::String>(0);
  };
  dynamic f3d = #C7;
  dynamic c3d = f3d{dynamic}.call(42);
  self::expect(true, c3d is{ForNonNullableByDefault} self::B<core::String>);
  self::expect(false, c3d is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(42, c3d{dynamic}.field1);
  self::expect("", c3d{dynamic}.field2);
  self::throws(() → dynamic => f3d{dynamic}.call());
  self::throws(() → dynamic => f3d{dynamic}.call(0, 0));
  self::throws(() → dynamic => f3d{dynamic}.call<core::String>(0));
  (core::int, core::String) → self::B<core::String> f3e = #C9;
  self::B<core::String> c3e = f3e(42, "foo"){(core::int, core::String) → self::B<core::String>};
  self::expect(true, c3e is{ForNonNullableByDefault} self::B<core::String>);
  self::expect(false, c3e is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(42, c3e.{self::B::field1}{core::int});
  self::expect("foo", c3e.{self::B::field2}{core::String});
  () → Null {
    let final Never #t8 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:107:8: Error: Too few positional arguments: 2 required, 0 given.
    f3e(); // error
       ^" in f3e{<inapplicable>}.();
    let final Never #t9 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:108:8: Error: Too few positional arguments: 2 required, 1 given.
    f3e(0); // error
       ^" in f3e{<inapplicable>}.(0);
    let final Never #t10 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:109:8: Error: Expected 0 type arguments.
    f3e<String>(0, ''); // error
       ^" in f3e{<inapplicable>}.<core::String>(0, "");
  };
  dynamic f3f = #C9;
  dynamic c3f = f3f{dynamic}.call(42, "foo");
  self::expect(true, c3f is{ForNonNullableByDefault} self::B<core::String>);
  self::expect(false, c3f is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(42, c3f{dynamic}.field1);
  self::expect("foo", c3f{dynamic}.field2);
  self::throws(() → dynamic => c3f{dynamic}.call());
  self::throws(() → dynamic => c3f{dynamic}.call(0));
  self::throws(() → dynamic => c3f{dynamic}.call<core::String>(0));
  <X extends core::num>() → self::B<X> f4a = #C10;
  self::B<core::num> c4a = f4a<core::num>(){() → self::B<core::num>};
  self::expect(true, c4a is{ForNonNullableByDefault} self::B<core::num>);
  self::expect(false, c4a is{ForNonNullableByDefault} self::B<core::int>);
  self::B<core::int> c4b = f4a<core::int>(){() → self::B<core::int>};
  self::expect(true, c4b is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(false, c4b is{ForNonNullableByDefault} self::B<core::double>);
  () → Null {
    let final Never #t11 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:130:8: Error: Too many positional arguments: 0 allowed, but 1 found.
Try removing the extra positional arguments.
    f4a(0); // error
       ^" in f4a{<inapplicable>}.<core::num>(0);
    f4a<core::String>(){() → self::B<core::String>};
  };
  dynamic f4b = #C11;
  dynamic c4c = f4b{dynamic}.call();
  self::expect(true, c4c is{ForNonNullableByDefault} self::B<core::num>);
  self::expect(false, c4c is{ForNonNullableByDefault} self::B<core::int>);
  dynamic c4d = f4b{dynamic}.call<core::int>();
  self::expect(true, c4d is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(false, c4d is{ForNonNullableByDefault} self::B<core::double>);
  self::throws(() → dynamic => f4b{dynamic}.call(0));
  self::throws(() → dynamic => f4b{dynamic}.call<core::String>());
  <X extends core::num, unrelated Y extends core::String>() → self::B<X> f5a = #C12;
  self::B<core::num> c5a = f5a<core::num, core::String>(){() → self::B<core::num>};
  self::expect(true, c5a is{ForNonNullableByDefault} self::B<core::num>);
  self::expect(false, c5a is{ForNonNullableByDefault} self::B<core::int>);
  self::B<core::int> c5b = f5a<core::int, core::String>(){() → self::B<core::int>};
  self::expect(true, c5b is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(false, c5b is{ForNonNullableByDefault} self::B<core::double>);
  () → Null {
    let final Never #t12 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:152:8: Error: Too many positional arguments: 0 allowed, but 1 found.
Try removing the extra positional arguments.
    f5a(0); // error
       ^" in f5a{<inapplicable>}.<core::num, core::String>(0);
    let final Never #t13 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:153:8: Error: Expected 2 type arguments.
    f5a<String>(); // error
       ^" in f5a{<inapplicable>}.<core::String>();
    f5a<core::String, core::String>(){() → self::B<core::String>};
    f5a<core::num, core::num>(){() → self::B<core::num>};
  };
  dynamic f5b = #C13;
  dynamic c5c = f5b{dynamic}.call();
  self::expect(true, c5c is{ForNonNullableByDefault} self::B<core::num>);
  self::expect(false, c5c is{ForNonNullableByDefault} self::B<core::int>);
  dynamic c5d = f5b{dynamic}.call<core::int, core::String>();
  self::expect(true, c5d is{ForNonNullableByDefault} self::B<core::int>);
  self::expect(false, c5d is{ForNonNullableByDefault} self::B<core::double>);
  self::throws(() → dynamic => f5b{dynamic}.call(0));
  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
  self::throws(() → dynamic => f5b{dynamic}.call<core::String, core::String>());
  self::throws(() → dynamic => f5b{dynamic}.call<core::num, core::num>());
}
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 = #C14}) → 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";
}
static method _#0#tearOff<unrelated X extends core::num>() → self::A
  return (#C1)(){() → self::A};
static method _#1#tearOff<unrelated X extends core::num>() → self::A
  return (#C1)(){() → self::A};
static method _#2#tearOff<X extends core::num>() → self::B<self::_#2#tearOff::X>
  return (#C4)<self::_#2#tearOff::X>(){() → self::B<self::_#2#tearOff::X>};
static method _#3#tearOff<X extends core::num>() → self::B<self::_#3#tearOff::X>
  return (#C4)<self::_#3#tearOff::X>(){() → self::B<self::_#3#tearOff::X>};
static method _#4#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#4#tearOff::X>
  return (#C4)<self::_#4#tearOff::X>(){() → self::B<self::_#4#tearOff::X>};
static method _#5#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#5#tearOff::X>
  return (#C4)<self::_#5#tearOff::X>(){() → self::B<self::_#5#tearOff::X>};

constants  {
  #C1 = static-tearoff self::A::_#new#tearOff
  #C2 = static-tearoff self::_#0#tearOff
  #C3 = static-tearoff self::_#1#tearOff
  #C4 = static-tearoff self::B::_#new#tearOff
  #C5 = instantiation self::B::_#new#tearOff <core::String*>
  #C6 = static-tearoff self::B::_#foo#tearOff
  #C7 = instantiation self::B::_#foo#tearOff <core::String*>
  #C8 = static-tearoff self::B::_#bar#tearOff
  #C9 = instantiation self::B::_#bar#tearOff <core::String*>
  #C10 = static-tearoff self::_#2#tearOff
  #C11 = static-tearoff self::_#3#tearOff
  #C12 = static-tearoff self::_#4#tearOff
  #C13 = static-tearoff self::_#5#tearOff
  #C14 = false
}
