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

class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  method f(core::int x) → void {}
}
abstract class I<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::T%>
    : super core::Object::•()
    ;
  abstract method f(covariant-by-class self::I::T% x) → void;
}
class M extends core::Object {
  synthetic constructor •() → self::M
    : super core::Object::•()
    ;
}
class C extends self::B implements self::I<core::int>, self::M /*isEliminatedMixin*/  {
  synthetic constructor •() → self::C
    : super self::B::•()
    ;
  forwarding-stub method f(covariant-by-class core::int x) → void
    return super.{self::B::f}(x);
}
static method g1(self::C c) → void {
  c.{self::C::f}(1){(core::int) → void};
}
static method g2(self::I<core::num> i) → void {
  i.{self::I::f}(1.5){(core::num) → void};
}
static method test() → void {
  self::g2(new self::C::•());
}
static method main() → void {}
