1 // RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8 // expected-no-diagnostics
9 
10 #ifndef HEADER
11 #define HEADER
12 struct ST {
13   int *a;
14 };
15 typedef int arr[10];
16 typedef ST STarr[10];
17 struct SA {
18   const int da[5] = { 0 };
19   ST g[10];
20   STarr &rg = g;
21   int i;
22   int &j = i;
23   int *k = &j;
24   int *&z = k;
25   int aa[10];
26   arr &raa = aa;
funcSA27   void func(int arg) {
28 #pragma omp target teams distribute parallel for is_device_ptr(k)
29   for (int i=0; i<100; i++)
30     ;
31 #pragma omp target teams distribute parallel for is_device_ptr(z)
32   for (int i=0; i<100; i++)
33     ;
34 #pragma omp target teams distribute parallel for is_device_ptr(aa) // OK
35   for (int i=0; i<100; i++)
36     ;
37 #pragma omp target teams distribute parallel for is_device_ptr(raa) // OK
38   for (int i=0; i<100; i++)
39     ;
40 #pragma omp target teams distribute parallel for is_device_ptr(g) // OK
41   for (int i=0; i<100; i++)
42     ;
43 #pragma omp target teams distribute parallel for is_device_ptr(rg) // OK
44   for (int i=0; i<100; i++)
45     ;
46 #pragma omp target teams distribute parallel for is_device_ptr(da) // OK
47   for (int i=0; i<100; i++)
48     ;
49   return;
50  }
51 };
52 // CHECK: struct SA
53 // CHECK-NEXT: const int da[5] = {0};
54 // CHECK-NEXT: ST g[10];
55 // CHECK-NEXT: STarr &rg = this->g;
56 // CHECK-NEXT: int i;
57 // CHECK-NEXT: int &j = this->i;
58 // CHECK-NEXT: int *k = &this->j;
59 // CHECK-NEXT: int *&z = this->k;
60 // CHECK-NEXT: int aa[10];
61 // CHECK-NEXT: arr &raa = this->aa;
62 // CHECK-NEXT: func(
63 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->k){{$}}
64 // CHECK-NEXT: for (int i = 0; i < 100; i++)
65 // CHECK-NEXT: ;
66 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->z)
67 // CHECK-NEXT: for (int i = 0; i < 100; i++)
68 // CHECK-NEXT: ;
69 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->aa)
70 // CHECK-NEXT: for (int i = 0; i < 100; i++)
71 // CHECK-NEXT: ;
72 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->raa)
73 // CHECK-NEXT: for (int i = 0; i < 100; i++)
74 // CHECK-NEXT: ;
75 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->g)
76 // CHECK-NEXT: for (int i = 0; i < 100; i++)
77 // CHECK-NEXT: ;
78 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->rg)
79 // CHECK-NEXT: for (int i = 0; i < 100; i++)
80 // CHECK-NEXT: ;
81 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(this->da)
82 // CHECK-NEXT: for (int i = 0; i < 100; i++)
83 // CHECK-NEXT: ;
84 
85 struct SB {
86   unsigned A;
87   unsigned B;
88   float Arr[100];
89   float *Ptr;
fooSB90   float *foo() {
91     return &Arr[0];
92   }
93 };
94 
95 struct SC {
96   unsigned A : 2;
97   unsigned B : 3;
98   unsigned C;
99   unsigned D;
100   float Arr[100];
101   SB S;
102   SB ArrS[100];
103   SB *PtrS;
104   SB *&RPtrS;
105   float *Ptr;
106 
SCSC107   SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
108 };
109 
110 union SD {
111   unsigned A;
112   float B;
113 };
114 
115 struct S1;
116 extern S1 a;
117 class S2 {
118   mutable int a;
119 public:
S2()120   S2():a(0) { }
S2(S2 & s2)121   S2(S2 &s2):a(s2.a) { }
122   static float S2s;
123   static const float S2sc;
124 };
125 const float S2::S2sc = 0;
126 const S2 b;
127 const S2 ba[5];
128 class S3 {
129   int a;
130 public:
S3()131   S3():a(0) { }
S3(S3 & s3)132   S3(S3 &s3):a(s3.a) { }
133 };
134 const S3 c;
135 const S3 ca[5];
136 extern const int f;
137 class S4 {
138   int a;
139   S4();
140   S4(const S4 &s4);
141 public:
S4(int v)142   S4(int v):a(v) { }
143 };
144 class S5 {
145   int a;
S5()146   S5():a(0) {}
S5(const S5 & s5)147   S5(const S5 &s5):a(s5.a) { }
148 public:
S5(int v)149   S5(int v):a(v) { }
150 };
151 
152 S3 h;
153 #pragma omp threadprivate(h)
154 
155 typedef struct {
156   int a;
157 } S6;
158 
159 template <typename T>
tmain(T argc)160 T tmain(T argc) {
161   const T da[5] = { 0 };
162   S6 h[10];
163   auto &rh = h;
164   T i;
165   T &j = i;
166   T *k = &j;
167   T *&z = k;
168   T aa[10];
169   auto &raa = aa;
170 #pragma omp target teams distribute parallel for is_device_ptr(k)
171   for (int i=0; i<100; i++)
172     ;
173 #pragma omp target teams distribute parallel for is_device_ptr(z)
174   for (int i=0; i<100; i++)
175     ;
176 #pragma omp target teams distribute parallel for is_device_ptr(aa)
177   for (int i=0; i<100; i++)
178     ;
179 #pragma omp target teams distribute parallel for is_device_ptr(raa)
180   for (int i=0; i<100; i++)
181     ;
182 #pragma omp target teams distribute parallel for is_device_ptr(h)
183   for (int i=0; i<100; i++)
184     ;
185 #pragma omp target teams distribute parallel for is_device_ptr(rh)
186   for (int i=0; i<100; i++)
187     ;
188 #pragma omp target teams distribute parallel for is_device_ptr(da)
189   for (int i=0; i<100; i++)
190     ;
191   return 0;
192 }
193 
194 // CHECK: template<> int tmain<int>(int argc) {
195 // CHECK-NEXT: const int da[5] = {0};
196 // CHECK-NEXT: S6 h[10];
197 // CHECK-NEXT: auto &rh = h;
198 // CHECK-NEXT: int i;
199 // CHECK-NEXT: int &j = i;
200 // CHECK-NEXT: int *k = &j;
201 // CHECK-NEXT: int *&z = k;
202 // CHECK-NEXT: int aa[10];
203 // CHECK-NEXT: auto &raa = aa;
204 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(k)
205 // CHECK-NEXT: for (int i = 0; i < 100; i++)
206 // CHECK-NEXT: ;
207 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(z)
208 // CHECK-NEXT: for (int i = 0; i < 100; i++)
209 // CHECK-NEXT: ;
210 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(aa)
211 // CHECK-NEXT: for (int i = 0; i < 100; i++)
212 // CHECK-NEXT: ;
213 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(raa)
214 // CHECK-NEXT: for (int i = 0; i < 100; i++)
215 // CHECK-NEXT: ;
216 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(h)
217 // CHECK-NEXT: for (int i = 0; i < 100; i++)
218 // CHECK-NEXT: ;
219 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(rh)
220 // CHECK-NEXT: for (int i = 0; i < 100; i++)
221 // CHECK-NEXT: ;
222 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(da)
223 // CHECK-NEXT: for (int i = 0; i < 100; i++)
224 // CHECK-NEXT: ;
225 
226 // CHECK: template<> int *tmain<int *>(int *argc) {
227 // CHECK-NEXT: int *const da[5] = {0};
228 // CHECK-NEXT: S6 h[10];
229 // CHECK-NEXT: auto &rh = h;
230 // CHECK-NEXT: int *i;
231 // CHECK-NEXT: int *&j = i;
232 // CHECK-NEXT: int **k = &j;
233 // CHECK-NEXT: int **&z = k;
234 // CHECK-NEXT: int *aa[10];
235 // CHECK-NEXT: auto &raa = aa;
236 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(k)
237 // CHECK-NEXT: for (int i = 0; i < 100; i++)
238 // CHECK-NEXT: ;
239 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(z)
240 // CHECK-NEXT: for (int i = 0; i < 100; i++)
241 // CHECK-NEXT: ;
242 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(aa)
243 // CHECK-NEXT: for (int i = 0; i < 100; i++)
244 // CHECK-NEXT: ;
245 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(raa)
246 // CHECK-NEXT: for (int i = 0; i < 100; i++)
247 // CHECK-NEXT: ;
248 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(h)
249 // CHECK-NEXT: for (int i = 0; i < 100; i++)
250 // CHECK-NEXT: ;
251 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(rh)
252 // CHECK-NEXT: for (int i = 0; i < 100; i++)
253 // CHECK-NEXT: ;
254 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(da)
255 // CHECK-NEXT: for (int i = 0; i < 100; i++)
256 // CHECK-NEXT: ;
257 
258 // CHECK-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)259 int main(int argc, char **argv) {
260   const int da[5] = { 0 };
261   S6 h[10];
262   auto &rh = h;
263   int i;
264   int &j = i;
265   int *k = &j;
266   int *&z = k;
267   int aa[10];
268   auto &raa = aa;
269 // CHECK-NEXT: const int da[5] = {0};
270 // CHECK-NEXT: S6 h[10];
271 // CHECK-NEXT: auto &rh = h;
272 // CHECK-NEXT: int i;
273 // CHECK-NEXT: int &j = i;
274 // CHECK-NEXT: int *k = &j;
275 // CHECK-NEXT: int *&z = k;
276 // CHECK-NEXT: int aa[10];
277 // CHECK-NEXT: auto &raa = aa;
278 #pragma omp target teams distribute parallel for is_device_ptr(k)
279 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(k)
280   for (int i=0; i<100; i++)
281     ;
282 // CHECK-NEXT: for (int i = 0; i < 100; i++)
283 // CHECK-NEXT: ;
284 #pragma omp target teams distribute parallel for is_device_ptr(z)
285 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(z)
286   for (int i=0; i<100; i++)
287     ;
288 // CHECK-NEXT: for (int i = 0; i < 100; i++)
289 // CHECK-NEXT: ;
290 #pragma omp target teams distribute parallel for is_device_ptr(aa)
291 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(aa)
292   for (int i=0; i<100; i++)
293     ;
294 // CHECK-NEXT: for (int i = 0; i < 100; i++)
295 // CHECK-NEXT: ;
296 #pragma omp target teams distribute parallel for is_device_ptr(raa)
297 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(raa)
298   for (int i=0; i<100; i++)
299     ;
300 // CHECK-NEXT: for (int i = 0; i < 100; i++)
301 // CHECK-NEXT: ;
302 #pragma omp target teams distribute parallel for is_device_ptr(h)
303 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(h)
304   for (int i=0; i<100; i++)
305     ;
306 // CHECK-NEXT: for (int i = 0; i < 100; i++)
307 // CHECK-NEXT: ;
308 #pragma omp target teams distribute parallel for is_device_ptr(rh)
309 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(rh)
310   for (int i=0; i<100; i++)
311     ;
312 // CHECK-NEXT: for (int i = 0; i < 100; i++)
313 // CHECK-NEXT: ;
314 #pragma omp target teams distribute parallel for is_device_ptr(da)
315 // CHECK-NEXT: #pragma omp target teams distribute parallel for is_device_ptr(da)
316   for (int i=0; i<100; i++)
317     ;
318 // CHECK-NEXT: for (int i = 0; i < 100; i++)
319 // CHECK-NEXT: ;
320   return tmain<int>(argc) + *tmain<int *>(&argc);
321 }
322 #endif
323