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

class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::X, self::I::Y>
    : super core::Object::•()
    ;
}
class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
  synthetic constructor •() → self::M0<self::M0::T>
    : super core::Object::•()
    ;
}
class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
  synthetic constructor •() → self::M1<self::M1::T>
    : super core::Object::•()
    ;
}
abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
  const synthetic constructor •() → self::_A&Object&M0
    : super core::Object::•()
    ;
}
abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
  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
    : super self::_A&Object&M0&M1::•()
    ;
}
static method main() → dynamic {}
