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;
  field self::B? member2 = null;
  constructor •(self::B member) → self::Base
    : self::Base::member = member, super core::Object::•()
    ;
}
class Test extends self::Base {
  constructor •(self::B member) → self::Test
    : super self::Base::•(member)
    ;
  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 {}
