library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:27: Error: The parameter 'i' of the method 'Class.setter2' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'Super.setter2'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
//   void set setter2(String i);
//                           ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:12: Context: This is the overridden method ('setter2').
//   void set setter2(num n) {}
//            ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:27: Error: The parameter 'i' of the method 'Class.setter2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.setter2'.
// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
//   void set setter2(String i);
//                           ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:16:12: Context: This is the overridden method ('setter2').
//   void set setter2(covariant int i) {}
//            ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:25:24: Error: The parameter 'i' of the method 'Class.setter3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.setter3'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
//   void set setter3(int i);
//                        ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:8:12: Context: This is the overridden method ('setter3').
//   void set setter3(num n) {}
//            ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:22:7: Error: The implementation of 'setter2' 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_setter.dart:7:24: Context: The parameter 'n' of the method 'Super.setter2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.setter2'.
// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
//   void set setter2(num n) {}
//                        ^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:12: Context: This is the overridden method ('setter2').
//   void set setter2(String i);
//            ^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  synthetic constructor •() → self::Super
    ;
  set setter1(core::num n) → void
    ;
  set setter2(core::num n) → void
    ;
  set setter3(core::num n) → void
    ;
  set setter4(covariant core::num i) → void
    ;
  set setter5(covariant core::int i) → void
    ;
}
class Interface extends core::Object {
  synthetic constructor •() → self::Interface
    ;
  set setter1(covariant core::int i) → void
    ;
  set setter2(covariant core::int i) → void
    ;
  set setter4(core::int i) → void
    ;
  set setter5(core::int i) → void
    ;
}
class Class extends self::Super implements self::Interface {
  synthetic constructor •() → self::Class
    ;
  forwarding-stub forwarding-semi-stub set setter1(covariant core::int i) → void
    return super.{self::Super::setter1} = i;
  forwarding-stub forwarding-semi-stub set setter2(covariant core::String i) → void
    return super.{self::Super::setter2} = i;
  abstract set setter3(core::int i) → void;
  abstract set setter4(covariant core::int i) → void;
  abstract set setter5(covariant core::num n) → void;
}
static method main() → dynamic
  ;
