1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
4 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -DOMP5 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
5 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
6 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
7 
8 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
9 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
10 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
11 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
12 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
13 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
14 // expected-no-diagnostics
15 
16 #ifndef HEADER
17 #define HEADER
18 
19 void foo() {}
20 
21 struct S {
22   S(): a(0) {}
23   S(int v) : a(v) {}
24   int a;
25   typedef int type;
26 };
27 
28 template <typename T>
29 class S7 : public T {
30 protected:
31   T a;
32   S7() : a(0) {}
33 
34 public:
35   S7(typename T::type v) : a(v) {
36 #pragma omp target simd private(a) private(this->a) private(T::a)
37     for (int k = 0; k < a.a; ++k)
38       ++this->a.a;
39   }
40   S7 &operator=(S7 &s) {
41 #pragma omp target simd private(a) private(this->a)
42     for (int k = 0; k < s.a.a; ++k)
43       ++s.a.a;
44     return *this;
45   }
46 };
47 
48 // CHECK: #pragma omp target simd private(this->a) private(this->a) private(T::a){{$}}
49 // CHECK: #pragma omp target simd private(this->a) private(this->a)
50 // CHECK: #pragma omp target simd private(this->a) private(this->a) private(this->S::a)
51 
52 class S8 : public S7<S> {
53   S8() {}
54 
55 public:
56   S8(int v) : S7<S>(v){
57 #pragma omp target simd private(a) private(this->a) private(S7<S>::a)
58     for (int k = 0; k < a.a; ++k)
59       ++this->a.a;
60   }
61   S8 &operator=(S8 &s) {
62 #pragma omp target simd private(a) private(this->a)
63     for (int k = 0; k < s.a.a; ++k)
64       ++s.a.a;
65     return *this;
66   }
67 };
68 
69 // CHECK: #pragma omp target simd private(this->a) private(this->a) private(this->S7<S>::a)
70 // CHECK: #pragma omp target simd private(this->a) private(this->a)
71 
72 template <class T, int N>
73 T tmain(T argc, T *argv) {
74   T b = argc, c, d, e, f, h;
75   T arr[N][10], arr1[N];
76   T i, j;
77   T s;
78   static T a;
79 // CHECK: static T a;
80   static T g;
81   const T clen = 5;
82 // CHECK: T clen = 5;
83   T *p;
84 #pragma omp threadprivate(g)
85 #pragma omp target simd linear(a) allocate(a)
86   // CHECK: #pragma omp target simd linear(a) allocate(a)
87   for (T i = 0; i < 2; ++i)
88     a = 2;
89 // CHECK-NEXT: for (T i = 0; i < 2; ++i)
90 // CHECK-NEXT: a = 2;
91 #pragma omp target simd allocate(f) private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) if (target :argc) reduction(+ : h)
92   for (int i = 0; i < 2; ++i)
93     for (int j = 0; j < 2; ++j)
94       for (int j = 0; j < 2; ++j)
95         for (int j = 0; j < 2; ++j)
96           for (int j = 0; j < 2; ++j)
97             foo();
98   // CHECK-NEXT: #pragma omp target simd allocate(f) private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) if(target: argc) reduction(+: h)
99   // CHECK-NEXT: for (int i = 0; i < 2; ++i)
100   // CHECK-NEXT: for (int j = 0; j < 2; ++j)
101   // CHECK-NEXT: for (int j = 0; j < 2; ++j)
102   // CHECK-NEXT: for (int j = 0; j < 2; ++j)
103   // CHECK-NEXT: for (int j = 0; j < 2; ++j)
104   // CHECK-NEXT: foo();
105 
106 #pragma omp target simd private(argc,b) firstprivate(argv) if(target:argc > 0) reduction(+:c, arr1[argc]) reduction(max:e, arr[:N][0:10])
107   for (T i = 0; i < 2; ++i) {}
108   // CHECK: #pragma omp target simd private(argc,b) firstprivate(argv) if(target: argc > 0) reduction(+: c,arr1[argc]) reduction(max: e,arr[:N][0:10])
109   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
110   // CHECK-NEXT: }
111 
112 #pragma omp target simd if(N) reduction(^:e, f, arr[0:N][:argc]) reduction(&& : h)
113   for (T i = 0; i < 2; ++i) {}
114   // CHECK: #pragma omp target simd if(N) reduction(^: e,f,arr[0:N][:argc]) reduction(&&: h)
115   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
116   // CHECK-NEXT: }
117 
118 #ifdef OMP5
119 #pragma omp target simd if(target:argc > 0) if (simd:argc)
120 #else
121 #pragma omp target simd if(target:argc > 0)
122 #endif // OMP5
123   for (T i = 0; i < 2; ++i) {}
124   // OMP45: #pragma omp target simd if(target: argc > 0)
125   // OMP50: #pragma omp target simd if(target: argc > 0) if(simd: argc)
126   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
127   // CHECK-NEXT: }
128 
129 #pragma omp target simd if(N)
130   for (T i = 0; i < 2; ++i) {}
131   // CHECK: #pragma omp target simd if(N)
132   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
133   // CHECK-NEXT: }
134 
135 #pragma omp target simd map(i)
136   for (T i = 0; i < 2; ++i) {}
137   // CHECK: #pragma omp target simd map(tofrom: i)
138   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
139   // CHECK-NEXT: }
140 
141 #pragma omp target simd map(arr1[0:10], i)
142   for (T i = 0; i < 2; ++i) {}
143   // CHECK: #pragma omp target simd map(tofrom: arr1[0:10],i)
144   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
145   // CHECK-NEXT: }
146 
147 #pragma omp target simd map(to: i) map(from: j)
148   for (T i = 0; i < 2; ++i) {}
149   // CHECK: #pragma omp target simd map(to: i) map(from: j)
150   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
151   // CHECK-NEXT: }
152 
153 #pragma omp target simd map(always,alloc: i)
154   for (T i = 0; i < 2; ++i) {}
155   // CHECK: #pragma omp target simd map(always,alloc: i)
156   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
157   // CHECK-NEXT: }
158 
159 #pragma omp target simd nowait
160   for (T i = 0; i < 2; ++i) {}
161   // CHECK: #pragma omp target simd nowait
162   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
163   // CHECK-NEXT: }
164 
165 #pragma omp target simd depend(in : argc, arr[i:argc], arr1[:])
166   for (T i = 0; i < 2; ++i) {}
167   // CHECK: #pragma omp target simd depend(in : argc,arr[i:argc],arr1[:])
168   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
169   // CHECK-NEXT: }
170 
171 #pragma omp target simd defaultmap(tofrom: scalar)
172   for (T i = 0; i < 2; ++i) {}
173   // CHECK: #pragma omp target simd defaultmap(tofrom: scalar)
174   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
175   // CHECK-NEXT: }
176 
177 #pragma omp target simd safelen(clen-1)
178   for (T i = 0; i < 2; ++i) {}
179   // CHECK: #pragma omp target simd safelen(clen - 1)
180   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
181   // CHECK-NEXT: }
182 
183 #pragma omp target simd simdlen(clen-1)
184   for (T i = 0; i < 2; ++i) {}
185   // CHECK: #pragma omp target simd simdlen(clen - 1)
186   // CHECK-NEXT: for (T i = 0; i < 2; ++i) {
187   // CHECK-NEXT: }
188 
189 #pragma omp target simd aligned(arr1:N-1)
190   for (T i = 0; i < N; ++i) {}
191   // CHECK: #pragma omp target simd aligned(arr1: N - 1)
192   // CHECK-NEXT: for (T i = 0; i < N; ++i) {
193   // CHECK-NEXT: }
194 
195 #pragma omp target simd is_device_ptr(p)
196   for (T i = 0; i < N; ++i) {}
197   // CHECK: #pragma omp target simd is_device_ptr(p)
198   // CHECK-NEXT: for (T i = 0; i < N; ++i) {
199   // CHECK-NEXT: }
200 
201   return T();
202 }
203 
204 int main(int argc, char **argv) {
205   int b = argc, c, d, e, f, h;
206   int arr[5][10], arr1[5];
207   int i, j;
208   int s;
209   static int a;
210 // CHECK: static int a;
211   const int clen = 5;
212 // CHECK: int clen = 5;
213   static float g;
214 #pragma omp threadprivate(g)
215   int *p;
216 #pragma omp target simd linear(a)
217   // CHECK: #pragma omp target simd linear(a)
218   for (int i = 0; i < 2; ++i)
219     a = 2;
220 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
221 // CHECK-NEXT: a = 2;
222 
223 #pragma omp target simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) if (target: argc) reduction(+ : h) linear(a:-5)
224   for (int i = 0; i < 10; ++i)
225     for (int j = 0; j < 10; ++j)
226       foo();
227   // CHECK: #pragma omp target simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) if(target: argc) reduction(+: h) linear(a: -5)
228   // CHECK-NEXT: for (int i = 0; i < 10; ++i)
229   // CHECK-NEXT: for (int j = 0; j < 10; ++j)
230   // CHECK-NEXT: foo();
231 
232 #pragma omp target simd private(argc,b) firstprivate(argv) if (argc > 0) reduction(+:c, arr1[argc]) reduction(max:e, arr[:5][0:10])
233   for (int i = 0; i < 2; ++i) {}
234   // CHECK: #pragma omp target simd private(argc,b) firstprivate(argv) if(argc > 0) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])
235   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
236   // CHECK-NEXT: }
237 
238 #pragma omp target simd if (5) reduction(^:e, f, arr[0:5][:argc]) reduction(&& : h)
239   for (int i = 0; i < 2; ++i) {}
240   // CHECK: #pragma omp target simd if(5) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: h)
241   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
242   // CHECK-NEXT: }
243 
244 #ifdef OMP5
245 #pragma omp target simd if (target:argc > 0) if(simd:argc) nontemporal(argc, c, d) lastprivate(conditional: d, f) order(concurrent)
246 #else
247 #pragma omp target simd if (target:argc > 0)
248 #endif // OMP5
249   for (int i = 0; i < 2; ++i) {}
250   // OMP45: #pragma omp target simd if(target: argc > 0)
251   // OMP50: #pragma omp target simd if(target: argc > 0) if(simd: argc) nontemporal(argc,c,d) lastprivate(conditional: d,f) order(concurrent)
252   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
253   // CHECK-NEXT: }
254 
255 #pragma omp target simd if (5)
256   for (int i = 0; i < 2; ++i) {}
257   // CHECK: #pragma omp target simd if(5)
258   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
259   // CHECK-NEXT: }
260 
261 #pragma omp target simd map(i)
262   for (int i = 0; i < 2; ++i) {}
263   // CHECK: #pragma omp target simd  map(tofrom: i)
264   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
265   // CHECK-NEXT: }
266 
267 #pragma omp target simd map(arr1[0:10], i)
268   for (int i = 0; i < 2; ++i) {}
269   // CHECK: #pragma omp target simd map(tofrom: arr1[0:10],i)
270   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
271   // CHECK-NEXT: }
272 
273 #pragma omp target simd map(to: i) map(from: j)
274   for (int i = 0; i < 2; ++i) {}
275   // CHECK: #pragma omp target simd map(to: i) map(from: j)
276   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
277   // CHECK-NEXT: }
278 
279 #pragma omp target simd map(always,alloc: i)
280   for (int i = 0; i < 2; ++i) {}
281   // CHECK: #pragma omp target simd map(always,alloc: i)
282   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
283   // CHECK-NEXT: }
284 
285 #pragma omp target simd nowait
286   for (int i = 0; i < 2; ++i) {}
287   // CHECK: #pragma omp target simd nowait
288   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
289   // CHECK-NEXT: }
290 
291 #pragma omp target simd depend(in : argc, arr[i:argc], arr1[:])
292   for (int i = 0; i < 2; ++i) {}
293   // CHECK: #pragma omp target simd depend(in : argc,arr[i:argc],arr1[:])
294   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
295   // CHECK-NEXT: }
296 
297 #pragma omp target simd defaultmap(tofrom: scalar)
298   for (int i = 0; i < 2; ++i) {}
299   // CHECK: #pragma omp target simd defaultmap(tofrom: scalar)
300   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
301   // CHECK-NEXT: }
302 
303 #pragma omp target simd safelen(clen-1)
304   for (int i = 0; i < 2; ++i) {}
305   // CHECK: #pragma omp target simd safelen(clen - 1)
306   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
307   // CHECK-NEXT: }
308 
309 #pragma omp target simd simdlen(clen-1)
310   for (int i = 0; i < 2; ++i) {}
311   // CHECK: #pragma omp target simd simdlen(clen - 1)
312   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
313   // CHECK-NEXT: }
314 
315 #pragma omp target simd aligned(arr1:4)
316   for (int i = 0; i < 2; ++i) {}
317   // CHECK: #pragma omp target simd aligned(arr1: 4)
318   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
319   // CHECK-NEXT: }
320 
321 #pragma omp target simd is_device_ptr(p)
322   for (int i = 0; i < 2; ++i) {}
323   // CHECK: #pragma omp target simd is_device_ptr(p)
324   // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
325   // CHECK-NEXT: }
326 
327   return (tmain<int, 5>(argc, &argc));
328 }
329 
330 #endif
331