library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.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.no_link.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 = #C1}) → 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
    : super self::_C&Object&A&B::•()
    ;
}
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 = #C1}) → 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 = #C1}) → core::String
    return super.{self::_E&Object&A::method}(i, s: s);
}
class E extends self::_E&Object&A&D {
  synthetic constructor •() → self::E
    : super self::_E&Object&A&D::•()
    ;
}
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 = #C1}) → 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
    : super self::_G&Object&A&F::•()
    ;
}
static method main() → dynamic {
  core::print(new self::C::•().{self::_C&Object&A&B::method}(0){(core::num) → core::String});
}

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

abstract class Interface extends core::Object {
  synthetic constructor •() → iss::Interface
    : super core::Object::•()
    ;
  abstract method method(core::num i) → core::String;
}
abstract class Interface2 extends core::Object {
  synthetic constructor •() → iss::Interface2
    : super core::Object::•()
    ;
  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
    return s;
}
abstract class B extends core::Object implements iss::Interface {
  synthetic constructor •() → iss::B
    : super core::Object::•()
    ;
  abstract method method(core::num i) → core::String;
}
abstract class D extends core::Object implements iss::Interface, iss::Interface2 {
  synthetic constructor •() → iss::D
    : super core::Object::•()
    ;
  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
    : super core::Object::•()
    ;
}

constants  {
  #C1 = "hello"
}
