library test;
//
// Problems in library:
//
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:58:7: Error: The mixin application class 'C' introduces an erroneous override of 'y'.
// class C = B with M implements I<int>;
//       ^
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Context: The parameter 'value' of the method 'M.y' has type 'int', which does not match the corresponding type, 'Object', in the overridden method, 'I.y'.
//  - 'Object' is from 'dart:core'.
// Change to a supertype of 'Object', or, for a covariant parameter, a subtype.
//   void set y(int value) {
//                  ^
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:43:12: Context: This is the overridden method ('y').
//   void set y(covariant Object value);
//            ^
//
import self as self;
import "dart:core" as core;

class B extends core::Object {
  synthetic constructor •() → self::B*
    ;
  get x() → core::int*
    ;
  set x(core::int* value) → void
    ;
  get y() → core::int*
    ;
  set y(core::int* value) → void
    ;
}
abstract class I<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::T*>*
    ;
  abstract get x() → self::I::T*;
  abstract set x(generic-covariant-impl self::I::T* value) → void;
  abstract get y() → core::Object*;
  abstract set y(covariant core::Object* value) → void;
}
class M extends core::Object {
  synthetic constructor •() → self::M*
    ;
  get x() → core::int*
    ;
  set x(core::int* value) → void
    ;
  get y() → core::int*
    ;
  set y(core::int* value) → void
    ;
}
class C = self::B with self::M implements self::I<core::int*> {
  synthetic constructor •() → self::C*
    : super self::B::•()
    ;
  forwarding-stub set y(covariant core::Object* value) → void
    return super.{self::B::y} = value;
  forwarding-stub set x(generic-covariant-impl core::int* value) → void
    return super.{self::B::x} = value;
}
static method expectTypeError(() →* void callback) → void
  ;
static method expect(core::Object* value, core::Object* expected) → void
  ;
static method test(self::I<core::Object*>* i) → void
  ;
static method main() → void
  ;
