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
  ;
