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