// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

class M0 {
  factory M0(a, b, c) => null;
  factory M0.named() => null;
}

class M1 {
  M1();
}

class M2 {
  M2.named();
}

class C0 = Object with M0;
class C1 = Object with M1;
//    ^
// [cfe] Can't use 'M1' as a mixin because it has constructors.
//                     ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class C2 = Object with M2;
//    ^
// [cfe] Can't use 'M2' as a mixin because it has constructors.
//                     ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class C3 = Object with M0, M1;
//    ^
// [cfe] Can't use 'M1' as a mixin because it has constructors.
//                         ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class C4 = Object with M1, M0;
//    ^
// [cfe] Can't use 'M1' as a mixin because it has constructors.
//                     ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class C5 = Object with M0, M2;
//    ^
// [cfe] Can't use 'M2' as a mixin because it has constructors.
//                         ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class C6 = Object with M2, M0;
//    ^
// [cfe] Can't use 'M2' as a mixin because it has constructors.
//                     ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR

class D0 extends Object with M0 {}
class D1 extends Object with M1 { }
//    ^
// [cfe] Can't use 'M1' as a mixin because it has constructors.
//                           ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class D2 extends Object with M2 { }
//    ^
// [cfe] Can't use 'M2' as a mixin because it has constructors.
//                           ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class D3 extends Object with M0, M1 { }
//    ^
// [cfe] Can't use 'M1' as a mixin because it has constructors.
//                               ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class D4 extends Object with M1, M0 { }
//    ^
// [cfe] Can't use 'M1' as a mixin because it has constructors.
//                           ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class D5 extends Object with M0, M2 { }
//    ^
// [cfe] Can't use 'M2' as a mixin because it has constructors.
//                               ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR
class D6 extends Object with M2, M0 { }
//    ^
// [cfe] Can't use 'M2' as a mixin because it has constructors.
//                           ^^
// [analyzer] COMPILE_TIME_ERROR.MIXIN_CLASS_DECLARES_CONSTRUCTOR

main() {
  new C0();
  new C1();
  new C2();
  new C3();
  new C4();
  new C5();
  new C6();

  new D0();
  new D1();
  new D2();
  new D3();
  new D4();
  new D5();
  new D6();

  new C0(1,2,3);
  //     ^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
  //    ^^^^^^^
  // [cfe] Too many positional arguments: 0 allowed, but 3 found.
  new C0.named();
  //     ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NEW_WITH_UNDEFINED_CONSTRUCTOR
  // [cfe] Method not found: 'C0.named'.
  new D0(1,2,3);
  //     ^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
  //    ^^^^^^^
  // [cfe] Too many positional arguments: 0 allowed, but 3 found.
  new D0.named();
  //     ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NEW_WITH_UNDEFINED_CONSTRUCTOR
  // [cfe] Method not found: 'D0.named'.
}
