// Unhandled errors:
//
// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
// Try to initialize the field in the declaration or in every constructor.
//   final f;
//         ^
//
// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
// Try to initialize the field in the declaration or in every constructor.
//   final d;
//         ^

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

class A extends core::Object {
  field dynamic a = null;
  field dynamic b = null;
  field dynamic c = null;
  field dynamic d = null;
  final field dynamic f = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  get e() → dynamic
    return null;
  set g(dynamic _) → dynamic {}
  get h() → dynamic
    return null;
  set h(dynamic _) → dynamic {}
  get i() → dynamic
    return null;
  operator [](dynamic _) → dynamic
    return null;
  operator []=(dynamic a, dynamic b) → dynamic {}
  operator ~() → dynamic
    return 117;
  operator unary-() → dynamic
    return 117;
  operator ==(dynamic other) → dynamic
    return true;
  method m() → void {}
}
class B extends self::A {
  final field dynamic d = null;
  synthetic constructor •() → void
    : super self::A::•()
    ;
  get b() → dynamic
    return null;
  set c(dynamic x) → dynamic {}
  set i(dynamic x) → dynamic {}
}
class C extends self::B {
  synthetic constructor •() → void
    : super self::B::•()
    ;
  method test() → dynamic {
    super.{self::A::~}();
    self::use(super.{self::A::~}());
    super.{self::A::unary-}();
    self::use(super.{self::A::unary-}());
    super.{self::A::==}(87);
    self::use(super.{self::A::==}(87));
    !super.{self::A::==}(87);
    self::use(!super.{self::A::==}(87));
    super.{self::A::a};
    self::use(super.{self::A::a});
    super.{self::B::b};
    self::use(super.{self::B::b});
    super.{self::A::c};
    self::use(super.{self::A::c});
    super.{self::B::d};
    self::use(super.{self::B::d});
    super.{self::A::e};
    self::use(super.{self::A::e});
    super.{self::A::f};
    self::use(super.{self::A::f});
    super.g;
    self::use(super.g);
    super.{self::A::h};
    self::use(super.{self::A::h});
    super.{self::A::i};
    self::use(super.{self::A::i});
    super.{self::A::[]}(87);
    self::use(super.{self::A::[]}(87));
    super.{self::A::m};
    self::use(super.{self::A::m});
    super.{self::A::a} = super.{self::A::a}.+(1);
    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
    super.{self::A::b} = super.{self::B::b}.+(1);
    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
    super.{self::B::c} = super.{self::A::c}.+(1);
    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
    super.{self::A::d} = super.{self::B::d}.+(1);
    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
    super.e = super.{self::A::e}.+(1);
    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
    super.f = super.{self::A::f}.+(1);
    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
    super.{self::A::g} = super.g.+(1);
    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
    super.{self::A::h} = super.{self::A::h}.+(1);
    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
    super.{self::B::i} = super.{self::A::i}.+(1);
    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
    super.m = super.{self::A::m}.+(1);
    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
    super.{self::A::a} = super.{self::A::a}.+(1);
    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
    super.{self::A::b} = super.{self::B::b}.+(1);
    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
    super.{self::B::c} = super.{self::A::c}.+(1);
    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
    super.{self::A::d} = super.{self::B::d}.+(1);
    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
    super.e = super.{self::A::e}.+(1);
    self::use(super.e = super.{self::A::e}.+(1));
    super.f = super.{self::A::f}.+(1);
    self::use(super.f = super.{self::A::f}.+(1));
    super.{self::A::g} = super.g.+(1);
    self::use(super.{self::A::g} = super.g.+(1));
    super.{self::A::h} = super.{self::A::h}.+(1);
    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
    super.{self::B::i} = super.{self::A::i}.+(1);
    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
    let final dynamic #t25 = 87 in let final dynamic #t26 = super.{self::A::[]}(#t25).+(1) in let final dynamic #t27 = super.{self::A::[]=}(#t25, #t26) in #t26;
    self::use(let final dynamic #t28 = 87 in let final dynamic #t29 = super.{self::A::[]}(#t28).+(1) in let final dynamic #t30 = super.{self::A::[]=}(#t28, #t29) in #t29);
    super.m = super.{self::A::m}.+(1);
    self::use(super.m = super.{self::A::m}.+(1));
    super.{self::A::a}.call();
    self::use(super.{self::A::a}.call());
    super.{self::B::b}.call();
    self::use(super.{self::B::b}.call());
    super.{self::A::c}.call();
    self::use(super.{self::A::c}.call());
    super.{self::B::d}.call();
    self::use(super.{self::B::d}.call());
    super.{self::A::e}.call();
    self::use(super.{self::A::e}.call());
    super.{self::A::f}.call();
    self::use(super.{self::A::f}.call());
    super.g();
    self::use(super.g());
    super.{self::A::h}.call();
    self::use(super.{self::A::h}.call());
    super.{self::A::i}.call();
    self::use(super.{self::A::i}.call());
    super.{self::A::[]}(87).call();
    self::use(super.{self::A::[]}(87).call());
    super.{self::A::m}();
    self::use(super.{self::A::m}());
    super.{self::A::m}(87);
    self::use(super.{self::A::m}(87));
    super.{self::A::a} = 42;
    self::use(super.{self::A::a} = 42);
    super.{self::A::b} = 42;
    self::use(super.{self::A::b} = 42);
    super.{self::B::c} = 42;
    self::use(super.{self::B::c} = 42);
    super.{self::A::d} = 42;
    self::use(super.{self::A::d} = 42);
    super.e = 42;
    self::use(super.e = 42);
    super.f = 42;
    self::use(super.f = 42);
    super.{self::A::g} = 42;
    self::use(super.{self::A::g} = 42);
    super.{self::A::h} = 42;
    self::use(super.{self::A::h} = 42);
    super.{self::B::i} = 42;
    self::use(super.{self::B::i} = 42);
    super.{self::A::[]=}(87, 42);
    self::use(let final dynamic #t31 = 87 in let final dynamic #t32 = 42 in let final dynamic #t33 = super.{self::A::[]=}(#t31, #t32) in #t32);
    super.m = 42;
    self::use(super.m = 42);
    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
    self::use(let final dynamic #t34 = super.{self::A::a} in #t34.==(null) ? super.{self::A::a} = 42 : #t34);
    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
    self::use(let final dynamic #t35 = super.{self::B::b} in #t35.==(null) ? super.{self::A::b} = 42 : #t35);
    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
    self::use(let final dynamic #t36 = super.{self::A::c} in #t36.==(null) ? super.{self::B::c} = 42 : #t36);
    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
    self::use(let final dynamic #t37 = super.{self::B::d} in #t37.==(null) ? super.{self::A::d} = 42 : #t37);
    super.{self::A::e}.==(null) ? super.e = 42 : null;
    self::use(let final dynamic #t38 = super.{self::A::e} in #t38.==(null) ? super.e = 42 : #t38);
    super.{self::A::f}.==(null) ? super.f = 42 : null;
    self::use(let final dynamic #t39 = super.{self::A::f} in #t39.==(null) ? super.f = 42 : #t39);
    super.g.==(null) ? super.{self::A::g} = 42 : null;
    self::use(let final dynamic #t40 = super.g in #t40.==(null) ? super.{self::A::g} = 42 : #t40);
    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
    self::use(let final dynamic #t41 = super.{self::A::h} in #t41.==(null) ? super.{self::A::h} = 42 : #t41);
    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
    self::use(let final dynamic #t42 = super.{self::A::i} in #t42.==(null) ? super.{self::B::i} = 42 : #t42);
    let final dynamic #t43 = 87 in super.{self::A::[]}(#t43).==(null) ? let final dynamic #t44 = 42 in let final dynamic #t45 = super.{self::A::[]=}(#t43, #t44) in #t44 : null;
    self::use(let final dynamic #t46 = 87 in let final dynamic #t47 = super.{self::A::[]}(#t46) in #t47.==(null) ? let final dynamic #t48 = 42 in let final dynamic #t49 = super.{self::A::[]=}(#t46, #t48) in #t48 : #t47);
    super.{self::A::m}.==(null) ? super.m = 42 : null;
    self::use(let final dynamic #t50 = super.{self::A::m} in #t50.==(null) ? super.m = 42 : #t50);
    super.{self::A::a} = super.{self::A::a}.+(42);
    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
    super.{self::A::b} = super.{self::B::b}.+(42);
    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
    super.{self::B::c} = super.{self::A::c}.+(42);
    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
    super.{self::A::d} = super.{self::B::d}.+(42);
    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
    super.e = super.{self::A::e}.+(42);
    self::use(super.e = super.{self::A::e}.+(42));
    super.f = super.{self::A::f}.+(42);
    self::use(super.f = super.{self::A::f}.+(42));
    super.{self::A::g} = super.g.+(42);
    self::use(super.{self::A::g} = super.g.+(42));
    super.{self::A::h} = super.{self::A::h}.+(42);
    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
    super.{self::B::i} = super.{self::A::i}.+(42);
    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
    let final dynamic #t51 = 87 in super.{self::A::[]=}(#t51, super.{self::A::[]}(#t51).+(42));
    self::use(let final dynamic #t52 = 87 in let final dynamic #t53 = super.{self::A::[]}(#t52).+(42) in let final dynamic #t54 = super.{self::A::[]=}(#t52, #t53) in #t53);
    super.m = super.{self::A::m}.+(42);
    self::use(super.m = super.{self::A::m}.+(42));
    super.{self::A::a} = super.{self::A::a}.-(42);
    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
    super.{self::A::b} = super.{self::B::b}.-(42);
    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
    super.{self::B::c} = super.{self::A::c}.-(42);
    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
    super.{self::A::d} = super.{self::B::d}.-(42);
    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
    super.e = super.{self::A::e}.-(42);
    self::use(super.e = super.{self::A::e}.-(42));
    super.f = super.{self::A::f}.-(42);
    self::use(super.f = super.{self::A::f}.-(42));
    super.{self::A::g} = super.g.-(42);
    self::use(super.{self::A::g} = super.g.-(42));
    super.{self::A::h} = super.{self::A::h}.-(42);
    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
    super.{self::B::i} = super.{self::A::i}.-(42);
    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
    let final dynamic #t55 = 87 in super.{self::A::[]=}(#t55, super.{self::A::[]}(#t55).-(42));
    self::use(let final dynamic #t56 = 87 in let final dynamic #t57 = super.{self::A::[]}(#t56).-(42) in let final dynamic #t58 = super.{self::A::[]=}(#t56, #t57) in #t57);
    super.m = super.{self::A::m}.-(42);
    self::use(super.m = super.{self::A::m}.-(42));
  }
}
static method use(dynamic x) → dynamic {
  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
    throw "Shouldn't happen";
}
static method main() → dynamic {
  try {
    new self::C::•().test();
  }
  on core::NoSuchMethodError catch(no-exception-var) {
    return;
  }
  throw "Test failed";
}
