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

class A extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  operator +(core::int value) → self::C
    return null;
  operator *(self::D value) → self::C
    return null;
}
class B extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  operator +(core::int value) → self::E
    return null;
  operator *(self::F value) → self::E
    return null;
}
class C extends self::B {
  synthetic constructor •() → void
    : super self::B::•()
    ;
}
class D extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class E extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class F extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class G extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  get target() → self::A
    return null;
  set target(self::B value) → void {}
}
static method f<T extends core::Object = dynamic>() → self::f::T
  return null;
static method test1(self::G g) → void {
  let final dynamic #t1 = g in #t1.target = #t1.target.*(self::f<dynamic>());
  dynamic x = let final dynamic #t2 = g in #t2.target = #t2.target.*(self::f<dynamic>());
}
static method test2(self::G g) → void {
  let final dynamic #t3 = g in #t3.target = #t3.target.+(1);
  dynamic x = let final dynamic #t4 = g in #t4.target = #t4.target.+(1);
}
static method test3(self::G g) → void {
  let final dynamic #t5 = g in #t5.target = #t5.target.+(1);
  dynamic x = let final dynamic #t6 = g in let final dynamic #t7 = #t6.target in let final dynamic #t8 = #t6.target = #t7.+(1) in #t7;
}
static method main() → dynamic {}
