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 {
  field core::int x;
  field core::int y;
  synthetic constructor •() → self::M
    ;
}
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 _) → void
    return super.{self::B::x} = _;
}
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
  ;
