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(self::C::T x) → void {}
  method g1(self::C::T x) → void {
    this.{self::C::f}(x);
  }
  method g2(self::C::T x) → void {
    this.{self::C::f}(x);
  }
  method g3(self::C<self::C::T> c, 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 •() → void
    : super self::C::•()
    ;
}
class E extends self::C<core::num> {
  synthetic constructor •() → void
    : super self::C::•()
    ;
  method f(covariant 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 {}
