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