// 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.}}
}
