| // RUN: %clang_analyze_cc1 -analyzer-checker=optin.mpi.MPI-Checker -verify %s | |
| #include "MPIMock.h" | |
| // Use MPI-Checker to test 'getDescriptiveName', as the checker uses the | |
| // function for diagnostics. | |
| void testGetDescriptiveName() { | |
| int rank = 0; | |
| MPI_Comm_rank(MPI_COMM_WORLD, &rank); | |
| MPI_Request sendReq1; | |
| MPI_Wait(&sendReq1, MPI_STATUS_IGNORE); // expected-warning{{Request 'sendReq1' has no matching nonblocking call.}} | |
| } | |
| void testGetDescriptiveName2() { | |
| int rank = 0; | |
| MPI_Comm_rank(MPI_COMM_WORLD, &rank); | |
| MPI_Request sendReq1[10][10][10]; | |
| MPI_Wait(&sendReq1[1][7][9], MPI_STATUS_IGNORE); // expected-warning{{Request 'sendReq1[1][7][9]' has no matching nonblocking call.}} | |
| } | |
| void testGetDescriptiveName3() { | |
| int rank = 0; | |
| MPI_Comm_rank(MPI_COMM_WORLD, &rank); | |
| typedef struct { MPI_Request req; } ReqStruct; | |
| ReqStruct rs; | |
| MPI_Request *r = &rs.req; | |
| MPI_Wait(r, MPI_STATUS_IGNORE); // expected-warning{{Request 'rs.req' has no matching nonblocking call.}} | |
| } | |
| void testGetDescriptiveName4() { | |
| int rank = 0; | |
| MPI_Comm_rank(MPI_COMM_WORLD, &rank); | |
| typedef struct { MPI_Request req[2][2]; } ReqStruct; | |
| ReqStruct rs; | |
| MPI_Request *r = &rs.req[0][1]; | |
| MPI_Wait(r, MPI_STATUS_IGNORE); // expected-warning{{Request 'rs.req[0][1]' has no matching nonblocking call.}} | |
| } | |
| void testGetDescriptiveName5() { | |
| int rank = 0; | |
| MPI_Comm_rank(MPI_COMM_WORLD, &rank); | |
| typedef struct { MPI_Request req; } ReqStructInner; | |
| typedef struct { ReqStructInner req; } ReqStruct; | |
| ReqStruct rs; | |
| MPI_Request *r = &rs.req.req; | |
| MPI_Wait(r, MPI_STATUS_IGNORE); // expected-warning{{Request 'rs.req.req' has no matching nonblocking call.}} | |
| } |