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 {
    self::Test t = self::f<self::Test>();
    t.{self::Test::[]=}(self::f<self::Index>(), self::f<self::B>()){(self::Index, self::B) → void};
    let final self::Test #t1 = t in let final self::Index #t2 = self::f<self::Index>() in #t1.{self::Test::[]=}(#t2, #t1.{self::Test::[]}(#t2){(self::Index) → self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B}){(self::Index, self::B) → void};
    let final self::Test #t3 = t in let final self::Index #t4 = self::f<self::Index>() in #t3.{self::Test::[]=}(#t4, #t3.{self::Test::[]}(#t4){(self::Index) → self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B}){(self::Index, self::B) → void};
    let final self::Test #t5 = t in let final self::Index #t6 = self::f<self::Index>() in #t5.{self::Test::[]=}(#t6, #t5.{self::Test::[]}(#t6){(self::Index) → self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C}){(self::Index, self::B) → void};
    t.{self::Test::[]}(self::f<self::Index>()){(self::Index) → self::B};
    let final self::Test #t7 = t in let final self::Index #t8 = self::f<self::Index>() in let final self::B #t9 = #t7.{self::Test::[]}(#t8){(self::Index) → self::B}.{self::B::-}(1){(core::int) → self::B} in let final void #t10 = #t7.{self::Test::[]=}(#t8, #t9){(self::Index, self::B) → void} in #t9;
    let final self::Test #t11 = t in let final self::Index #t12 = self::f<self::Index>() in #t11.{self::Test::[]=}(#t12, #t11.{self::Test::[]}(#t12){(self::Index) → self::B}.{self::B::-}(1){(core::int) → self::B}){(self::Index, self::B) → void};
    self::B v1 = let final self::Test #t13 = t in let final self::Index #t14 = self::f<self::Index>() in let final self::B #t15 = self::f<self::B>() in let final void #t16 = #t13.{self::Test::[]=}(#t14, #t15){(self::Index, self::B) → void} in #t15;
    self::B v3 = let final self::Test #t17 = t in let final self::Index #t18 = self::f<self::Index>() in let final self::B #t19 = #t17.{self::Test::[]}(#t18){(self::Index) → self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::B} in let final void #t20 = #t17.{self::Test::[]=}(#t18, #t19){(self::Index, self::B) → void} in #t19;
    self::B v4 = let final self::Test #t21 = t in let final self::Index #t22 = self::f<self::Index>() in let final self::B #t23 = #t21.{self::Test::[]}(#t22){(self::Index) → self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B} in let final void #t24 = #t21.{self::Test::[]=}(#t22, #t23){(self::Index, self::B) → void} in #t23;
    self::C v5 = let final self::Test #t25 = t in let final self::Index #t26 = self::f<self::Index>() in let final self::C #t27 = #t25.{self::Test::[]}(#t26){(self::Index) → self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C} in let final void #t28 = #t25.{self::Test::[]=}(#t26, #t27){(self::Index, self::B) → void} in #t27;
    self::B v6 = t.{self::Test::[]}(self::f<self::Index>()){(self::Index) → self::B};
    self::B v7 = let final self::Test #t29 = t in let final self::Index #t30 = self::f<self::Index>() in let final self::B #t31 = #t29.{self::Test::[]}(#t30){(self::Index) → self::B}.{self::B::-}(1){(core::int) → self::B} in let final void #t32 = #t29.{self::Test::[]=}(#t30, #t31){(self::Index, self::B) → void} in #t31;
    self::B v8 = let final self::Test #t33 = t in let final self::Index #t34 = self::f<self::Index>() in let final self::B #t35 = #t33.{self::Test::[]}(#t34){(self::Index) → self::B} in let final void #t36 = #t33.{self::Test::[]=}(#t34, #t35.{self::B::-}(1){(core::int) → self::B}){(self::Index, self::B) → void} in #t35;
  }
}
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 {
    self::Test2 t = self::f<self::Test2>();
    t.{self::Test2::[]=}(self::f<self::Index>(), self::f<self::B?>()){(self::Index, self::B?) → void};
    let final self::Test2 #t37 = t in let final self::Index #t38 = self::f<self::Index>() in #t37.{self::Test2::[]}(#t38){(self::Index) → self::B?} == null ?{self::B?} #t37.{self::Test2::[]=}(#t38, self::f<self::B?>()){(self::Index, self::B?) → void} : null;
    self::B? v2 = let final self::Test2 #t39 = t in let final self::Index #t40 = self::f<self::Index>() in let final self::B? #t41 = #t39.{self::Test2::[]}(#t40){(self::Index) → self::B?} in #t41 == null ?{self::B?} let final self::B? #t42 = self::f<self::B?>() in let final void #t43 = #t39.{self::Test2::[]=}(#t40, #t42){(self::Index, self::B?) → void} in #t42 : #t41{self::B};
  }
}
static method f<T extends core::Object? = dynamic>() → self::f::T%
  return throw "";
static method main() → dynamic {}
