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

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
}
class C<T extends self::A* = self::A*> extends core::Object {
  generic-covariant-impl field self::C::T* _field = null;
  synthetic constructor •() → self::C<self::C::T*>*
    : super core::Object::•()
    ;
  method foo(generic-covariant-impl self::C::T* x) → dynamic {
    this.{self::C::_field} = x;
  }
}
class D extends self::C<self::B*> {
  synthetic constructor •() → self::D*
    : super self::C::•()
    ;
}
abstract class _Foo&Object&C extends core::Object implements self::C<self::B*> /*isAnonymousMixin,isEliminatedMixin*/  {
  generic-covariant-impl field self::B* _field = null;
  synthetic constructor •() → self::_Foo&Object&C*
    : super core::Object::•()
    ;
  method foo(generic-covariant-impl self::B* x) → dynamic {
    this.{self::C::_field} = x;
  }
}
class Foo extends self::_Foo&Object&C {
  synthetic constructor •() → self::Foo*
    : super self::_Foo&Object&C::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → self::B*
    : super self::A::•()
    ;
}
static method main() → dynamic {
  self::Foo* foo = new self::Foo::•();
  foo.{self::C::foo}(new self::B::•());
}
