library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/external.dart:42:29: Error: Inferred type argument 'int' doesn't conform to the bound 'B' of the type variable 'T' on 'T Function<T extends B>(T)'.
// Try specifying type arguments explicitly so that they conform to the bounds.
//   int Function(int) f3 = b2.genericMethod;
//                             ^
//
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
extension type B(self::A a) {
  abstract extension-type-member representation-field get a() → self::A;
  get field = self::B|get#field;
  set field = self::B|set#field;
  method method = self::B|method;
  method tearoff method = self::B|get#method;
  method genericMethod = self::B|genericMethod;
  method tearoff genericMethod = self::B|get#genericMethod;
  get getter = self::B|get#getter;
  static get staticField = get self::B|staticField;
  static set staticField = set self::B|staticField;
  static method staticMethod = self::B|staticMethod;
  static method staticGenericMethod = self::B|staticGenericMethod;
  static get staticGetter = get self::B|staticGetter;
  set setter = self::B|set#setter;
  static set staticSetter = set self::B|staticSetter;
  constructor _ = self::B|constructor#_;
  constructor tearoff _ = self::B|constructor#_#_#tearOff;
  constructor • = self::B|constructor#;
  constructor tearoff • = self::B|constructor#_#new#tearOff;
  constructor named = self::B|constructor#named;
  constructor tearoff named = self::B|constructor#_#named#tearOff;
}
static extension-type-member method B|constructor#_(self::A a) → self::B% /* erasure=self::A, declared=! */ {
  lowered final self::B% /* erasure=self::A, declared=! */ #this = a;
  return #this;
}
static extension-type-member method B|constructor#_#_#tearOff(self::A a) → self::B% /* erasure=self::A, declared=! */
  return self::B|constructor#_(a);
external static extension-type-member method B|constructor#(self::A a) → self::B% /* erasure=self::A, declared=! */;
static extension-type-member method B|constructor#_#new#tearOff(self::A a) → self::B% /* erasure=self::A, declared=! */
  return self::B|constructor#(a);
external static extension-type-member method B|constructor#named(core::int i) → self::B% /* erasure=self::A, declared=! */;
static extension-type-member method B|constructor#_#named#tearOff(core::int i) → self::B% /* erasure=self::A, declared=! */
  return self::B|constructor#named(i);
external static extension-type-member method B|get#field(lowered self::A #this) → self::A;
external static extension-type-member method B|set#field(lowered self::A #this, synthesized self::A #externalFieldValue) → void;
external static extension-type-member method B|method(lowered final self::B% /* erasure=self::A, declared=! */ #this) → self::A;
static extension-type-member method B|get#method(lowered final self::B% /* erasure=self::A, declared=! */ #this) → () → self::A
  return () → self::A => self::B|method(#this);
external static extension-type-member method B|genericMethod<T extends self::B% /* erasure=self::A, declared=! */>(lowered final self::B% /* erasure=self::A, declared=! */ #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
static extension-type-member method B|get#genericMethod(lowered final self::B% /* erasure=self::A, declared=! */ #this) → <T extends self::B% /* erasure=self::A, declared=! */>(T%) → T%
  return <T extends self::B% /* erasure=self::A, declared=! */>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
external static extension-type-member method B|get#getter(lowered final self::B% /* erasure=self::A, declared=! */ #this) → self::B% /* erasure=self::A, declared=! */;
external static extension-type-member method B|set#setter(lowered final self::B% /* erasure=self::A, declared=! */ #this, self::B% /* erasure=self::A, declared=! */ b) → void;
external static extension-type-member get B|staticField() → self::A;
external static extension-type-member set B|staticField(synthesized self::A #externalFieldValue) → void;
external static extension-type-member method B|staticMethod() → self::A;
external static extension-type-member method B|staticGenericMethod<T extends core::Object? = dynamic>(self::B|staticGenericMethod::T% t) → self::B|staticGenericMethod::T%;
external static extension-type-member get B|staticGetter() → self::B% /* erasure=self::A, declared=! */;
external static extension-type-member set B|staticSetter(self::B% /* erasure=self::A, declared=! */ b) → void;
static method method(self::A a) → void {
  self::B% /* erasure=self::A, declared=! */ b1 = self::B|constructor#(a);
  self::B% /* erasure=self::A, declared=! */ b2 = self::B|constructor#named(0);
  a = self::B|get#field(b1);
  self::B|set#field(b1, a);
  a = self::B|method(b1);
  () → self::A f1 = self::B|get#method(b1);
  b2 = self::B|genericMethod<self::B% /* erasure=self::A, declared=! */>(b2, b2);
  <T extends self::B% /* erasure=self::A, declared=! */>(T%) → T% f2 = self::B|get#genericMethod(b2);
  (core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
  b1 = self::B|get#getter(b2);
  self::B|set#setter(b1, b2);
  a = self::B|staticField;
  self::B|staticField = a;
  a = self::B|staticMethod();
  () → self::A f4 = #C1;
  b2 = self::B|staticGenericMethod<self::B% /* erasure=self::A, declared=! */>(b2);
  <T extends core::Object? = dynamic>(T%) → T% f5 = #C2;
  (core::String) → core::String f6 = #C3;
  b1 = self::B|staticGetter;
  self::B|staticSetter = b2;
}

constants  {
  #C1 = static-tearoff self::B|staticMethod
  #C2 = static-tearoff self::B|staticGenericMethod
  #C3 = instantiation #C2 <core::String>
}
