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

class A extends core::Object {
  synthetic constructor •() → self::A
    ;
}
class B extends self::A {
  synthetic constructor •() → self::B
    ;
  operator +(self::C v) → self::B
    ;
  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 •() → self::C
    ;
}
class Base extends core::Object {
  field self::B member;
  field self::B? member2;
  constructor •(self::B member) → self::Base
    ;
}
class Test extends self::Base {
  constructor •(self::B member) → self::Test
    ;
  method test() → void
    ;
}
static method f<T extends core::Object? = dynamic>() → self::f::T%
  ;
static method main() → dynamic
  ;
