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>() → 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 {}
