library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
//     f1a(''); // error
//         ^
//
// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
//     f2a(''); // error
//         ^
//
import self as self;
import "dart:core" as core;

class Class1 extends core::Object {
  field core::int field;
  constructor •(core::int field) → self::Class1
    : self::Class1::field = field, super core::Object::•()
    ;
}
abstract class Interface2 extends core::Object {
  synthetic constructor •() → self::Interface2
    : super core::Object::•()
    ;
  abstract get field() → core::int;
}
class Class2 extends core::Object implements self::Interface2 {
  final field core::int field;
  constructor •(core::int field) → self::Class2
    : self::Class2::field = field, super core::Object::•()
    ;
}
static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
static field (core::int) → self::Class1 Class1_new = #C1;
static field (core::int) → self::Class2 Class2_new = #C2;
static method main() → dynamic {
  core::print("inSoundMode: ${self::inSoundMode}");
  self::testInferred();
}
static method testInferred() → dynamic {
  (core::int) → self::Class1 f1a = #C1;
  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
  () → Null {
    f1a(let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
    f1a(''); // error
        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
  };
  dynamic f1b = #C1;
  dynamic c1b = f1b{dynamic}.call(0);
  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
  self::throws(() → dynamic => f1b{dynamic}.call(""));
  (core::int) → self::Class2 f2a = #C2;
  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
  () → Null {
    f2a(let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
    f2a(''); // error
        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
  };
  dynamic f2b = #C2;
  dynamic c2b = f2b{dynamic}.call(0);
  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
  self::throws(() → dynamic => f2b{dynamic}.call(""));
}
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 = #C3}) → 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 = constructor-tearoff self::Class1::•
  #C2 = constructor-tearoff self::Class2::•
  #C3 = false
}
