library test;
//
// Problems in library:
//
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The field 'M.y' has type 'int', which does not match the corresponding type, 'Object', in the overridden setter, 'I.y'.
//  - 'Object' is from 'dart:core'.
//   int y;
//       ^
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:43:12: Context: This is the overridden method ('y').
//   void set y(covariant Object value);
//            ^
// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:51:7: Context: Override was introduced in the mixin application class 'C'.
// class C = B with M implements I<int>;
//       ^
//
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 {
  field core::int* x;
  field core::int* y;
  synthetic constructor •() → self::M*
    ;
}
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* _) → void
    return super.{self::B::x} = _;
}
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
  ;
