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

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