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::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → void
    : 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 •() → void
    : super self::B::•()
    ;
}
class Test extends core::Object {
  synthetic constructor •() → void
    : 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 {}
