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