library test /*isNonNullableByDefault*/;
//
// 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
    : 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(covariant-by-class self::I::T% value) → void;
  abstract get y() → core::Object;
  abstract set y(covariant-by-declaration 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::•()
    ;
  mixin-super-stub get x() → core::int
    return super.{self::M::x};
  forwarding-stub set x(covariant-by-class core::int value) → void
    return super.{self::M::x} = value;
  mixin-super-stub get y() → core::int
    return super.{self::M::y};
  forwarding-stub set y(covariant-by-declaration core::int value) → void
    return super.{self::M::y} = value;
}
static method expectTypeError(() → void callback) → void {
  try {
    callback(){() → void};
    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::==}{(core::Object) → core::bool} expected)) {
    throw "Expected ${expected}, got ${value}";
  }
}
static method test(self::I<core::Object> i) → void {
  self::expectTypeError(() → void {
    i.{self::I::x} = "hello";
  });
  i.{self::I::x} = 2;
  self::expect(i.{self::I::x}{core::Object}, 1);
  self::expectTypeError(() → void {
    i.{self::I::y} = "hello";
  });
  i.{self::I::y} = 4;
  self::expect(i.{self::I::y}{core::Object}, 3);
}
static method main() → void {
  self::test(new self::C::•());
}
