1 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -verify %s 2 3 // We just want to try out a range for statement... this seems a bit OTT. 4 template<typename T> 5 class fakevector { 6 T *contents; 7 long size; 8 public: 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 25 void func( double *A, int N, int M, int NB ) { 26 #pragma omp parallel 27 { 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 76 int main(void) { 77 double arr[256]; 78 func (arr, 16, 16, 16); 79 return 0; 80 } 81