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::B v4 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
    self::C v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::C #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32) in #t32;
    self::B v6 = let final self::Test #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::B #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index).{self::B::-}(1) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index, #t36) in #t36;
    self::B v7 = 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) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40.{self::B::-}(1)) in #t40;
  }
}
static method f<T extends core::Object = dynamic>() → self::f::T
  return null;
static method main() → dynamic {}
