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

class A extends core::Object {
  synthetic constructor •() → void
    ;
}
class B extends self::A {
  synthetic constructor •() → void
    ;
  operator +(self::C v) → self::A
    ;
  operator -(core::int i) → self::B
    ;
  operator *(self::B v) → self::B
    ;
  operator &(self::A v) → self::C
    ;
}
class C extends self::B {
  synthetic constructor •() → void
    ;
}
class Test extends core::Object {
  field self::B member;
  synthetic constructor •() → void
    ;
  static method test(self::Test t) → void
    ;
}
static method f<T extends core::Object = dynamic>() → self::f::T
  ;
static method main() → dynamic
  ;
