library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/late_lowering/covariant_late_field.dart:19:31: Error: The parameter 'value' of the method 'C.invariantField' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'A.invariantField'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
//   void set invariantField(int value) {} // error
//                               ^
// pkg/front_end/testcases/late_lowering/covariant_late_field.dart:6:12: Context: This is the overridden method ('invariantField').
//   late num invariantField;
//            ^
//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

class A extends core::Object {
  field core::num? _#A#invariantField = null;
  field core::bool _#A#invariantField#isSet = false;
  field core::num? _#A#covariantField = null;
  field core::bool _#A#covariantField#isSet = false;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get invariantField() → core::num
    return this.{self::A::_#A#invariantField#isSet}{core::bool} ?{core::num} let final core::num? #t1 = this.{self::A::_#A#invariantField}{core::num?} in #t1{core::num} : throw new _in::LateError::fieldNI("invariantField");
  set invariantField(core::num invariantField#param) → void {
    this.{self::A::_#A#invariantField#isSet} = true;
    this.{self::A::_#A#invariantField} = invariantField#param;
  }
  get covariantField() → core::num
    return this.{self::A::_#A#covariantField#isSet}{core::bool} ?{core::num} let final core::num? #t2 = this.{self::A::_#A#covariantField}{core::num?} in #t2{core::num} : throw new _in::LateError::fieldNI("covariantField");
  set covariantField(covariant-by-declaration core::num covariantField#param) → void {
    this.{self::A::_#A#covariantField#isSet} = true;
    this.{self::A::_#A#covariantField} = covariantField#param;
  }
}
abstract class B extends core::Object implements self::A {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  abstract get invariantField() → core::num;
  abstract set invariantField(core::num value) → void;
  abstract get covariantField() → core::num;
  abstract set covariantField(covariant-by-declaration core::num value) → void;
}
abstract class C extends core::Object implements self::A {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  abstract get invariantField() → core::int;
  set invariantField(core::int value) → void {}
  abstract get covariantField() → core::int;
  set covariantField(covariant-by-declaration core::int value) → void {}
}
abstract class D extends core::Object implements self::A {
  synthetic constructor •() → self::D
    : super core::Object::•()
    ;
  abstract get invariantField() → core::int;
  set invariantField(covariant-by-declaration core::int value) → void {}
  abstract get covariantField() → core::int;
  set covariantField(covariant-by-declaration core::int value) → void {}
}
static method main() → dynamic {}
