// Formatted problems:
//
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M::y' has type 'dart.core::int', which does not match the corresponding type in the overridden method, 'dart.core::Object'.
// Change to a supertype of 'dart.core::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 /*@covariance=explicit*/ value);
//            ^
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:61:5: Context: Override was introduced in the mixin application class 'C'.
//     C = B with M implements I<int>;
//     ^

// Unhandled errors:
//
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M::y' has type 'dart.core::int', which does not match the corresponding type in the overridden method, 'dart.core::Object'.
// Change to a supertype of 'dart.core::Object', or, for a covariant parameter, a subtype.
//   void set y(int value) {
//                  ^

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

class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  get x() → core::int {
    throw "Should not be reached";
  }
  set x(core::int value) → void {
    throw "Should not be reached";
  }
  get y() → core::int {
    throw "Should not be reached";
  }
  set y(core::int value) → void {
    throw "Should not be reached";
  }
}
abstract class I<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::T>
    : super core::Object::•()
    ;
  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
    : super core::Object::•()
    ;
  get x() → core::int
    return 1;
  set x(core::int value) → void {
    self::expect(value, 2);
  }
  get y() → core::int
    return 3;
  set y(core::int value) → void {
    self::expect(value, 4);
  }
}
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 {
  try {
    callback.call();
    throw "Expected TypeError, did not occur";
  }
  on core::TypeError catch(no-exception-var) {
  }
}
static method expect(core::Object value, core::Object expected) → void {
  if(!value.{core::Object::==}(expected)) {
    throw "Expected ${expected}, got ${value}";
  }
}
static method test(self::I<core::Object> i) → void {
  self::expectTypeError(() → core::Null {
    i.{self::I::x} = "hello";
  });
  i.{self::I::x} = 2;
  self::expect(i.{self::I::x}, 1);
  self::expectTypeError(() → core::Null {
    i.{self::I::y} = "hello";
  });
  i.{self::I::y} = 4;
  self::expect(i.{self::I::y}, 3);
}
static method main() → void {
  self::test(new self::C::•());
}
