library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/supertype_conflict.dart:9:16: Error: 'C' is a supertype of itself.
// extension type C<T>(A<T> it) implements C<T> {}
//                ^
//
// pkg/front_end/testcases/extension_types/supertype_conflict.dart:13:16: Error: 'E' is a supertype of itself.
// extension type E(A<Never> it) implements B<int>, C<String> {}
//                ^
//
// pkg/front_end/testcases/extension_types/supertype_conflict.dart:11:16: Error: 'D' can't implement both 'A<int>' and 'A<String>'
//  - 'A' is from 'pkg/front_end/testcases/extension_types/supertype_conflict.dart'.
// extension type D(A<Never> it) implements A<int>, B<String> {}
//                ^
//
import self as self;
import "dart:core" as core;

class A<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::A<self::A::T%>
    : super core::Object::•()
    ;
}
extension type B<T extends core::Object? = dynamic>(self::A<T%> it) implements self::A<T%> {
  abstract extension-type-member representation-field get it() → self::A<T%>;
  constructor • = self::B|constructor#;
  constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C<T extends core::Object? = dynamic>(self::A<T%> it) {
  abstract extension-type-member representation-field get it() → self::A<T%>;
  constructor • = self::C|constructor#;
  constructor tearoff • = self::C|constructor#_#new#tearOff;
}
extension type D(self::A<Never> it) implements self::A<core::int>, self::B<core::String> /* erasure=self::A<core::String> */ {
  abstract extension-type-member representation-field get it() → self::A<Never>;
  constructor • = self::D|constructor#;
  constructor tearoff • = self::D|constructor#_#new#tearOff;
}
extension type E(self::A<Never> it) {
  abstract extension-type-member representation-field get it() → self::A<Never>;
  constructor • = self::E|constructor#;
  constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static extension-type-member method B|constructor#<T extends core::Object? = dynamic>(self::A<self::B|constructor#::T%> it) → self::B<self::B|constructor#::T%> /* erasure=self::A<self::B|constructor#::T%> */ {
  lowered final self::B<self::B|constructor#::T%> /* erasure=self::A<self::B|constructor#::T%> */ #this = it;
  return #this;
}
static extension-type-member method B|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::A<self::B|constructor#_#new#tearOff::T%> it) → self::B<self::B|constructor#_#new#tearOff::T%> /* erasure=self::A<self::B|constructor#_#new#tearOff::T%> */
  return self::B|constructor#<self::B|constructor#_#new#tearOff::T%>(it);
static extension-type-member method C|constructor#<T extends core::Object? = dynamic>(self::A<self::C|constructor#::T%> it) → self::C<self::C|constructor#::T%>% /* erasure=self::A<self::C|constructor#::T%>, declared=! */ {
  lowered final self::C<self::C|constructor#::T%>% /* erasure=self::A<self::C|constructor#::T%>, declared=! */ #this = it;
  return #this;
}
static extension-type-member method C|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::A<self::C|constructor#_#new#tearOff::T%> it) → self::C<self::C|constructor#_#new#tearOff::T%>% /* erasure=self::A<self::C|constructor#_#new#tearOff::T%>, declared=! */
  return self::C|constructor#<self::C|constructor#_#new#tearOff::T%>(it);
static extension-type-member method D|constructor#(self::A<Never> it) → self::D /* erasure=self::A<Never> */ {
  lowered final self::D /* erasure=self::A<Never> */ #this = it;
  return #this;
}
static extension-type-member method D|constructor#_#new#tearOff(self::A<Never> it) → self::D /* erasure=self::A<Never> */
  return self::D|constructor#(it);
static extension-type-member method E|constructor#(self::A<Never> it) → self::E% /* erasure=self::A<Never>, declared=! */ {
  lowered final self::E% /* erasure=self::A<Never>, declared=! */ #this = it;
  return #this;
}
static extension-type-member method E|constructor#_#new#tearOff(self::A<Never> it) → self::E% /* erasure=self::A<Never>, declared=! */
  return self::E|constructor#(it);
