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

typedef F<contravariant 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(covariant-by-class self::C::T% x) → void {}
  method g1(covariant-by-class self::C::T% x) → void {
    this.{self::C::f}(x){(self::C::T%) → void};
  }
  method g2(covariant-by-class self::C::T% x) → void {
    this.{self::C::f}(x){(self::C::T%) → void};
  }
  method g3(covariant-by-class self::C<self::C::T%> c, covariant-by-class self::C::T% x) → void {
    c.{self::C::f}(x){(self::C::T%) → void};
  }
  method g4() → (self::C::T%) → dynamic
    return this.{self::C::f}{(self::C::T%) → void};
}
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-by-declaration covariant-by-class core::int x) → void {}
}
static method test() → dynamic {
  (core::Object) → dynamic x = (new self::D::•().{self::C::g4}(){() → (core::int) → dynamic} as{TypeError,CovarianceCheck,ForNonNullableByDefault} (core::int) → dynamic) as{ForNonNullableByDefault} (core::Object) → dynamic;
  x("hi"){(core::Object) → dynamic};
  new self::E::•().{self::C::g1}(1.5){(core::num) → void};
}
static method main() → dynamic {}
