library;
//
// Problems in library:
//
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:26:13: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f1'.
//  - 'B' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
//   void f1(B x) {}
//             ^
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:12:8: Context: This is the overridden method ('f1').
//   void f1(A x) {}
//        ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:27:14: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f2'.
//  - 'B' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
//   void f2([B x]) {}
//              ^
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:13:8: Context: This is the overridden method ('f2').
//   void f2([A x]) {}
//        ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:28:14: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f3'.
//  - 'B' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
//   void f3({B x}) {}
//              ^
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:14:8: Context: This is the overridden method ('f3').
//   void f3({A x}) {}
//        ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:29:10: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.f4'.
//  - 'Object' is from 'dart:core'.
//  - 'A' is from 'pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart'.
// Change to a subtype of 'A'.
//   Object f4() {}
//          ^
// pkg/front_end/testcases/general_nnbd_opt_out/override_check_basic.dart:15:5: Context: This is the overridden method ('f4').
//   A f4() {}
//     ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A*
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class B extends self::A {
  synthetic constructor •() → self::B*
    ;
}
class C extends core::Object {
  synthetic constructor •() → self::C*
    ;
  method f1(self::A* x) → void
    ;
  method f2([self::A* x]) → void
    ;
  method f3({self::A* x}) → void
    ;
  method f4() → self::A*
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class D extends self::C {
  synthetic constructor •() → self::D*
    ;
  method f1(core::Object* x) → void
    ;
  method f2([core::Object* x]) → void
    ;
  method f3({core::Object* x}) → void
    ;
  method f4() → self::B*
    ;
}
class E extends self::C {
  synthetic constructor •() → self::E*
    ;
  method f1(self::B* x) → void
    ;
  method f2([self::B* x]) → void
    ;
  method f3({self::B* x}) → void
    ;
  method f4() → core::Object*
    ;
}
static method main() → dynamic
  ;
