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