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

abstract class I<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::T%>
    : super core::Object::•()
    ;
  abstract method f1(covariant-by-class self::I::T% x) → void;
  abstract method f2(covariant-by-class self::I::T% x) → void;
}
class C<U extends core::Object? = dynamic> extends core::Object implements self::I<core::int> {
  synthetic constructor •() → self::C<self::C::U%>
    : super core::Object::•()
    ;
  method f1(covariant-by-class core::int x) → void {}
  method f2(covariant-by-class core::int x, [covariant-by-class self::C::U? y = #C1]) → void {}
}
class D<U extends core::Object? = dynamic> extends self::C<self::D::U%> {
  synthetic constructor •() → self::D<self::D::U%>
    : super self::C::•()
    ;
  method f1(covariant-by-class core::int x) → void {}
  method f2(covariant-by-class core::int x, [covariant-by-class self::D::U? y = #C1]) → void {}
}
static method g1(self::C<core::num> c) → void {
  c.{self::C::f1}(1){(core::int) → void};
}
static method g2(self::I<core::num> i) → void {
  i.{self::I::f1}(1.5){(core::num) → void};
}
static method g3(self::C<core::num> c) → void {
  c.{self::C::f2}(1, 1.5){(core::int, [core::num?]) → void};
}
static method g4(self::D<core::num> d) → void {
  d.{self::D::f1}(1){(core::int) → void};
}
static method g5(self::D<core::num> d) → void {
  d.{self::D::f2}(1, 1.5){(core::int, [core::num?]) → void};
}
static method test() → void {
  self::g2(new self::C::•<core::num>());
}
static method main() → void {}

constants  {
  #C1 = null
}
