library test;
import self as self;
import "dart:core" as core;

typedef F<T extends core::Object = dynamic> = (T) → void;
class B<T extends core::Object = dynamic, U extends (self::B::T) → void = (dynamic) → void> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
    return null;
}
class C extends core::Object {
  field self::B<core::num, (core::num) → void> x = null;
  static field self::B<core::num, (core::num) → void> y = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  operator [](core::int i) → self::B<core::num, (core::num) → void>
    return null;
  operator []=(core::int i, self::B<core::num, (core::num) → void> v) → void {}
}
static method test1(self::B<core::num, (core::num) → void> b) → void {
  b = b.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
  self::B<core::num, (core::num) → void> x = b = b.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
}
static method test2(self::C c) → void {
  let final self::C #t1 = c in let final core::int #t2 = 0 in #t1.{self::C::[]=}(#t2, #t1.{self::C::[]}(#t2).{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>);
  self::B<core::num, (core::num) → void> x = let final self::C #t3 = c in let final core::int #t4 = 0 in let final self::B<core::num, (core::num) → void> #t5 = #t3.{self::C::[]}(#t4).{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void> in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
}
static method test3(self::C c) → void {
  let final self::C #t7 = c in #t7.{self::C::x} = #t7.{self::C::x}.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
  self::B<core::num, (core::num) → void> x = let final self::C #t8 = c in #t8.{self::C::x} = #t8.{self::C::x}.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
}
static method test4(self::C c) → void {
  self::C::y = self::C::y.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
  self::B<core::num, (core::num) → void> x = self::C::y = self::C::y.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
}
static method main() → void {}
