library test;
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 null;
  operator -(core::int i) → self::C
    return null;
}
class B extends self::A {
  synthetic constructor •() → self::B
    : 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 •() → 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 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 {}
