| 1 | // RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify %s |
| 2 | |
| 3 | struct A {}; |
| 4 | |
| 5 | typedef struct A *MPI_Datatype; |
| 6 | |
| 7 | extern struct A datatype_wrong1 [[clang::type_tag_for_datatype]]; // expected-error {{'type_tag_for_datatype' attribute requires parameter 1 to be an identifier}} |
| 8 | |
| 9 | extern struct A datatype_wrong2 [[clang::type_tag_for_datatype(mpi,1,2)]]; // expected-error {{expected a type}} |
| 10 | |
| 11 | extern struct A datatype_wrong3 [[clang::type_tag_for_datatype(mpi,not_a_type)]]; // expected-error {{unknown type name 'not_a_type'}} |
| 12 | |
| 13 | extern struct A datatype_wrong4 [[clang::type_tag_for_datatype(mpi,int,int)]]; // expected-error {{expected identifier}} |
| 14 | |
| 15 | extern struct A datatype_wrong5 [[clang::type_tag_for_datatype(mpi,int,not_a_flag)]]; // expected-error {{invalid comparison flag 'not_a_flag'}} |
| 16 | |
| 17 | extern struct A datatype_wrong6 [[clang::type_tag_for_datatype(mpi,int,layout_compatible,not_a_flag)]]; // expected-error {{invalid comparison flag 'not_a_flag'}} |
| 18 | |
| 19 | extern struct A A_tag [[clang::type_tag_for_datatype(a,int)]]; |
| 20 | extern struct A B_tag [[clang::type_tag_for_datatype(b,int)]]; |
| 21 | |
| 22 | static const int C_tag [[clang::type_tag_for_datatype(c,int)]] = 10; |
| 23 | static const int D_tag [[clang::type_tag_for_datatype(d,int)]] = 20; |
| 24 | |
| 25 | [[clang::pointer_with_type_tag]] // expected-error {{'pointer_with_type_tag' attribute requires exactly 3 arguments}} |
| 26 | int wrong1(void *buf, MPI_Datatype datatype); |
| 27 | |
| 28 | [[clang::pointer_with_type_tag(mpi,0,7)]] // expected-error {{attribute parameter 2 is out of bounds}} |
| 29 | int wrong2(void *buf, MPI_Datatype datatype); |
| 30 | |
| 31 | [[clang::pointer_with_type_tag(mpi,3,7)]] // expected-error {{attribute parameter 2 is out of bounds}} |
| 32 | int wrong3(void *buf, MPI_Datatype datatype); |
| 33 | |
| 34 | [[clang::pointer_with_type_tag(mpi,1,0)]] // expected-error {{attribute parameter 3 is out of bounds}} |
| 35 | int wrong4(void *buf, MPI_Datatype datatype); |
| 36 | |
| 37 | [[clang::pointer_with_type_tag(mpi,1,3)]] // expected-error {{attribute parameter 3 is out of bounds}} |
| 38 | int wrong5(void *buf, MPI_Datatype datatype); |
| 39 | |
| 40 | [[clang::pointer_with_type_tag(mpi,0x8000000000000001ULL,1)]] // expected-error {{attribute parameter 2 is out of bounds}} |
| 41 | int wrong6(void *buf, MPI_Datatype datatype); |
| 42 | |
| 43 | [[clang::pointer_with_type_tag(a,1,2)]] void A_func(void *ptr, void *tag); |
| 44 | [[clang::pointer_with_type_tag(c,1,2)]] void C_func(void *ptr, int tag); |
| 45 | |
| 46 | |