library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:99:8: Error: Too few positional arguments: 1 required, 0 given.
//     f3a(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:100:8: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
//     f3a(42, 87); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:115:8: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
//     f4a(42, 87); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:129:8: Error: Too few positional arguments: 1 required, 0 given.
//     f5a(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:130:8: Error: Too many positional arguments: 2 allowed, but 3 found.
// Try removing the extra positional arguments.
//     f5a(42, 87, 123); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:142:8: Error: Too few positional arguments: 1 required, 0 given.
//     f6a(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:143:8: Error: Required named parameter 'field3' must be provided.
//     f6a(42); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:144:8: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
//     f6a(42, 87); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:145:8: Error: Too few positional arguments: 1 required, 0 given.
//     f6a(field1: 87, field2: 87); // error
//        ^
//
import self as self;
import "dart:core" as core;

class Class1 extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
  constructor _() → self::Class1
    : super core::Object::•()
    ;
  static factory •() → self::Class1
    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
}
class Class2 extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
  constructor __() → self::Class2
    : super core::Object::•()
    ;
  static factory _() → self::Class2
    return new self::Class2::__();
  static factory named() → self::Class2
    let () → self::Class2 #redirecting_factory = self::Class2::_ in invalid-expression;
}
class Class3 extends core::Object {
  final field core::int field;
  static final field dynamic _redirecting# = <dynamic>[self::Class3::•]/*isLegacy*/;
  constructor _(core::int field) → self::Class3
    : self::Class3::field = field, super core::Object::•()
    ;
  static factory •(core::int field) → self::Class3
    let Never #redirecting_factory = self::Class3::_ in invalid-expression;
}
class Class4 extends core::Object {
  final field core::int? field;
  static final field dynamic _redirecting# = <dynamic>[self::Class4::•]/*isLegacy*/;
  constructor _([core::int? field = #C1]) → self::Class4
    : self::Class4::field = field, super core::Object::•()
    ;
  static factory •([core::int? field = #C1]) → self::Class4
    let Never #redirecting_factory = self::Class4::_ in invalid-expression;
}
class Class5 extends core::Object {
  final field core::int field1;
  final field core::int? field2;
  static final field dynamic _redirecting# = <dynamic>[self::Class5::•]/*isLegacy*/;
  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
    : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
    ;
  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
    let Never #redirecting_factory = self::Class5::_ in invalid-expression;
}
class Class6 extends core::Object {
  final field core::int field1;
  final field core::int? field2;
  final field core::int field3;
  static final field dynamic _redirecting# = <dynamic>[self::Class6::•]/*isLegacy*/;
  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
    : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
    ;
  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
    let Never #redirecting_factory = self::Class6::_ in invalid-expression;
}
class Class7a extends core::Object implements self::Class7b {
  constructor •() → self::Class7a
    : super core::Object::•()
    ;
}
class Class7b extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
  static factory •() → self::Class7b
    let Never #redirecting_factory = self::Class7a::• in invalid-expression;
}
class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
  constructor •() → self::Class8a<self::Class8a::T%>
    : super core::Object::•()
    ;
}
class Class8b<T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
  static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
    let Never #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
}
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::testNoArgs();
  self::testArgs();
}
static method testNoArgs() → dynamic {
  () → self::Class1 f1a = #C2;
  self::Class1 c1a = f1a(){() → self::Class1};
  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
  dynamic f1b = #C2;
  dynamic c1b = f1b{dynamic}.call();
  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
  self::expect(true, core::identical(f1a, f1b));
  () → self::Class2 f2a = #C3;
  self::Class2 c2a = f2a(){() → self::Class2};
  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
  dynamic f2b = #C3;
  dynamic c2b = f2b{dynamic}.call();
  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
  self::expect(true, core::identical(f2a, f2b));
}
static method testArgs() → dynamic {
  (core::int) → self::Class3 f3a = #C4;
  self::Class3 c3a = f3a(42){(core::int) → self::Class3};
  self::expect(42, c3a.{self::Class3::field}{core::int});
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:99:8: Error: Too few positional arguments: 1 required, 0 given.
    f3a(); // error
       ^" in f3a{<inapplicable>}.();
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:100:8: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
    f3a(42, 87); // error
       ^" in f3a{<inapplicable>}.(42, 87);
  };
  dynamic f3b = #C4;
  dynamic c3b = f3b{dynamic}.call(87);
  self::expect(87, c3b{dynamic}.field);
  self::throws(() → dynamic => f3b{dynamic}.call());
  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
  ([core::int?]) → self::Class4 f4a = #C5;
  self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
  self::expect(null, c4a.{self::Class4::field}{core::int?});
  self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
  self::expect(42, c4b.{self::Class4::field}{core::int?});
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:115:8: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
    f4a(42, 87); // error
       ^" in f4a{<inapplicable>}.(42, 87);
  };
  dynamic f4b = #C5;
  self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
  (core::int, [core::int?]) → self::Class5 f5a = #C6;
  self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
  self::expect(42, c5a.{self::Class5::field1}{core::int});
  self::expect(null, c5a.{self::Class5::field2}{core::int?});
  self::Class5 c5b = f5a(87, 42){(core::int, [core::int?]) → self::Class5};
  self::expect(87, c5b.{self::Class5::field1}{core::int});
  self::expect(42, c5b.{self::Class5::field2}{core::int?});
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:129:8: Error: Too few positional arguments: 1 required, 0 given.
    f5a(); // error
       ^" in f5a{<inapplicable>}.();
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:130:8: Error: Too many positional arguments: 2 allowed, but 3 found.
Try removing the extra positional arguments.
    f5a(42, 87, 123); // error
       ^" in f5a{<inapplicable>}.(42, 87, 123);
  };
  dynamic f5b = #C6;
  self::throws(() → dynamic => f5b{dynamic}.call());
  self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
  self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
  self::expect(42, c6a.{self::Class6::field1}{core::int});
  self::expect(null, c6a.{self::Class6::field2}{core::int?});
  self::expect(87, c6a.{self::Class6::field3}{core::int});
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:142:8: Error: Too few positional arguments: 1 required, 0 given.
    f6a(); // error
       ^" in f6a{<inapplicable>}.();
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:143:8: Error: Required named parameter 'field3' must be provided.
    f6a(42); // error
       ^" in f6a{<inapplicable>}.(42);
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:144:8: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
    f6a(42, 87); // error
       ^" in f6a{<inapplicable>}.(42, 87);
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:145:8: Error: Too few positional arguments: 1 required, 0 given.
    f6a(field1: 87, field2: 87); // error
       ^" in f6a{<inapplicable>}.(field1: 87, field2: 87);
  };
  self::Class6 c6b = f6a(42, field2: 123, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
  self::expect(42, c6b.{self::Class6::field1}{core::int});
  self::expect(123, c6b.{self::Class6::field2}{core::int?});
  self::expect(87, c6b.{self::Class6::field3}{core::int});
  self::Class6 c6c = f6a(87, field3: 42, field2: 123){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
  self::expect(87, c6c.{self::Class6::field1}{core::int});
  self::expect(123, c6c.{self::Class6::field2}{core::int?});
  self::expect(42, c6c.{self::Class6::field3}{core::int});
  dynamic f6b = #C7;
  self::throws(() → dynamic => f6b{dynamic}.call());
  self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
  self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
  self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
  () → self::Class7b f7a = #C8;
  self::Class7b c7a = f7a(){() → self::Class7b};
  self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
  self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C9;
  self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
  self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
  self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
  self::Class8b<core::int> c8b = f8a<core::int>(){() → self::Class8b<core::int>};
  self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
  self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
  self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
}
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 = #C10}) → 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 = null
  #C2 = redirecting-factory-tearoff self::Class1::•
  #C3 = redirecting-factory-tearoff self::Class2::named
  #C4 = redirecting-factory-tearoff self::Class3::•
  #C5 = redirecting-factory-tearoff self::Class4::•
  #C6 = redirecting-factory-tearoff self::Class5::•
  #C7 = redirecting-factory-tearoff self::Class6::•
  #C8 = redirecting-factory-tearoff self::Class7b::•
  #C9 = redirecting-factory-tearoff self::Class8b::•
  #C10 = false
}
