// Unhandled errors:
//
// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: 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 /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
//                                                                     ^
//
// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: 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 /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
//                                                                     ^

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 {}
