warn-type-safety.cpp revision 0d5a069f66df09b3308ccfdce84a88170034c657
1// RUN: %clang_cc1 -fsyntax-only -verify %s 2 3typedef struct ompi_datatype_t *MPI_Datatype; 4 5#define OMPI_PREDEFINED_GLOBAL(type, global) ((type) &(global)) 6 7#define MPI_FLOAT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_float) 8#define MPI_INT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_int) 9#define MPI_NULL OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_null) 10 11extern struct ompi_predefined_datatype_t ompi_mpi_float __attribute__(( type_tag_for_datatype(mpi,float) )); 12extern struct ompi_predefined_datatype_t ompi_mpi_int __attribute__(( type_tag_for_datatype(mpi,int) )); 13extern struct ompi_predefined_datatype_t ompi_mpi_null __attribute__(( type_tag_for_datatype(mpi,void,must_be_null) )); 14 15int f(int x) { return x; } 16static const int wrong_init __attribute__(( type_tag_for_datatype(zzz,int) )) = f(100); // expected-error {{'type_tag_for_datatype' attribute requires the initializer to be an integral constant expression}} 17 18//===--- Tests ------------------------------------------------------------===// 19// Check that hidden 'this' is handled correctly. 20 21class C 22{ 23public: 24 void f1(void *buf, int count, MPI_Datatype datatype) 25 __attribute__(( pointer_with_type_tag(mpi,5,6) )); // expected-error {{attribute parameter 2 is out of bounds}} 26 27 void f2(void *buf, int count, MPI_Datatype datatype) 28 __attribute__(( pointer_with_type_tag(mpi,2,5) )); // expected-error {{attribute parameter 3 is out of bounds}} 29 30 void f3(void *buf, int count, MPI_Datatype datatype) 31 __attribute__(( pointer_with_type_tag(mpi,1,5) )); // expected-error {{attribute is invalid for the implicit this argument}} 32 33 void f4(void *buf, int count, MPI_Datatype datatype) 34 __attribute__(( pointer_with_type_tag(mpi,2,1) )); // expected-error {{attribute is invalid for the implicit this argument}} 35 36 void MPI_Send(void *buf, int count, MPI_Datatype datatype) 37 __attribute__(( pointer_with_type_tag(mpi,2,4) )); // no-error 38}; 39 40// Check that we don't crash on type and value dependent expressions. 41template<int a> 42void value_dep(void *buf, int count, MPI_Datatype datatype) 43 __attribute__(( pointer_with_type_tag(mpi,a,5) )); // expected-error {{attribute requires parameter 2 to be an integer constant}} 44 45class OperatorIntStar 46{ 47public: 48 operator int*(); 49}; 50 51void test1(C *c, int *int_buf) 52{ 53 c->MPI_Send(int_buf, 1, MPI_INT); // no-warning 54 c->MPI_Send(int_buf, 1, MPI_FLOAT); // expected-warning {{argument type 'int *' doesn't match specified 'mpi' type tag that requires 'float *'}} 55 56 OperatorIntStar i; 57 c->MPI_Send(i, 1, MPI_INT); // no-warning 58 c->MPI_Send(i, 1, MPI_FLOAT); // expected-warning {{argument type 'int *' doesn't match specified 'mpi' type tag that requires 'float *'}} 59} 60 61template<typename T> 62void test2(C *c, int *int_buf, T tag) 63{ 64 c->MPI_Send(int_buf, 1, tag); // no-warning 65} 66 67void test3(C *c, int *int_buf) { 68 test2(c, int_buf, MPI_INT); 69 test2(c, int_buf, MPI_NULL); 70} 71 72