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 {}

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)
