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