library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue41210b/issue41210.dart:7:7: Error: Applying the mixin 'B' to 'Object with A' introduces an erroneous override of 'method'.
// class C with A, B {} // error
//       ^
// pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart:18:10: Context: The method 'B.method' has fewer named arguments than those of overridden method 'Object with A.method'.
//   String method(num i);
//          ^
// pkg/front_end/testcases/general/issue41210b/issue41210.dart:7:7: Context: This is the overridden method ('method').
// class C with A, B {} // error
//       ^
//
import self as self;
import "dart:core" as core;
import "issue41210_lib.dart" as iss;

import "org-dartlang-testcase:///issue41210_lib.dart";

abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_C&Object&A
    : super core::Object::•()
    ;
  mixin-super-stub method method(core::num i, {core::String s}) → core::String
    return super.{iss::A::method}(i, s: s);
}
abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_C&Object&A&B
    : super self::_C&Object&A::•()
    ;
  abstract mixin-stub method method(core::num i) → core::String; -> iss::B::method
}
class C extends self::_C&Object&A&B {
  synthetic constructor •() → self::C
    ;
}
abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_E&Object&A
    : super core::Object::•()
    ;
  mixin-super-stub method method(core::num i, {core::String s}) → core::String
    return super.{iss::A::method}(i, s: s);
}
abstract class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_E&Object&A&D
    : super self::_E&Object&A::•()
    ;
  forwarding-stub method method(covariant-by-declaration core::num i, {core::String s}) → core::String
    return super.{self::_E&Object&A::method}(i, s: s);
}
class E extends self::_E&Object&A&D {
  synthetic constructor •() → self::E
    ;
}
abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_G&Object&A
    : super core::Object::•()
    ;
  mixin-super-stub method method(core::num i, {core::String s}) → core::String
    return super.{iss::A::method}(i, s: s);
}
abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_G&Object&A&F
    : super self::_G&Object&A::•()
    ;
}
class G extends self::_G&Object&A&F {
  synthetic constructor •() → self::G
    ;
}
static method main() → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as iss;
import "dart:core" as core;

abstract class Interface extends core::Object {
  synthetic constructor •() → iss::Interface
    ;
  abstract method method(core::num i) → core::String;
}
abstract class Interface2 extends core::Object {
  synthetic constructor •() → iss::Interface2
    ;
  abstract method method(covariant-by-declaration core::int i) → core::String;
}
abstract class A extends core::Object implements iss::Interface /*isMixinDeclaration*/  {
  method method(core::num i, {core::String s = #C1}) → core::String
    ;
}
abstract class B extends core::Object implements iss::Interface {
  synthetic constructor •() → iss::B
    ;
  abstract method method(core::num i) → core::String;
}
abstract class D extends core::Object implements iss::Interface, iss::Interface2 {
  synthetic constructor •() → iss::D
    ;
  abstract forwarding-stub method method(covariant-by-declaration core::num i) → core::String;
}
abstract class F extends core::Object implements iss::Interface {
  synthetic constructor •() → iss::F
    ;
}

constants  {
  #C1 = "hello"
}
