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 {}
