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

class A extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → void
    : super self::A::•()
    ;
  operator +(self::C v) → self::A
    return null;
  operator -(core::int i) → self::B
    return null;
  operator *(self::B v) → self::B
    return null;
  operator &(self::A v) → self::C
    return null;
}
class C extends self::B {
  synthetic constructor •() → void
    : super self::B::•()
    ;
}
class Test extends core::Object {
  field self::B member = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  static method test(self::Test t) → void {
    t.member = self::f<dynamic>();
    let final dynamic #t1 = t in #t1.member.==(null) ? #t1.member = self::f<dynamic>() : null;
    let final dynamic #t2 = t in #t2.member = #t2.member.+(self::f<dynamic>());
    let final dynamic #t3 = t in #t3.member = #t3.member.*(self::f<dynamic>());
    let final dynamic #t4 = t in #t4.member = #t4.member.&(self::f<dynamic>());
    let final dynamic #t5 = t in #t5.member = #t5.member.-(1);
    let final dynamic #t6 = t in #t6.member = #t6.member.-(1);
    dynamic v1 = t.member = self::f<dynamic>();
    dynamic v2 = let final dynamic #t7 = t in let final dynamic #t8 = #t7.member in #t8.==(null) ? #t7.member = self::f<dynamic>() : #t8;
    dynamic v4 = let final dynamic #t9 = t in #t9.member = #t9.member.*(self::f<dynamic>());
    dynamic v5 = let final dynamic #t10 = t in #t10.member = #t10.member.&(self::f<dynamic>());
    dynamic v6 = let final dynamic #t11 = t in #t11.member = #t11.member.-(1);
    dynamic v7 = let final dynamic #t12 = t in let final dynamic #t13 = #t12.member in let final dynamic #t14 = #t12.member = #t13.-(1) in #t13;
  }
}
static method f<T extends core::Object = dynamic>() → self::f::T
  return null;
static method main() → dynamic {}
