library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:32:18: Error: Constant evaluation error:
// test4() => const StaticIdentityTest(A4.new, B4.new); // Error.
//                  ^
// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:26:43: Context: This assertion failed.
//   const StaticIdentityTest(a, b) : assert(identical(a, b));
//                                           ^
//
// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:33:18: Error: Constant evaluation error:
// test5() => const StaticIdentityTest(A5.new, B5.new); // Error.
//                  ^
// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:26:43: Context: This assertion failed.
//   const StaticIdentityTest(a, b) : assert(identical(a, b));
//                                           ^
//
import self as self;
import "dart:core" as core;

typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
typedef B2<T extends core::num> = self::A2<T>;
typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
typedef B4<T extends core::int> = self::A4<T>;
typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
class A1<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::A1<self::A1::T%>
    : super core::Object::•()
    ;
}
class A2<T extends core::num> extends core::Object {
  synthetic constructor •() → self::A2<self::A2::T>
    : super core::Object::•()
    ;
}
class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
    : super core::Object::•()
    ;
}
class A4<T extends core::num> extends core::Object {
  synthetic constructor •() → self::A4<self::A4::T>
    : super core::Object::•()
    ;
}
class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
    : super core::Object::•()
    ;
}
class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
    : assert(core::identical(a, b)), super core::Object::•()
    ;
}
static method test1() → dynamic
  return #C1;
static method test2() → dynamic
  return #C1;
static method test3() → dynamic
  return #C1;
static method test4() → dynamic
  return invalid-expression "This assertion failed.";
static method test5() → dynamic
  return invalid-expression "This assertion failed.";
static method main() → dynamic {}
static method _#B4#new#tearOff<T extends core::int>() → self::A4<self::_#B4#new#tearOff::T>
  return new self::A4::•<self::_#B4#new#tearOff::T>();
static method _#B5#new#tearOff<unrelated T extends core::List<core::Object?>, unrelated S extends Null>() → self::A5<core::List<dynamic>, Never?>
  return new self::A5::•<core::List<dynamic>, Never?>();

constants  {
  #C1 = self::StaticIdentityTest {}
}


Constructor coverage from constants:
org-dartlang-testcase:///simple_proper_rename_identity.dart:
- StaticIdentityTest. (from org-dartlang-testcase:///simple_proper_rename_identity.dart:26:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
