| // Copyright (c) 2019, 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 generic function declaration introduces a generic function into |
| /// the enclosing scope. Consider a function invocation expression of the form |
| /// [f<T1, . . . , Tl>(...)], where the static type of [f] is a generic function |
| /// type with formal type parameters [X1 extends B1], . . . , [Xm extends Bm]. |
| /// ... |
| /// It is a compile-time error if there exists a [j] such that [Tj] is not a |
| /// subtype of [T1/X1, . . . , Tm/Xm]Bj. |
| /// @description checks that error appears if some parameter type is incorrect. |
| /// @author iarkh@unipro.ru |
| |
| |
| class A {} |
| class B extends A {} |
| class C extends B {} |
| class D {} |
| |
| void testme1<T>() {} |
| void testme2<T extends A>() {} |
| void testme3<T extends B>() {} |
| void testme4<T extends C>() {} |
| void testme5<T extends D>() {} |
| |
| |
| main() { |
| testme1<A>(); |
| testme1<B>(); |
| testme1<C>(); |
| testme1<D>(); |
| |
| testme2<A>(); |
| testme2<B>(); |
| testme2<C>(); |
| testme2<D>(); |
| //^ |
| // [cfe] Type argument 'D' doesn't conform to the bound 'A' of the type variable 'T' on 'testme2'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| |
| testme3<A>(); |
| //^ |
| // [cfe] Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'testme3'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| testme3<B>(); |
| testme3<C>(); |
| testme3<D>(); |
| //^ |
| // [cfe] Type argument 'D' doesn't conform to the bound 'B' of the type variable 'T' on 'testme3'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| |
| testme4<A>(); |
| //^ |
| // [cfe] Type argument 'A' doesn't conform to the bound 'C' of the type variable 'T' on 'testme4'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| testme4<B>(); |
| //^ |
| // [cfe] Type argument 'B' doesn't conform to the bound 'C' of the type variable 'T' on 'testme4'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| testme4<C>(); |
| testme4<D>(); |
| //^ |
| // [cfe] Type argument 'D' doesn't conform to the bound 'C' of the type variable 'T' on 'testme4'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| |
| testme5<A>(); |
| //^ |
| // [cfe] Type argument 'A' doesn't conform to the bound 'D' of the type variable 'T' on 'testme5'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| testme5<B>(); |
| //^ |
| // [cfe] Type argument 'B' doesn't conform to the bound 'D' of the type variable 'T' on 'testme5'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| testme5<C>(); |
| //^ |
| // [cfe] Type argument 'C' doesn't conform to the bound 'D' of the type variable 'T' on 'testme5'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS |
| testme5<D>(); |
| } |