// Formatted problems:
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.
// Specify the type explicitly.
//       /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
//                                                                               ^
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
// Specify the type explicitly.
//       {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
//                                                                                ^
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
// Specify the type explicitly.
//       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
//                                                                                ^
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
//                                                             ^
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
//   int f(int x);
//       ^

// Unhandled errors:
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.
// Specify the type explicitly.
//       /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
//                                                                               ^
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
// Specify the type explicitly.
//       {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
//                                                                                ^
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
// Specify the type explicitly.
//       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
//                                                                                ^
//
// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
//                                                             ^

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

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  abstract method f(core::int x, core::int y) → core::int;
  abstract method g(core::int x, [core::int y = null]) → core::int;
  abstract method h(core::int x, {core::int y = null}) → core::int;
}
abstract class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  abstract method f(core::int x) → core::int;
  abstract method g(core::int x) → core::int;
  abstract method h(core::int x) → core::int;
}
abstract class C extends core::Object implements self::A, self::B {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  abstract method f(core::int x, dynamic y) → core::int;
  abstract method g(core::int x, [dynamic y = null]) → core::int;
  abstract method h(core::int x, {dynamic y = null}) → core::int;
}
static method main() → dynamic {}
