//
// Problems in component:
//
// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// class A extends Object with M0, M1<int> {}
//       ^
//
library;
import self as self;
import "dart:core" as core;

class I<X extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::X*>*
    ;
}
class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*> {
  synthetic constructor •() → self::M0<self::M0::T*>*
    ;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
  synthetic constructor •() → self::M1<self::M1::T*>*
    ;
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_A&Object&M0*
    : super core::Object::•()
    ;
}
abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int*> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_A&Object&M0&M1*
    : super self::_A&Object&M0::•()
    ;
}
class A extends self::_A&Object&M0&M1 {
  synthetic constructor •() → self::A*
    ;
}
static method main() → dynamic
  ;
