library test /*isNonNullableByDefault*/;
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 Test extends core::Object {
  field self::B member;
  field self::B? member2;
  constructor •(self::B member) → self::Test
    ;
  static method test(self::Test t) → void
    ;
}
static method f<T extends core::Object? = dynamic>() → self::f::T%
  ;
static method main() → dynamic
  ;
