library test /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef F<contravariant T extends core::Object? = dynamic> = (T%) → void;
class B<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::T%>
    : super core::Object::•()
    ;
  operator +(covariant-by-class self::B<self::B::T%> other) → self::B<self::B::T%>
    return throw "";
}
class C<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  operator [](core::int i) → self::B<(self::C::T%) → void>
    return throw "";
  operator []=(core::int i, self::B<(self::C::T%) → void> x) → void {}
}
class C2<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::C2<self::C2::T%>
    : super core::Object::•()
    ;
  operator [](core::int i) → self::B<(self::C2::T%) → void>?
    return throw "";
  operator []=(core::int i, self::B<(self::C2::T%) → void>? x) → void {}
}
static method test(self::C<core::num> c, self::C2<core::num> c2) → void {
  c.{self::C::[]=}(0, new self::B::•<(core::num) → void>()){(core::int, self::B<(core::num) → void>) → void};
  c2.{self::C2::[]=}(0, new self::B::•<(core::num) → void>()){(core::int, self::B<(core::num) → void>?) → void};
  let final self::C<core::num> #t1 = c in let final core::int #t2 = 0 in #t1.{self::C::[]=}(#t2, (#t1.{self::C::[]}(#t2){(core::int) → self::B<(core::num) → void>} as{TypeError,CovarianceCheck,ForNonNullableByDefault} self::B<(core::num) → void>).{self::B::+}(new self::B::•<(core::num) → void>()){(self::B<(core::num) → void>) → self::B<(core::num) → void>}){(core::int, self::B<(core::num) → void>) → void};
  self::B<(core::num) → void> x = let final self::C<core::num> #t3 = c in let final core::int #t4 = 0 in let final self::B<(core::num) → void> #t5 = (#t3.{self::C::[]}(#t4){(core::int) → self::B<(core::num) → void>} as{TypeError,CovarianceCheck,ForNonNullableByDefault} self::B<(core::num) → void>).{self::B::+}(new self::B::•<(core::num) → void>()){(self::B<(core::num) → void>) → self::B<(core::num) → void>} in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5){(core::int, self::B<(core::num) → void>) → void} in #t5;
  let final self::C2<core::num> #t7 = c2 in let final core::int #t8 = 0 in #t7.{self::C2::[]}(#t8){(core::int) → self::B<(core::num) → void>?} as{TypeError,CovarianceCheck,ForNonNullableByDefault} self::B<(core::num) → void>? == null ?{self::B<(core::num) → void>} #t7.{self::C2::[]=}(#t8, new self::B::•<(core::num) → void>()){(core::int, self::B<(core::num) → void>?) → void} : null;
  self::B<(core::num) → void> y = let final self::C2<core::num> #t9 = c2 in let final core::int #t10 = 0 in let final self::B<(core::num) → void>? #t11 = #t9.{self::C2::[]}(#t10){(core::int) → self::B<(core::num) → void>?} as{TypeError,CovarianceCheck,ForNonNullableByDefault} self::B<(core::num) → void>? in #t11 == null ?{self::B<(core::num) → void>} let final self::B<(core::num) → void> #t12 = new self::B::•<(core::num) → void>() in let final void #t13 = #t9.{self::C2::[]=}(#t10, #t12){(core::int, self::B<(core::num) → void>?) → void} in #t12 : #t11{self::B<(core::num) → void>};
}
static method main() → dynamic {}
