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

class A extends core::Object {
  field core::int boz;
  synthetic constructor •() → self::A
    ;
  method foo(core::int n) → core::num
    ;
  method bar({required core::int x = null}) → core::num
    ;
  set baz(core::int x) → void
    ;
}
abstract class B<X extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::X%>
    ;
  abstract method foo(covariant-by-class self::B::X% x) → self::B::X%;
  abstract method bar({required covariant-by-class self::B::X% x = null}) → self::B::X%;
  abstract set baz(covariant-by-class self::B::X% x) → void;
  abstract set boz(covariant-by-class self::B::X% x) → void;
}
abstract class _C&A&B = self::A with self::B<core::num> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_C&A&B
    : super self::A::•()
    ;
  forwarding-stub set boz(covariant-by-class core::num x) → void
    return super.{self::A::boz} = x as core::int;
  forwarding-stub method foo(covariant-by-class core::num x) → core::num
    return super.{self::A::foo}(x as core::int);
  forwarding-stub method bar({required covariant-by-class core::num x}) → core::num
    return super.{self::A::bar}(x: x as core::int);
  forwarding-stub set baz(covariant-by-class core::num x) → void
    return super.{self::A::baz} = x as core::int;
}
class C extends self::_C&A&B {
  synthetic constructor •() → self::C
    ;
}
static method main() → void
  ;
static method throws(() → void f) → dynamic
  ;
