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

typedef F<T extends core::Object = dynamic> = (T) → dynamic;
class C<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T>
    : super core::Object::•()
    ;
  method f(generic-covariant-impl self::C::T x) → void {}
  method g1(generic-covariant-impl self::C::T x) → void {
    this.{self::C::f}(x);
  }
  method g2(generic-covariant-impl self::C::T x) → void {
    this.{self::C::f}(x);
  }
  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
    c.f(x);
  }
  method g4() → (self::C::T) → dynamic
    return this.{self::C::f};
}
class D extends self::C<core::int> {
  synthetic constructor •() → self::D
    : super self::C::•()
    ;
}
class E extends self::C<core::num> {
  synthetic constructor •() → self::E
    : super self::C::•()
    ;
  method f(covariant generic-covariant-impl core::int x) → void {}
}
static method test() → dynamic {
  dynamic x = new self::D::•().g4() as (core::Object) → dynamic;
  x.call("hi");
  new self::E::•().g1(1.5);
}
static method main() → dynamic {}
