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