/*
 * Copyright (c) 2018, 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.
 */
/**
 * @assertion A mixin declaration defines an interface. The interface for this
 * mixin declaration is equivalent to the interface of the class declared as:
 *  abstract class A<X extends S, Y extends T> extends A$super<X, Y>
 *    implements D, E { body' }
 * where body' contains abstract declarations corresponding to the instance
 * members of body of the mixin A.
 * . . .
 * This again means that the types of the implements clause must be subclassable
 * class types.
 *
 * @description Checks that types that from implements clause must be
 * subclassable class types.
 * @author ngl@unipro.ru
 */
typedef F = void Function(num);

class B {}
class C {}

mixin M1 on B, C implements void {}
// [error line 26, column 0]
// [analyzer] unspecified
// [cfe] unspecified
mixin M2 on B, C implements dynamic {}
//    ^
// [cfe] The type 'dynamic' can't be used as supertype.
//                          ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
mixin M3 on B, C implements FutureOr<List> {}
// [error line 35, column 0]
// [analyzer] unspecified
// [cfe] unspecified
mixin M4 on B, C implements F {}
//    ^
// [cfe] The type 'F' which is an alias of 'void Function(num)' can't be used as supertype.
//                          ^
// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
mixin M5 on B, C implements int {}
//    ^
// [cfe] 'int' is restricted and can't be extended or implemented.
//                          ^^^
// [analyzer] COMPILE_TIME_ERROR.SUBTYPE_OF_DISALLOWED_TYPE
mixin M6 on B, C implements bool {}
//    ^
// [cfe] 'bool' is restricted and can't be extended or implemented.
//                          ^^^^
// [analyzer] COMPILE_TIME_ERROR.SUBTYPE_OF_DISALLOWED_TYPE
mixin M7 on B, C implements Null {}
//    ^
// [cfe] 'Null' is restricted and can't be extended or implemented.
//                          ^^^^
// [analyzer] COMPILE_TIME_ERROR.SUBTYPE_OF_DISALLOWED_TYPE

main() {
}
