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 Test extends core::Object {
  field self::B member = throw "";
  field self::B? member2 = null;
  synthetic constructor •() → self::Test
    : super core::Object::•()
    ;
  method test() → void {
    this.{self::Test::member} = self::f<self::B>();
    this.{self::Test::member2}{self::B?} == null ?{self::B?} this.{self::Test::member2} = self::f<self::B?>() : null;
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    self::B v1 = this.{self::Test::member} = self::f<self::B>();
    self::B? v2 = let final self::B? #t1 = this.{self::Test::member2}{self::B?} in #t1 == null ?{self::B?} this.{self::Test::member2} = self::f<self::B?>() : #t1{self::B};
    self::B v3 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B};
    self::B v4 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B};
    self::C v5 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C};
    self::B v6 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    self::B v7 = let final self::B #t2 = this.{self::Test::member}{self::B} in let final self::B #t3 = this.{self::Test::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 {}
