library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:23: Error: The parameter 'i' of the method 'Class.method2' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'Super.method2'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
//   void method2(String i);
//                       ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:8: Context: This is the overridden method ('method2').
//   void method2(num n) {}
//        ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:22:7: Error: The implementation of 'method2' in the non-abstract class 'Class' does not conform to its interface.
// class Class extends Super implements Interface {
//       ^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:20: Context: The parameter 'n' of the method 'Super.method2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.method2'.
// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
//   void method2(num n) {}
//                    ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:8: Context: This is the overridden method ('method2').
//   void method2(String i);
//        ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:23: Error: The parameter 'i' of the method 'Class.method2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.method2'.
// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
//   void method2(String i);
//                       ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:16:8: Context: This is the overridden method ('method2').
//   void method2(covariant int i) {}
//        ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:25:20: Error: The parameter 'i' of the method 'Class.method3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.method3'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
//   void method3(int i);
//                    ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:8:8: Context: This is the overridden method ('method3').
//   void method3(num n) {}
//        ^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  synthetic constructor •() → self::Super
    : super core::Object::•()
    ;
  method method1(core::num n) → void {}
  method method2(core::num n) → void {}
  method method3(core::num n) → void {}
  method method4(covariant core::num i) → void {}
  method method5(covariant core::int i) → void {}
}
class Interface extends core::Object {
  synthetic constructor •() → self::Interface
    : super core::Object::•()
    ;
  method method1(covariant core::int i) → void {}
  method method2(covariant core::int i) → void {}
  method method4(core::int i) → void {}
  method method5(core::int i) → void {}
}
class Class extends self::Super implements self::Interface {
  synthetic constructor •() → self::Class
    : super self::Super::•()
    ;
  forwarding-stub forwarding-semi-stub method method1(covariant core::int i) → void
    return super.{self::Super::method1}(i);
  forwarding-stub forwarding-semi-stub method method2(covariant core::String i) → void
    return super.{self::Super::method2}(i);
  abstract method method3(core::int i) → void;
  abstract method method4(covariant core::int i) → void;
  abstract method method5(covariant core::num n) → void;
}
static method main() → dynamic {}
