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

import "dart:async";

class B<Y extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::Y%>
    : super core::Object::•()
    ;
  method bar(generic-covariant-impl FutureOr<self::B::Y%>y) → dynamic {}
}
class A<X extends core::Object? = dynamic> extends core::Object {
  generic-covariant-impl final field self::B<self::A::X%> b = new self::B::•<self::A::X%>();
  synthetic constructor •() → self::A<self::A::X%>
    : super core::Object::•()
    ;
  method foo([generic-covariant-impl FutureOr<self::A::X%>? x = #C1]) → dynamic {
    if(x is{ForNonNullableByDefault} asy::Future<self::A::X%>) {
      this.{self::A::b}.{self::B::bar}(x{asy::Future<self::A::X%>} as{ForNonNullableByDefault} FutureOr<self::A::X%>);
    }
  }
}
class C<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  method baz<generic-covariant-impl X extends FutureOr<self::C::T%> = FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
    return x;
}
class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
  synthetic constructor •() → self::D<self::D::T%>
    : super self::C::•()
    ;
  method baz<generic-covariant-impl X extends FutureOr<self::D::T%> = FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
    return x;
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
