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

typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
class C extends core::Object {
  synthetic constructor •() → self::C*
    : super core::Object::•()
    ;
  method f(core::num* x) → void {}
}
class D extends self::C {
  synthetic constructor •() → self::D*
    : super self::C::•()
    ;
  method f(covariant core::int* x) → void {}
}
class E extends self::D {
  synthetic constructor •() → self::E*
    : super self::D::•()
    ;
  method f(covariant core::int* x) → void {}
}
static method g1(self::C* c) → void {
  c.{self::C::f}(1.5);
}
static method g2(self::C* c) → (core::num*) →* dynamic {
  return c.{self::C::f};
}
static method test() → dynamic {
  self::g1(new self::D::•());
  (core::num*) →* dynamic x = self::g2(new self::D::•());
}
static method main() → dynamic {}
