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

typedef F<T extends core::Object = dynamic> = (T) → void;
class B extends core::Object {
  synthetic constructor •() → void
    ;
  get x() → (core::int) → void
    ;
  set x(core::Object value) → void
    ;
}
abstract class I<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → void
    ;
  abstract get x() → (self::I::T) → void;
  abstract set x(core::Object value) → void;
}
abstract class M<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → void
    ;
  get x() → self::M::T
    ;
  set x(core::Object value) → void
    ;
  abstract method f() → self::M::T;
}
abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
  synthetic constructor •() → void
    : super self::B::•()
    ;
}
class D extends self::C<core::int> {
  synthetic constructor •() → void
    ;
  method f() → (core::int) → void
    ;
}
static method expectTypeError(() → void callback) → void
  ;
static method expect(core::Object value, core::Object expected) → void
  ;
static method test(self::I<core::Object> iObj, self::I<core::int> iInt) → void
  ;
static method main() → void
  ;
