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

class A extends core::Object {
  synthetic constructor •() → self::A*
    ;
  operator +(core::int* value) → self::C*
    ;
  operator *(self::D* value) → self::C*
    ;
}
class B extends core::Object {
  synthetic constructor •() → self::B*
    ;
  operator +(core::int* value) → self::E*
    ;
  operator *(self::F* value) → self::E*
    ;
}
class C extends self::B {
  synthetic constructor •() → self::C*
    ;
}
class D extends core::Object {
  synthetic constructor •() → self::D*
    ;
}
class E extends core::Object {
  synthetic constructor •() → self::E*
    ;
}
class F extends core::Object {
  synthetic constructor •() → self::F*
    ;
}
class G extends core::Object {
  synthetic constructor •() → self::G*
    ;
  get target() → self::A*
    ;
  set target(self::B* value) → void
    ;
}
static method f<T extends core::Object* = dynamic>() → self::f::T*
  ;
static method test1(self::G* g) → void
  ;
static method test2(self::G* g) → void
  ;
static method test3(self::G* g) → void
  ;
static method main() → dynamic
  ;
