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

class B extends core::Object {
  synthetic constructor •() → self::B*
    ;
  get x() → core::int*
    ;
  set x(core::int* value) → void
    ;
  get y() → core::int*
    ;
  set y(core::int* value) → void
    ;
}
abstract class I<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::T*>*
    ;
  abstract get x() → self::I::T*;
  abstract set x(generic-covariant-impl self::I::T* value) → void;
  abstract get y() → core::Object*;
  abstract set y(covariant core::Object* value) → void;
}
class M extends core::Object {
  synthetic constructor •() → self::M*
    ;
  get x() → core::int*
    ;
  set x(core::int* value) → void
    ;
  get y() → core::int*
    ;
  set y(core::int* value) → void
    ;
}
class C = self::B with self::M implements self::I<core::int*> {
  synthetic constructor •() → self::C*
    : super self::B::•()
    ;
  forwarding-stub set y(covariant core::Object* value) → void
    return super.{self::B::y} = value;
  forwarding-stub set x(generic-covariant-impl core::int* value) → void
    return super.{self::B::x} = value;
}
static method expectTypeError(() →* void callback) → void
  ;
static method expect(core::Object* value, core::Object* expected) → void
  ;
static method test(self::I<core::Object*>* i) → void
  ;
static method main() → void
  ;
