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