81 lines · cpp
1// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -verify %s2 3// We just want to try out a range for statement... this seems a bit OTT.4template<typename T>5class fakevector {6 T *contents;7 long size;8public:9 fakevector(long sz) : size(sz) {10 contents = new T[sz];11 }12 ~fakevector() {13 delete[] contents;14 }15 T& operator[](long x) { return contents[x]; }16 typedef T *iterator;17 fakevector<T>::iterator begin() {18 return &contents[0];19 }20 fakevector<T>::iterator end() {21 return &contents[size];22 }23};24 25void func( double *A, int N, int M, int NB ) {26#pragma omp parallel27 {28 int nblks = (N-1)/NB;29 int lnb = ((N-1)/NB)*NB;30#pragma omp for collapse(2)31 for (int jblk = 0 ; jblk < nblks ; jblk++ ) {32 int jb = (jblk == nblks - 1 ? lnb : NB);33 for (int jk = 0; jk < N; jk+=jb) { // expected-error{{cannot use variable 'jb' in collapsed imperfectly-nested loop increment statement}}34 }35 }36 37#pragma omp for collapse(2)38 for (int a = 0; a < N; a++) {39 for (int b = 0; b < M; b++) {40 int cx = a+b < NB ? a : b;41 for (int c = 0; c < cx; c++) {42 }43 }44 }45 46 fakevector<float> myvec{N};47#pragma omp for collapse(2)48 for (auto &a : myvec) {49 fakevector<float> myvec3{M};50 for (auto &b : myvec3) { // expected-error{{cannot use variable 'myvec3' in collapsed imperfectly-nested loop init statement}}51 }52 }53 54 fakevector<float> myvec2{M};55 56#pragma omp for collapse(3)57 for (auto &a : myvec) {58 for (auto &b : myvec2) {59 int cx = a < b ? N : M;60 for (int c = 0; c < cx; c++) { // expected-error {{cannot use variable 'cx' in collapsed imperfectly-nested loop condition statement}}61 }62 }63 }64 65#pragma omp for collapse(3)66 for (auto &a : myvec) {67 int cx = a < 5 ? M : N;68 for (auto &b : myvec2) {69 for (int c = 0; c < cx; c++) { // expected-error{{cannot use variable 'cx' in collapsed imperfectly-nested loop condition statement}}70 }71 }72 }73 }74}75 76int main(void) {77 double arr[256];78 func (arr, 16, 16, 16);79 return 0;80}81