library test;
import self as self;
import "dart:core" as core;

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