library test;
import self as self;
import "dart:core" as core;

class B<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::T*>*
    : super core::Object::•()
    ;
  method f(generic-covariant-impl self::B::T* x) → void {}
  method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void {}
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class C extends self::B<core::int*> {
  synthetic constructor •() → self::C*
    : super self::B::•()
    ;
}
static method g1(self::B<core::num*>* b) → void {
  b.{self::B::f}(1.5);
}
static method g2(self::C* c) → void {
  c.{self::B::f}(1);
}
static method test() → void {
  self::g1(new self::C::•());
}
static method main() → void {}

constants  {
  #C1 = null
}
