library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue54553.dart:8:7: Error: Can't implement 'A?' because it's nullable.
// Try removing the question mark.
// class B implements A? {} // Error.
//       ^
//
// pkg/front_end/testcases/general/issue54553.dart:10:49: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
// extension type EIAliasNullable(A? _) implements F<A?> {} // Error.
//                                                 ^
// pkg/front_end/testcases/general/issue54553.dart:9:11: Context: This is the type variable ultimately denoted.
// typedef F<T> = T;
//           ^
//
// pkg/front_end/testcases/general/issue54553.dart:5:46: Error: Can't implement 'int?' because it's nullable.
// Try removing the question mark.
// extension type EINullable(int? _) implements int? {} // Error.
//                                              ^
//
// pkg/front_end/testcases/general/issue54553.dart:10:49: Error: The type 'F<A?>' which is an alias of 'A?' can't be implemented by an extension type because it is nullable.
//  - 'A' is from 'pkg/front_end/testcases/general/issue54553.dart'.
// extension type EIAliasNullable(A? _) implements F<A?> {} // Error.
//                                                 ^
// pkg/front_end/testcases/general/issue54553.dart:9:9: Context: The issue arises via this type alias.
// typedef F<T> = T;
//         ^
//
import self as self;
import "dart:core" as core;

typedef F<T extends core::Object? = dynamic> = T%;
class A extends core::Object {
  synthetic constructor •() → self::A
    ;
}
class B extends core::Object implements self::A {
  synthetic constructor •() → self::B
    ;
}
extension type EINullable(core::int? _) {
  abstract extension-type-member representation-field get _() → core::int?;
  constructor • = self::EINullable|constructor#;
  constructor tearoff • = self::EINullable|constructor#_#new#tearOff;
}
extension type EIAliasNullable(self::A? _) {
  abstract extension-type-member representation-field get _() → self::A?;
  constructor • = self::EIAliasNullable|constructor#;
  constructor tearoff • = self::EIAliasNullable|constructor#_#new#tearOff;
}
static extension-type-member method EINullable|constructor#(wildcard initializing-formal core::int? _#wc0#formal) → self::EINullable% /* erasure=core::int?, declared=! */
  ;
static extension-type-member synthetic method EINullable|constructor#_#new#tearOff(core::int? _#wc0#formal) → self::EINullable% /* erasure=core::int?, declared=! */
  return self::EINullable|constructor#(_#wc0#formal);
static extension-type-member method EIAliasNullable|constructor#(wildcard initializing-formal self::A? _#wc1#formal) → self::EIAliasNullable% /* erasure=self::A?, declared=! */
  ;
static extension-type-member synthetic method EIAliasNullable|constructor#_#new#tearOff(self::A? _#wc1#formal) → self::EIAliasNullable% /* erasure=self::A?, declared=! */
  return self::EIAliasNullable|constructor#(_#wc1#formal);
