// Formatted problems:
//
// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
//       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
//                                                  ^
// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:15:12: Error: This is the overridden method ('x4').
//   void set x4(A value) {}
//            ^
//
// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
//       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
//                                                                 ^
// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:16:12: Error: This is the overridden method ('x5').
//   void set x5(covariant A value) {}
//            ^

// Unhandled errors:
//
// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
//       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
//                                                  ^
//
// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
//       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
//                                                                 ^

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

class A extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → void
    : super self::A::•()
    ;
}
class C extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  set x1(covariant self::A value) → void {}
  set x2(self::A value) → void {}
  set x3(covariant self::A value) → void {}
  set x4(self::A value) → void {}
  set x5(covariant self::A value) → void {}
  set x6(covariant self::B value) → void {}
}
class D extends self::C {
  synthetic constructor •() → void
    : super self::C::•()
    ;
  set x1(covariant self::B value) → void {}
  set x2(covariant self::B value) → void {}
  set x3(covariant self::B value) → void {}
  set x4(self::B value) → void {}
  set x5(covariant core::String value) → void {}
  set x6(covariant self::A value) → void {}
}
static method main() → dynamic {}
