10d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// RUN: %clang_cc1 -std=c99 -DOPEN_MPI -fsyntax-only -verify %s 20d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// RUN: %clang_cc1 -std=c99 -DMPICH -fsyntax-only -verify %s 30d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// RUN: %clang_cc1 -x c++ -std=c++98 -DOPEN_MPI -fsyntax-only -verify %s 40d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// RUN: %clang_cc1 -x c++ -std=c++98 -DMPICH -fsyntax-only -verify %s 50d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// 60d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// RUN: %clang_cc1 -std=c99 -DOPEN_MPI -fno-signed-char -fsyntax-only -verify %s 70d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// RUN: %clang_cc1 -std=c99 -DMPICH -fno-signed-char -fsyntax-only -verify %s 80d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 90d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko//===--- limits.h mock ----------------------------------------------------===// 100d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 110d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef __CHAR_UNSIGNED__ 120d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define CHAR_MIN 0 130d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define CHAR_MAX (__SCHAR_MAX__*2 +1) 140d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#else 150d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define CHAR_MIN (-__SCHAR_MAX__-1) 160d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define CHAR_MAX __SCHAR_MAX__ 170d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 180d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 190d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko//===--- mpi.h mock -------------------------------------------------------===// 200d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 210d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define NULL ((void *)0) 220d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 230d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef OPEN_MPI 240d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkotypedef struct ompi_datatype_t *MPI_Datatype; 250d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 260d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 270d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef MPICH 280d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkotypedef int MPI_Datatype; 290d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 300d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 310d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoint MPI_Send(void *buf, int count, MPI_Datatype datatype) 320d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( pointer_with_type_tag(mpi,1,3) )); 330d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 340d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoint MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, 350d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko void *recvbuf, int recvcount, MPI_Datatype recvtype) 360d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( pointer_with_type_tag(mpi,1,3), pointer_with_type_tag(mpi,4,6) )); 370d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 380d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef OPEN_MPI 390d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// OpenMPI and LAM/MPI-style datatype definitions 400d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 410d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define OMPI_PREDEFINED_GLOBAL(type, global) ((type) &(global)) 420d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 430d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_DATATYPE_NULL OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_datatype_null) 440d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_FLOAT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_float) 450d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_INT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_int) 460d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_LONG OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_long) 470d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_LONG_LONG_INT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_long_long_int) 480d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_CHAR OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_char) 490d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 500d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_FLOAT_INT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_float_int) 510d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_2INT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_2int) 520d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 530d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_IN_PLACE ((void *) 1) 540d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 550d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_datatype_null __attribute__(( type_tag_for_datatype(mpi,void,must_be_null) )); 560d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_float __attribute__(( type_tag_for_datatype(mpi,float) )); 570d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_int __attribute__(( type_tag_for_datatype(mpi,int) )); 580d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_long __attribute__(( type_tag_for_datatype(mpi,long) )); 590d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_long_long_int __attribute__(( type_tag_for_datatype(mpi,long long int) )); 600d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_char __attribute__(( type_tag_for_datatype(mpi,char) )); 610d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 620d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct ompi_struct_mpi_float_int {float f; int i;}; 630d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_float_int __attribute__(( type_tag_for_datatype(mpi, struct ompi_struct_mpi_float_int, layout_compatible) )); 640d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 650d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct ompi_struct_mpi_2int {int i1; int i2;}; 660d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkoextern struct ompi_predefined_datatype_t ompi_mpi_2int __attribute__(( type_tag_for_datatype(mpi, struct ompi_struct_mpi_2int, layout_compatible) )); 670d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 680d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 690d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef MPICH 700d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// MPICH2 and MVAPICH2-style datatype definitions 710d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 720d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_COMM_WORLD ((MPI_Comm) 0x44000000) 730d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 740d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_DATATYPE_NULL ((MPI_Datatype) 0xa0000000) 750d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_FLOAT ((MPI_Datatype) 0xa0000001) 760d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_INT ((MPI_Datatype) 0xa0000002) 770d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_LONG ((MPI_Datatype) 0xa0000003) 780d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_LONG_LONG_INT ((MPI_Datatype) 0xa0000004) 790d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_CHAR ((MPI_Datatype) 0xa0000005) 800d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 810d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_FLOAT_INT ((MPI_Datatype) 0xa0000006) 820d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_2INT ((MPI_Datatype) 0xa0000007) 830d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 840d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_IN_PLACE (void *) -1 850d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 860d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_datatype_null __attribute__(( type_tag_for_datatype(mpi,void,must_be_null) )) = 0xa0000000; 870d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_float __attribute__(( type_tag_for_datatype(mpi,float) )) = 0xa0000001; 880d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_int __attribute__(( type_tag_for_datatype(mpi,int) )) = 0xa0000002; 890d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_long __attribute__(( type_tag_for_datatype(mpi,long) )) = 0xa0000003; 900d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_long_long_int __attribute__(( type_tag_for_datatype(mpi,long long int) )) = 0xa0000004; 910d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_char __attribute__(( type_tag_for_datatype(mpi,char) )) = 0xa0000005; 920d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 930d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct mpich_struct_mpi_float_int { float f; int i; }; 940d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct mpich_struct_mpi_2int { int i1; int i2; }; 950d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_float_int __attribute__(( type_tag_for_datatype(mpi, struct mpich_struct_mpi_float_int, layout_compatible) )) = 0xa0000006; 960d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostatic const MPI_Datatype mpich_mpi_2int __attribute__(( type_tag_for_datatype(mpi, struct mpich_struct_mpi_2int, layout_compatible) )) = 0xa0000007; 970d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 980d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 990d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko//===--- HDF5 headers mock ------------------------------------------------===// 1000d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1010d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkotypedef int hid_t; 1020d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid H5open(void); 1030d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1040d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifndef HDF_PRIVATE 1050d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5OPEN H5open(), 1060d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#else 1070d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5OPEN 1080d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 1090d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1100d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5T_NATIVE_CHAR (CHAR_MIN?H5T_NATIVE_SCHAR:H5T_NATIVE_UCHAR) 1110d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5T_NATIVE_SCHAR (H5OPEN H5T_NATIVE_SCHAR_g) 1120d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5T_NATIVE_UCHAR (H5OPEN H5T_NATIVE_UCHAR_g) 1130d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5T_NATIVE_INT (H5OPEN H5T_NATIVE_INT_g) 1140d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define H5T_NATIVE_LONG (H5OPEN H5T_NATIVE_LONG_g) 1150d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1160d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkohid_t H5T_NATIVE_SCHAR_g __attribute__(( type_tag_for_datatype(hdf5,signed char) )); 1170d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkohid_t H5T_NATIVE_UCHAR_g __attribute__(( type_tag_for_datatype(hdf5,unsigned char) )); 1180d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkohid_t H5T_NATIVE_INT_g __attribute__(( type_tag_for_datatype(hdf5,int) )); 1190d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkohid_t H5T_NATIVE_LONG_g __attribute__(( type_tag_for_datatype(hdf5,long) )); 1200d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1210d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid H5Dwrite(hid_t mem_type_id, const void *buf) __attribute__(( pointer_with_type_tag(hdf5,2,1) )); 1220d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1230d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko//===--- Tests ------------------------------------------------------------===// 1240d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1250d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko//===--- MPI 1260d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1270d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct pair_float_int 1280d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 1290d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko float f; int i; 1300d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko}; 1310d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1320d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct pair_int_int 1330d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 1340d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko int i1; int i2; 1350d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko}; 1360d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1370d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid test_mpi_predefined_types( 1380d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko int *int_buf, 1390d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko long *long_buf1, 1400d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko long *long_buf2, 1410d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko void *void_buf, 1420d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko struct pair_float_int *pfi, 1430d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko struct pair_int_int *pii) 1440d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 1450d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko char char_buf[255]; 1460d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1470d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Layout-compatible scalar types. 1480d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(int_buf, 1, MPI_INT); // no-warning 1490d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1505a24980d059cd9fbe8375a4c549313101ad20698Dmitri Gribenko // Null pointer constant. 1515a24980d059cd9fbe8375a4c549313101ad20698Dmitri Gribenko MPI_Send(0, 0, MPI_INT); // no-warning 1525a24980d059cd9fbe8375a4c549313101ad20698Dmitri Gribenko MPI_Send(NULL, 0, MPI_INT); // no-warning 1535a24980d059cd9fbe8375a4c549313101ad20698Dmitri Gribenko 1540d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Layout-compatible class types. 1550d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(pfi, 1, MPI_FLOAT_INT); // no-warning 1560d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(pii, 1, MPI_2INT); // no-warning 1570d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1580d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Layout-incompatible scalar types. 1590d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(long_buf1, 1, MPI_INT); // expected-warning {{argument type 'long *' doesn't match specified 'mpi' type tag that requires 'int *'}} 1600d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1610d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Layout-incompatible class types. 1620d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(pii, 1, MPI_FLOAT_INT); // expected-warning {{argument type 'struct pair_int_int *' doesn't match specified 'mpi' type tag}} 1630d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(pfi, 1, MPI_2INT); // expected-warning {{argument type 'struct pair_float_int *' doesn't match specified 'mpi' type tag}} 1640d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1650d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Layout-incompatible class-scalar types. 1660d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(long_buf1, 1, MPI_2INT); // expected-warning {{argument type 'long *' doesn't match specified 'mpi' type tag}} 1670d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1680d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Function with two buffers. 1690d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Gather(long_buf1, 1, MPI_INT, // expected-warning {{argument type 'long *' doesn't match specified 'mpi' type tag that requires 'int *'}} 1700d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko long_buf2, 1, MPI_INT); // expected-warning {{argument type 'long *' doesn't match specified 'mpi' type tag that requires 'int *'}} 1710d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1720d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Array buffers should work like pointer buffers. 1730d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(char_buf, 255, MPI_CHAR); // no-warning 1740d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1750d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Explicit casts should not be dropped. 1760d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send((int *) char_buf, 255, MPI_INT); // no-warning 1770d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send((int *) char_buf, 255, MPI_CHAR); // expected-warning {{argument type 'int *' doesn't match specified 'mpi' type tag that requires 'char *'}} 1780d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1790d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // `void*' buffer should never warn. 1800d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(void_buf, 255, MPI_CHAR); // no-warning 1810d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1820d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // We expect that MPI_IN_PLACE is `void*', shouldn't warn. 1830d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Gather(MPI_IN_PLACE, 0, MPI_INT, 1840d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko int_buf, 1, MPI_INT); 1850d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1860d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Special handling for MPI_DATATYPE_NULL: buffer pointer should be either 1870d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // a `void*' pointer or a null pointer constant. 1880d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Gather(NULL, 0, MPI_DATATYPE_NULL, // no-warning 1890d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko int_buf, 1, MPI_INT); 1900d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1910d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Gather(int_buf, 0, MPI_DATATYPE_NULL, // expected-warning {{specified mpi type tag requires a null pointer}} 1920d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko int_buf, 1, MPI_INT); 1930d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko} 1940d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1950d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_int_datatype __attribute__(( type_tag_for_datatype(mpi,int) )); 1960d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 1970d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S1 { int a; int b; }; 1980d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_s1_datatype __attribute__(( type_tag_for_datatype(mpi,struct S1) )); 1990d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2000d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// Layout-compatible to S1, but should be treated as a different type. 2010d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S2 { int a; int b; }; 2020d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_s2_datatype __attribute__(( type_tag_for_datatype(mpi,struct S2) )); 2030d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 204ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenkoenum E1 { Foo }; 205ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri GribenkoMPI_Datatype my_e1_datatype __attribute__(( type_tag_for_datatype(mpi,enum E1) )); 206ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko 2070d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid test_user_types(int *int_buf, 2080d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko long *long_buf, 2090d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko struct S1 *s1_buf, 210ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko struct S2 *s2_buf, 211ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko enum E1 *e1_buf) 2120d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 2130d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(int_buf, 1, my_int_datatype); // no-warning 2140d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(long_buf, 1, my_int_datatype); // expected-warning {{argument type 'long *' doesn't match specified 'mpi' type tag that requires 'int *'}} 2150d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2160d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s1_buf, 1, my_s1_datatype); // no-warning 2170d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s1_buf, 1, my_s2_datatype); // expected-warning {{argument type 'struct S1 *' doesn't match specified 'mpi' type tag that requires 'struct S2 *'}} 2180d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2190d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(long_buf, 1, my_s1_datatype); // expected-warning {{argument type 'long *' doesn't match specified 'mpi' type tag that requires 'struct S1 *'}} 2200d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s1_buf, 1, MPI_INT); // expected-warning {{argument type 'struct S1 *' doesn't match specified 'mpi' type tag that requires 'int *'}} 221ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko 222ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko MPI_Send(e1_buf, 1, my_e1_datatype); // no-warning 223ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko MPI_Send(e1_buf, 1, MPI_INT); // expected-warning {{argument type 'enum E1 *' doesn't match specified 'mpi' type tag that requires 'int *'}} 224ee3d9f0be3d2080abb1cf76d7d327a044791b22aDmitri Gribenko MPI_Send(int_buf, 1, my_e1_datatype); // expected-warning {{argument type 'int *' doesn't match specified 'mpi' type tag that requires 'enum E1 *'}} 2250d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko} 2260d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2270d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_unknown_datatype; 2280d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2290d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid test_not_annotated(int *int_buf, 2300d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko long *long_buf, 2310d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Datatype type) 2320d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 2330d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // Using 'MPI_Datatype's without attributes should not produce warnings. 2340d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(long_buf, 1, my_unknown_datatype); // no-warning 2350d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(int_buf, 1, type); // no-warning 2360d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko} 2370d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2380d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S1_compat { int a; int b; }; 2390d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_s1_compat_datatype 2400d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( type_tag_for_datatype(mpi, struct S1_compat, layout_compatible) )); 2410d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2420d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S3 { int a; long b; double c; double d; struct S1 s1; }; 2430d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S3_compat { int a; long b; double c; double d; struct S2 s2; }; 2440d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_s3_compat_datatype 2450d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( type_tag_for_datatype(mpi, struct S3_compat, layout_compatible) )); 2460d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2470d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S4 { char c; }; 2480d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkostruct S4_compat { signed char c; }; 2490d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_s4_compat_datatype 2500d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( type_tag_for_datatype(mpi, struct S4_compat, layout_compatible) )); 2510d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2520d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkounion U1 { int a; long b; double c; double d; struct S1 s1; }; 2530d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkounion U1_compat { long b; double c; struct S2 s; int a; double d; }; 2540d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_u1_compat_datatype 2550d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( type_tag_for_datatype(mpi, union U1_compat, layout_compatible) )); 2560d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2570d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkounion U2 { int a; long b; double c; struct S1 s1; }; 2580d5a069f66df09b3308ccfdce84a88170034c657Dmitri GribenkoMPI_Datatype my_u2_datatype 2590d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko __attribute__(( type_tag_for_datatype(mpi, union U2, layout_compatible) )); 2600d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2610d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid test_layout_compatibility(struct S1 *s1_buf, struct S3 *s3_buf, 2620d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko struct S4 *s4_buf, 2630d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko union U1 *u1_buf, union U2 *u2_buf) 2640d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 2650d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s1_buf, 1, my_s1_compat_datatype); // no-warning 2660d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s3_buf, 1, my_s3_compat_datatype); // no-warning 2670d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s1_buf, 1, my_s3_compat_datatype); // expected-warning {{argument type 'struct S1 *' doesn't match specified 'mpi' type tag}} 2680d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(s4_buf, 1, my_s4_compat_datatype); // expected-warning {{argument type 'struct S4 *' doesn't match specified 'mpi' type tag}} 2690d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(u1_buf, 1, my_u1_compat_datatype); // no-warning 2700d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(u1_buf, 1, my_u2_datatype); // expected-warning {{argument type 'union U1 *' doesn't match specified 'mpi' type tag}} 2710d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(u2_buf, 1, my_u1_compat_datatype); // expected-warning {{argument type 'union U2 *' doesn't match specified 'mpi' type tag}} 2720d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko} 2730d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2740d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// There is an MPI_REAL predefined in MPI, but some existing MPI programs do 2750d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko// this. 2760d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkotypedef float real; 2770d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#define MPI_REAL MPI_FLOAT 2780d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2790d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid test_mpi_real_user_type(real *real_buf, float *float_buf) 2800d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 2810d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(real_buf, 1, MPI_REAL); // no-warning 2820d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(real_buf, 1, MPI_FLOAT); // no-warning 2830d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(float_buf, 1, MPI_REAL); // no-warning 2840d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko MPI_Send(float_buf, 1, MPI_FLOAT); // no-warning 2850d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko} 2860d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2870d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko//===--- HDF5 2880d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 2890d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenkovoid test_hdf5(char *char_buf, 2900d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko signed char *schar_buf, 2910d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko unsigned char *uchar_buf, 2920d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko int *int_buf, 2930d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko long *long_buf) 2940d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko{ 2950d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, char_buf); // no-warning 2960d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef __CHAR_UNSIGNED__ 2970d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, schar_buf); // expected-warning {{argument type 'signed char *' doesn't match specified 'hdf5' type tag that requires 'unsigned char *'}} 2980d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, uchar_buf); // no-warning 2990d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#else 3000d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, schar_buf); // no-warning 3010d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, uchar_buf); // expected-warning {{argument type 'unsigned char *' doesn't match specified 'hdf5' type tag that requires 'signed char *'}} 3020d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 3030d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_SCHAR, schar_buf); // no-warning 3040d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_UCHAR, uchar_buf); // no-warning 3050d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_INT, int_buf); // no-warning 3060d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_LONG, long_buf); // no-warning 3070d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 3080d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#ifdef __CHAR_UNSIGNED__ 3090d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, int_buf); // expected-warning {{argument type 'int *' doesn't match specified 'hdf5' type tag that requires 'unsigned char *'}} 3100d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#else 3110d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_CHAR, int_buf); // expected-warning {{argument type 'int *' doesn't match specified 'hdf5' type tag that requires 'signed char *'}} 3120d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko#endif 3130d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko H5Dwrite(H5T_NATIVE_INT, long_buf); // expected-warning {{argument type 'long *' doesn't match specified 'hdf5' type tag that requires 'int *'}} 3140d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 3150d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // FIXME: we should warn here, but it will cause false positives because 3160d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko // different kinds may use same magic values. 3170d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko //H5Dwrite(MPI_INT, int_buf); 3180d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko} 3190d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko 320