// Formatted problems:
//
// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E.y' is 'Object', which does not match the return type of the overridden method, 'A'.
//  - 'Object' is from 'dart:core'.
//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
// Change to a subtype of 'A'.
//   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
//                                                        ^
// pkg/front_end/testcases/override_check_accessor_basic.dart:13:9: Context: This is the overridden method ('y').
//   A get y => null;
//         ^
//
// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
//                                                         ^
// pkg/front_end/testcases/override_check_accessor_basic.dart:12:12: Context: This is the overridden method ('x').
//   void set x(A value) {}
//            ^

// Unhandled errors:
//
// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E.y' is 'Object', which does not match the return type of the overridden method, 'A'.
//  - 'Object' is from 'dart:core'.
//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
// Change to a subtype of 'A'.
//   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
//                                                        ^
//
// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
//                                                         ^

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

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
}
class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  set x(self::A value) → void {}
  get y() → self::A
    return null;
}
class D extends self::C {
  synthetic constructor •() → self::D
    : super self::C::•()
    ;
  set x(core::Object value) → void {}
  get y() → self::B
    return null;
}
class E extends self::C {
  synthetic constructor •() → self::E
    : super self::C::•()
    ;
  set x(self::B value) → void {}
  get y() → core::Object
    return null;
}
static method main() → dynamic {}
