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