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

class D<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::D<self::D::T>
    : super core::Object::•()
    ;
}
class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
  synthetic constructor •() → self::E<self::E::T>
    : super self::D::•()
    ;
}
class B<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::T>
    : super core::Object::•()
    ;
  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
    return null;
}
class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
  synthetic constructor •() → self::C<self::C::U>
    : super self::B::•()
    ;
  operator [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
    return null;
  method h() → void {
    self::D<asy::Future<self::C::U>> x = super.{self::B::[]}(self::f<self::E<asy::Future<self::C::U>>>());
  }
}
static method f<T extends core::Object = dynamic>() → self::f::T
  return null;
static method main() → dynamic {}
