xref: /llvm-project/clang/test/OpenMP/loop_collapse_2.cpp (revision 3188e9b4e0f106abd683829906a21a98655bb794)
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