// Copyright (c) 2020, 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 If a class [C] in a legacy library implements the same generic
 * class [I] more than once, it is an error if the [LEGACY_ERASURE] of all such
 * super-interfaces are not all syntactically equal. For the purposes of runtime
 * subtyping checks, [C] is considered to implement the canonical
 * [LEGACY_ERASURE] of the super-interfaces in question.
 *
 * Using the legacy erasure for checking super-interfaces accounts for opted-out
 * classes which depend on both opted-in and opted-out versions of the same
 * generic interface.
 *
 *  //opted in
 *  class I<T> {}
 *
 *  // opted in
 *  class A implements I<int?> {}
 *
 *  // opted out
 *  class B implements I<int> {}
 *
 *  // opted out
 *  class C extends A implements B {}
 *
 *  The class [C] is not considered erroneous, despite implementing both
 *  [I<int?>] and [I<int*>], since legacy erasure makes both of those interfaces
 *  equal. The canonical interface which [C] is chosen to implement for the
 *  purposes of runtime type checks is [I<int*>].
 *
 * @description Check that error occurs if a class implements the same generic
 * class more than once the [LEGACY_ERASURE] of all such super-interfaces are
 * not all syntactically equal and all passes otherwise. Test [Function] legacy
 * type parameter.
 *
 * @author iarkh@unipro.ru
 */
// Requirements=nnbd-weak
// @dart=2.6

import "override_checking_A05_opted_in_lib.dart";

class B implements A<Function> {}

class B_nullable_Function extends in_nullable_Function implements B {}
class B_Function          extends in_Function          implements B {}

class B_nullable_int extends in_nullable_int implements B {}
//    ^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_nullable_Object extends in_Nullable_Object implements B {}
//    ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_int extends in_int implements B {}
//    ^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_Object extends in_Object implements B {}
//    ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_dynamic extends in_dynamic implements B {}
//    ^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_void extends in_void implements B {}
//    ^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_Null extends in_Null implements B {}
//    ^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_Never extends in_Never implements B {}
//    ^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_FutureOr extends in_FutureOr implements B {}
//    ^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_FutureOr_int extends in_FutureOr_int implements B {}
//    ^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

class B_FutureOr_FutureOr extends in_FutureOr_FutureOr implements B {}
//    ^^^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

main() {}
