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 {
    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index, this.{self::Test::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index, this.{self::Test::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index, this.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index, this.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
    self::A v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
    self::B v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
    self::C v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
    self::B v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
    self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
  }
}
static method f<T extends core::Object = dynamic>() → self::f::T
  return null;
static method main() → dynamic {}
