library test /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef F<contravariant 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-by-declaration core::int x) → void {}
}
class E extends self::D {
  synthetic constructor •() → self::E
    : super self::D::•()
    ;
  method f(covariant-by-declaration core::int x) → void {}
}
static method g1(self::C c) → void {
  c.{self::C::f}(1.5){(core::num) → void};
}
static method g2(self::C c) → (core::num) → dynamic {
  return c.{self::C::f}{(core::num) → void};
}
static method test() → dynamic {
  self::g1(new self::D::•());
  (core::num) → dynamic x = self::g2(new self::D::•());
}
static method main() → dynamic {}
