library test;
import self as self;
import "dart:core" as core;

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