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 Base extends core::Object {
  field self::B member = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class Test extends self::Base {
  synthetic constructor •() → void
    : super self::Base::•()
    ;
  method test() → void {
    super.{self::Base::member} = self::f<dynamic>();
    super.{self::Base::member}.==(null) ? super.{self::Base::member} = self::f<dynamic>() : null;
    super.{self::Base::member} = super.{self::Base::member}.+(self::f<dynamic>());
    super.{self::Base::member} = super.{self::Base::member}.*(self::f<dynamic>());
    super.{self::Base::member} = super.{self::Base::member}.&(self::f<dynamic>());
    super.{self::Base::member} = super.{self::Base::member}.-(1);
    super.{self::Base::member} = super.{self::Base::member}.-(1);
    dynamic v1 = super.{self::Base::member} = self::f<dynamic>();
    dynamic v2 = let final dynamic #t1 = super.{self::Base::member} in #t1.==(null) ? super.{self::Base::member} = self::f<dynamic>() : #t1;
    dynamic v4 = super.{self::Base::member} = super.{self::Base::member}.*(self::f<dynamic>());
    dynamic v5 = super.{self::Base::member} = super.{self::Base::member}.&(self::f<dynamic>());
    dynamic v6 = super.{self::Base::member} = super.{self::Base::member}.-(1);
    dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
  }
}
static method f<T extends core::Object = dynamic>() → self::f::T
  return null;
static method main() → dynamic {}
