library test /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Index extends core::Object {
  synthetic constructor •() → self::Index
    : super core::Object::•()
    ;
}
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 {
  synthetic constructor •() → self::Test
    : super core::Object::•()
    ;
  operator [](self::Index i) → self::B
    return throw "";
  operator []=(self::Index i, self::B v) → void {}
  method test() → void {
    this.{self::Test::[]=}(self::f<self::Index>(), self::f<self::B>()){(self::Index, self::B) → void};
    let final self::Index #t1 = self::f<self::Index>() in this.{self::Test::[]=}(#t1, this.{self::Test::[]}(#t1){(self::Index) → self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B}){(self::Index, self::B) → void};
    let final self::Index #t2 = self::f<self::Index>() in this.{self::Test::[]=}(#t2, this.{self::Test::[]}(#t2){(self::Index) → self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B}){(self::Index, self::B) → void};
    let final self::Index #t3 = self::f<self::Index>() in this.{self::Test::[]=}(#t3, this.{self::Test::[]}(#t3){(self::Index) → self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C}){(self::Index, self::B) → void};
    let final self::Index #t4 = self::f<self::Index>() in let final self::B #t5 = this.{self::Test::[]}(#t4){(self::Index) → self::B}.{self::B::-}(1){(core::int) → self::B} in let final void #t6 = this.{self::Test::[]=}(#t4, #t5){(self::Index, self::B) → void} in #t5;
    let final self::Index #t7 = self::f<self::Index>() in this.{self::Test::[]=}(#t7, this.{self::Test::[]}(#t7){(self::Index) → self::B}.{self::B::-}(1){(core::int) → self::B}){(self::Index, self::B) → void};
    self::B v1 = let final self::Index #t8 = self::f<self::Index>() in let final self::B #t9 = self::f<self::B>() in let final void #t10 = this.{self::Test::[]=}(#t8, #t9){(self::Index, self::B) → void} in #t9;
    self::B v3 = let final self::Index #t11 = self::f<self::Index>() in let final self::B #t12 = this.{self::Test::[]}(#t11){(self::Index) → self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B} in let final void #t13 = this.{self::Test::[]=}(#t11, #t12){(self::Index, self::B) → void} in #t12;
    self::B v4 = let final self::Index #t14 = self::f<self::Index>() in let final self::B #t15 = this.{self::Test::[]}(#t14){(self::Index) → self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B} in let final void #t16 = this.{self::Test::[]=}(#t14, #t15){(self::Index, self::B) → void} in #t15;
    self::C v5 = let final self::Index #t17 = self::f<self::Index>() in let final self::C #t18 = this.{self::Test::[]}(#t17){(self::Index) → self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C} in let final void #t19 = this.{self::Test::[]=}(#t17, #t18){(self::Index, self::B) → void} in #t18;
    self::B v6 = let final self::Index #t20 = self::f<self::Index>() in let final self::B #t21 = this.{self::Test::[]}(#t20){(self::Index) → self::B}.{self::B::-}(1){(core::int) → self::B} in let final void #t22 = this.{self::Test::[]=}(#t20, #t21){(self::Index, self::B) → void} in #t21;
    self::B v7 = let final self::Index #t23 = self::f<self::Index>() in let final self::B #t24 = this.{self::Test::[]}(#t23){(self::Index) → self::B} in let final void #t25 = this.{self::Test::[]=}(#t23, #t24.{self::B::-}(1){(core::int) → self::B}){(self::Index, self::B) → void} in #t24;
  }
}
class Test2 extends core::Object {
  synthetic constructor •() → self::Test2
    : super core::Object::•()
    ;
  operator [](self::Index i) → self::B?
    return throw "";
  operator []=(self::Index i, self::B? v) → void {}
  method test() → void {
    let final self::Index #t26 = self::f<self::Index>() in this.{self::Test2::[]}(#t26){(self::Index) → self::B?} == null ?{self::B?} this.{self::Test2::[]=}(#t26, self::f<self::B?>()){(self::Index, self::B?) → void} : null;
    self::B? v2 = let final self::Index #t27 = self::f<self::Index>() in let final self::B? #t28 = this.{self::Test2::[]}(#t27){(self::Index) → self::B?} in #t28 == null ?{self::B?} let final self::B? #t29 = self::f<self::B?>() in let final void #t30 = this.{self::Test2::[]=}(#t27, #t29){(self::Index, self::B?) → void} in #t29 : #t28{self::B};
  }
}
static method f<T extends core::Object? = dynamic>() → self::f::T%
  return throw "";
static method main() → dynamic {}
