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

abstract class A extends core::Object {
  synthetic constructor •() → void
    : 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 •() → void
    : 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 •() → void
    : 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 const field dynamic #errors = const <dynamic>["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(
                                                            ^"]/* from null */;
static method main() → dynamic {}
