library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/mixin_application_override.dart:21:7: Error: The mixin application class 'A0' introduces an erroneous override of 'foo'.
// class A0 = S with M;
//       ^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:22:7: Error: The mixin application class 'A1' introduces an erroneous override of 'foo'.
// class A1 = S with M1, M;
//       ^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:23:7: Error: The mixin application class 'A2' introduces an erroneous override of 'foo'.
// class A2 = S with M1, M2, M;
//       ^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:25:7: Error: Applying the mixin 'M' to 'S' introduces an erroneous override of 'foo'.
// class A0X = S with M, MX;
//       ^^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:26:7: Error: Applying the mixin 'M' to 'S with M1' introduces an erroneous override of 'foo'.
// class A1X = S with M1, M, MX;
//       ^^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:27:7: Error: Applying the mixin 'M' to 'S with M1, M2' introduces an erroneous override of 'foo'.
// class A2X = S with M1, M2, M, MX;
//       ^^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:29:7: Error: Applying the mixin 'M' to 'S' introduces an erroneous override of 'foo'.
// class B0 extends S with M {}
//       ^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:31:7: Error: Applying the mixin 'M' to 'S with M1' introduces an erroneous override of 'foo'.
// class B1 extends S with M1, M {}
//       ^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:33:7: Error: Applying the mixin 'M' to 'S with M1, M2' introduces an erroneous override of 'foo'.
// class B2 extends S with M1, M2, M {}
//       ^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:35:7: Error: Applying the mixin 'M' to 'S' introduces an erroneous override of 'foo'.
// class B0X extends S with M, MX {}
//       ^^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:37:7: Error: Applying the mixin 'M' to 'S with M1' introduces an erroneous override of 'foo'.
// class B1X extends S with M1, M, MX {}
//       ^^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
// pkg/front_end/testcases/general/mixin_application_override.dart:39:7: Error: Applying the mixin 'M' to 'S with M1, M2' introduces an erroneous override of 'foo'.
// class B2X extends S with M1, M2, M, MX {}
//       ^^^
// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
//   foo() {}
//   ^
// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
//   foo([x]) {}
//   ^
//
import self as self;
import "dart:core" as core;

class S extends core::Object {
  synthetic constructor •() → self::S
    : super core::Object::•()
    ;
  method foo([dynamic x = #C1]) → dynamic {}
}
class M extends core::Object {
  synthetic constructor •() → self::M
    : super core::Object::•()
    ;
  method foo() → dynamic {}
}
class M1 extends core::Object {
  synthetic constructor •() → self::M1
    : super core::Object::•()
    ;
}
class M2 extends core::Object {
  synthetic constructor •() → self::M2
    : super core::Object::•()
    ;
}
class MX extends core::Object {
  synthetic constructor •() → self::MX
    : super core::Object::•()
    ;
}
class A0 = self::S with self::M {
  synthetic constructor •() → self::A0
    : super self::S::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A1&S&M1
    : super self::S::•()
    ;
}
class A1 = self::_A1&S&M1 with self::M {
  synthetic constructor •() → self::A1
    : super self::_A1&S&M1::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A2&S&M1
    : super self::S::•()
    ;
}
abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A2&S&M1&M2
    : super self::_A2&S&M1::•()
    ;
}
class A2 = self::_A2&S&M1&M2 with self::M {
  synthetic constructor •() → self::A2
    : super self::_A2&S&M1&M2::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A0X&S&M
    : super self::S::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
class A0X = self::_A0X&S&M with self::MX {
  synthetic constructor •() → self::A0X
    : super self::_A0X&S&M::•()
    ;
}
abstract class _A1X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A1X&S&M1
    : super self::S::•()
    ;
}
abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A1X&S&M1&M
    : super self::_A1X&S&M1::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
class A1X = self::_A1X&S&M1&M with self::MX {
  synthetic constructor •() → self::A1X
    : super self::_A1X&S&M1&M::•()
    ;
}
abstract class _A2X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A2X&S&M1
    : super self::S::•()
    ;
}
abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A2X&S&M1&M2
    : super self::_A2X&S&M1::•()
    ;
}
abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_A2X&S&M1&M2&M
    : super self::_A2X&S&M1&M2::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
class A2X = self::_A2X&S&M1&M2&M with self::MX {
  synthetic constructor •() → self::A2X
    : super self::_A2X&S&M1&M2&M::•()
    ;
}
abstract class _B0&S&M = self::S with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B0&S&M
    : super self::S::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
class B0 extends self::_B0&S&M {
  synthetic constructor •() → self::B0
    : super self::_B0&S&M::•()
    ;
}
abstract class _B1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B1&S&M1
    : super self::S::•()
    ;
}
abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B1&S&M1&M
    : super self::_B1&S&M1::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
class B1 extends self::_B1&S&M1&M {
  synthetic constructor •() → self::B1
    : super self::_B1&S&M1&M::•()
    ;
}
abstract class _B2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2&S&M1
    : super self::S::•()
    ;
}
abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2&S&M1&M2
    : super self::_B2&S&M1::•()
    ;
}
abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2&S&M1&M2&M
    : super self::_B2&S&M1&M2::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
class B2 extends self::_B2&S&M1&M2&M {
  synthetic constructor •() → self::B2
    : super self::_B2&S&M1&M2&M::•()
    ;
}
abstract class _B0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B0X&S&M
    : super self::S::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B0X&S&M&MX
    : super self::_B0X&S&M::•()
    ;
}
class B0X extends self::_B0X&S&M&MX {
  synthetic constructor •() → self::B0X
    : super self::_B0X&S&M&MX::•()
    ;
}
abstract class _B1X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B1X&S&M1
    : super self::S::•()
    ;
}
abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B1X&S&M1&M
    : super self::_B1X&S&M1::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B1X&S&M1&M&MX
    : super self::_B1X&S&M1&M::•()
    ;
}
class B1X extends self::_B1X&S&M1&M&MX {
  synthetic constructor •() → self::B1X
    : super self::_B1X&S&M1&M&MX::•()
    ;
}
abstract class _B2X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2X&S&M1
    : super self::S::•()
    ;
}
abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2X&S&M1&M2
    : super self::_B2X&S&M1::•()
    ;
}
abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2X&S&M1&M2&M
    : super self::_B2X&S&M1&M2::•()
    ;
  mixin-super-stub method foo() → dynamic
    return super.{self::M::foo}();
}
abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_B2X&S&M1&M2&M&MX
    : super self::_B2X&S&M1&M2&M::•()
    ;
}
class B2X extends self::_B2X&S&M1&M2&M&MX {
  synthetic constructor •() → self::B2X
    : super self::_B2X&S&M1&M2&M&MX::•()
    ;
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
