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

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