library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:44:8: Error: Too few positional arguments: 1 required, 0 given.
//     f3a(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:45: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/lowering/from_dill/main.dart:62:8: Error: Expected 1 type arguments.
//     f4a<int, String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:70:8: Error: Expected 0 type arguments.
//     f4b<int>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:87:8: Error: Expected 1 type arguments.
//     f4d<int, String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:95:8: Error: Expected 0 type arguments.
//     f4e<int>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:112: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.
//     f5a<String>(); // error
//        ^
//
// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:113:8: Error: Expected 1 type arguments.
//     f5a<int, String>(); // error
//        ^
//
import self as self;
import "main_lib.dart" as mai;
import "dart:core" as core;

import "org-dartlang-testcase:///main_lib.dart";

static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
static method main() → dynamic {
  () → mai::Class1 f1a = #C1;
  mai::Class1 c1a = f1a(){() → mai::Class1};
  self::expect(true, c1a is{ForNonNullableByDefault} mai::Class1);
  dynamic f1b = #C1;
  dynamic c1b = f1b{dynamic}.call();
  self::expect(true, c1b is{ForNonNullableByDefault} mai::Class1);
  self::expect(true, core::identical(f1a, f1b));
  () → mai::Class2 f2a = #C2;
  mai::Class2 c2a = f2a(){() → mai::Class2};
  self::expect(true, c2a is{ForNonNullableByDefault} mai::Class2);
  dynamic f2b = #C2;
  dynamic c2b = f2b{dynamic}.call();
  self::expect(true, c2b is{ForNonNullableByDefault} mai::Class2);
  self::expect(true, core::identical(f2a, f2b));
  () → mai::Class2 f2c = #C3;
  mai::Class2 c2c = f2c(){() → mai::Class2};
  self::expect(true, c2c is{ForNonNullableByDefault} mai::Class2);
  dynamic f2d = #C3;
  dynamic c2d = f2d{dynamic}.call();
  self::expect(true, c2d is{ForNonNullableByDefault} mai::Class2);
  self::expect(true, core::identical(f2c, f2d));
  (core::int) → mai::Class3 f3a = #C4;
  mai::Class3 c3a = f3a(42){(core::int) → mai::Class3};
  self::expect(42, c3a.{mai::Class3::field}{core::int});
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:44:8: Error: Too few positional arguments: 1 required, 0 given.
    f3a(); // error
       ^" in f3a{<inapplicable>}.();
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:45: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));
  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4a = #C5;
  mai::Class4<dynamic> c4a = f4a<dynamic>(){() → mai::Class4<dynamic>};
  self::expect(true, c4a is{ForNonNullableByDefault} mai::Class4<dynamic>);
  self::expect(false, c4a is{ForNonNullableByDefault} mai::Class4<core::int>);
  mai::Class4<core::int> c4b = f4a<core::int>(){() → mai::Class4<core::int>};
  self::expect(true, c4b is{ForNonNullableByDefault} mai::Class4<core::int>);
  self::expect(false, c4b is{ForNonNullableByDefault} mai::Class4<core::String>);
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:62:8: Error: Expected 1 type arguments.
    f4a<int, String>(); // error
       ^" in f4a{<inapplicable>}.<core::int, core::String>();
  };
  () → mai::Class4<core::int> f4b = f4a<core::int>;
  mai::Class4<core::int> c4c = f4b(){() → mai::Class4<core::int>};
  self::expect(true, c4c is{ForNonNullableByDefault} mai::Class4<core::int>);
  self::expect(false, c4c is{ForNonNullableByDefault} mai::Class4<core::String>);
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:70:8: Error: Expected 0 type arguments.
    f4b<int>(); // error
       ^" in f4b{<inapplicable>}.<core::int>();
  };
  dynamic f4c = #C5;
  dynamic c4d = f4c{dynamic}.call();
  self::expect(true, c4d is{ForNonNullableByDefault} mai::Class4<dynamic>);
  self::expect(false, c4d is{ForNonNullableByDefault} mai::Class4<core::int>);
  self::throws(() → dynamic => f4c{dynamic}.call<core::int, core::String>());
  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4d = #C6;
  mai::Class4<dynamic> c4e = f4d<dynamic>(){() → mai::Class4<dynamic>};
  self::expect(true, c4e is{ForNonNullableByDefault} mai::Class4<dynamic>);
  self::expect(false, c4e is{ForNonNullableByDefault} mai::Class4<core::int>);
  mai::Class4<core::int> c4f = f4d<core::int>(){() → mai::Class4<core::int>};
  self::expect(true, c4f is{ForNonNullableByDefault} mai::Class4<core::int>);
  self::expect(false, c4f is{ForNonNullableByDefault} mai::Class4<core::String>);
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:87:8: Error: Expected 1 type arguments.
    f4d<int, String>(); // error
       ^" in f4d{<inapplicable>}.<core::int, core::String>();
  };
  () → mai::Class4<core::int> f4e = f4d<core::int>;
  mai::Class4<core::int> c4g = f4e(){() → mai::Class4<core::int>};
  self::expect(true, c4g is{ForNonNullableByDefault} mai::Class4<core::int>);
  self::expect(false, c4g is{ForNonNullableByDefault} mai::Class4<core::String>);
  () → Null {
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:95:8: Error: Expected 0 type arguments.
    f4e<int>(); // error
       ^" in f4e{<inapplicable>}.<core::int>();
  };
  dynamic f4f = #C6;
  dynamic c4h = f4f{dynamic}.call();
  self::expect(true, c4h is{ForNonNullableByDefault} mai::Class4<dynamic>);
  self::expect(false, c4h is{ForNonNullableByDefault} mai::Class4<core::int>);
  self::throws(() → dynamic => f4f{dynamic}.call<core::int, core::String>());
  <T extends core::num>() → mai::Class5<T> f5a = #C7;
  mai::Class5<core::num> c5a = f5a<core::num>(){() → mai::Class5<core::num>};
  self::expect(true, c5a is{ForNonNullableByDefault} mai::Class5<core::num>);
  self::expect(false, c5a is{ForNonNullableByDefault} mai::Class5<core::int>);
  mai::Class5<core::int> c5b = f5a<core::int>(){() → mai::Class5<core::int>};
  self::expect(true, c5b is{ForNonNullableByDefault} mai::Class5<core::int>);
  self::expect(false, c5b is{ForNonNullableByDefault} mai::Class5<core::double>);
  () → Null {
    f5a<core::String>(){() → mai::Class5<core::String>};
    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:113:8: Error: Expected 1 type arguments.
    f5a<int, String>(); // error
       ^" in f5a{<inapplicable>}.<core::int, core::String>();
  };
  dynamic f5b = #C7;
  dynamic c5c = f5b{dynamic}.call();
  self::expect(true, c5c is{ForNonNullableByDefault} mai::Class5<core::num>);
  self::expect(false, c5c is{ForNonNullableByDefault} mai::Class5<core::int>);
  dynamic c5d = f5b{dynamic}.call<core::int>();
  self::expect(true, c5d is{ForNonNullableByDefault} mai::Class5<core::int>);
  self::expect(false, c5d is{ForNonNullableByDefault} mai::Class5<core::double>);
  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
  self::throws(() → dynamic => f5b{dynamic}.call<core::int, 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 = #C8}) → 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";
}

library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;

class Class1 extends core::Object {
  synthetic constructor •() → mai::Class1
    : super core::Object::•()
    ;
  static method _#new#tearOff() → mai::Class1
    return new mai::Class1::•();
}
class Class2 extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[mai::Class2::redirect]/*isLegacy*/;
  constructor named() → mai::Class2
    : super core::Object::•()
    ;
  static method _#named#tearOff() → mai::Class2
    return new mai::Class2::named();
  static factory redirect() → mai::Class2
    let Never #redirecting_factory = mai::Class2::named in invalid-expression;
  static method _#redirect#tearOff() → mai::Class2
    return new mai::Class2::named();
}
class Class3 extends core::Object {
  final field core::int field;
  constructor •(core::int field) → mai::Class3
    : mai::Class3::field = field, super core::Object::•()
    ;
  static method _#new#tearOff(core::int field) → mai::Class3
    return new mai::Class3::•(field);
}
class Class4<T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[mai::Class4::redirect]/*isLegacy*/;
  constructor _() → mai::Class4<mai::Class4::T%>
    : super core::Object::•()
    ;
  static method _#_#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#_#tearOff::T%>
    return new mai::Class4::_<mai::Class4::_#_#tearOff::T%>();
  static factory •<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::•::T%>
    return new mai::Class4::_<mai::Class4::•::T%>();
  static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
    return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
  static factory redirect<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::redirect::T%>
    let Never #redirecting_factory = mai::Class4::_ in let mai::Class4::redirect::T% #typeArg0 = null in invalid-expression;
  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#redirect#tearOff::T%>
    return new mai::Class4::_<mai::Class4::_#redirect#tearOff::T%>();
}
class Class5<T extends core::num> extends core::Object {
  constructor _() → mai::Class5<mai::Class5::T>
    : super core::Object::•()
    ;
  static method _#_#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#_#tearOff::T>
    return new mai::Class5::_<mai::Class5::_#_#tearOff::T>();
  static factory •<T extends core::num>() → mai::Class5<mai::Class5::•::T>
    return new mai::Class5::_<mai::Class5::•::T>();
  static method _#new#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#new#tearOff::T>
    return mai::Class5::•<mai::Class5::_#new#tearOff::T>();
}

constants  {
  #C1 = static-tearoff mai::Class1::_#new#tearOff
  #C2 = static-tearoff mai::Class2::_#named#tearOff
  #C3 = static-tearoff mai::Class2::_#redirect#tearOff
  #C4 = static-tearoff mai::Class3::_#new#tearOff
  #C5 = static-tearoff mai::Class4::_#new#tearOff
  #C6 = static-tearoff mai::Class4::_#redirect#tearOff
  #C7 = static-tearoff mai::Class5::_#new#tearOff
  #C8 = false
}
