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

class B extends core::Object {
  field core::Object? _x = null;
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  method f([core::num x = #C1]) → void {
    this.{self::B::_x} = x;
  }
  method g({core::num x = #C2}) → void {
    this.{self::B::_x} = x;
  }
  method check(core::Object expectedValue) → void {
    if(!(this.{self::B::_x}{core::Object?} =={core::Object::==}{(core::Object) → core::bool} expectedValue)) {
      throw "Expected _x == ${expectedValue}; got ${this.{self::B::_x}{core::Object?}}";
    }
  }
}
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 = #C3]) → void;
  abstract method g({covariant-by-class self::I::T% x = #C3}) → void;
}
class C extends self::B implements self::I<core::num> {
  synthetic constructor •() → self::C
    : super self::B::•()
    ;
  forwarding-stub method f([covariant-by-class core::num x = #C1]) → void
    return super.{self::B::f}(x);
  forwarding-stub method g({covariant-by-class core::num x = #C2}) → void
    return super.{self::B::g}(x: x);
}
static method main() → dynamic {
  self::C c = new self::C::•();
  c.{self::C::f}(){([core::num]) → void};
  c.{self::B::check}(10){(core::Object) → void};
  c.{self::C::g}(){({x: core::num}) → void};
  c.{self::B::check}(20){(core::Object) → void};
}

constants  {
  #C1 = 10
  #C2 = 20
  #C3 = null
}
