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;
  field self::B? member2 = null;
  constructor •(self::B member) → self::Test
    : self::Test::member = member, super core::Object::•()
    ;
  static method test(self::Test t) → void {
    t.{self::Test::member} = self::f<self::B>();
    let final self::Test #t1 = t in #t1.{self::Test::member2}{self::B?} == null ?{self::B?} #t1.{self::Test::member2} = self::f<self::B?>() : null;
    let final self::Test #t2 = t in #t2.{self::Test::member} = #t2.{self::Test::member}{self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B};
    let final self::Test #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}{self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B};
    let final self::Test #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}{self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C};
    let final self::Test #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    let final self::Test #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    self::B v1 = t.{self::Test::member} = self::f<self::B>();
    self::B? v2 = let final self::Test #t7 = t in let final self::B? #t8 = #t7.{self::Test::member2}{self::B?} in #t8 == null ?{self::B?} #t7.{self::Test::member2} = self::f<self::B?>() : #t8{self::B};
    self::B v3 = let final self::Test #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}{self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B};
    self::B v4 = let final self::Test #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}{self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B};
    self::C v5 = let final self::Test #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}{self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C};
    self::B v6 = let final self::Test #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    self::B v7 = let final self::Test #t13 = t in let final self::B #t14 = #t13.{self::Test::member}{self::B} in let final self::B #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1){(core::int) → self::B} in #t14;
  }
}
static method f<T extends core::Object? = dynamic>() → self::f::T%
  return throw "";
static method main() → dynamic {}
