| /* |
| * 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() {} |