1193ee2dbSKelvin Li // RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s
2193ee2dbSKelvin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3193ee2dbSKelvin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4a8a9153aSAlexey Bataev 
5a8a9153aSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 -ast-print %s | FileCheck %s
6a8a9153aSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7a8a9153aSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8193ee2dbSKelvin Li // expected-no-diagnostics
9193ee2dbSKelvin Li 
10193ee2dbSKelvin Li #ifndef HEADER
11193ee2dbSKelvin Li #define HEADER
12193ee2dbSKelvin Li 
13193ee2dbSKelvin Li struct ST {
14193ee2dbSKelvin Li   int *a;
15193ee2dbSKelvin Li };
16193ee2dbSKelvin Li typedef int arr[10];
17193ee2dbSKelvin Li typedef ST STarr[10];
18193ee2dbSKelvin Li struct SA {
19193ee2dbSKelvin Li   const int da[5] = { 0 };
20193ee2dbSKelvin Li   ST g[10];
21193ee2dbSKelvin Li   STarr &rg = g;
22193ee2dbSKelvin Li   int i;
23193ee2dbSKelvin Li   int &j = i;
24193ee2dbSKelvin Li   int *k = &j;
25193ee2dbSKelvin Li   int *&z = k;
26193ee2dbSKelvin Li   int aa[10];
27193ee2dbSKelvin Li   arr &raa = aa;
funcSA28193ee2dbSKelvin Li   void func(int arg) {
29193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(k)
30193ee2dbSKelvin Li     {}
31193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(z)
32193ee2dbSKelvin Li     {}
33193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(aa) // OK
34193ee2dbSKelvin Li     {}
35193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(raa) // OK
36193ee2dbSKelvin Li     {}
37193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(g) // OK
38193ee2dbSKelvin Li     {}
39193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(rg) // OK
40193ee2dbSKelvin Li     {}
41193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(da) // OK
42193ee2dbSKelvin Li     {}
43193ee2dbSKelvin Li   return;
44193ee2dbSKelvin Li  }
45193ee2dbSKelvin Li };
46193ee2dbSKelvin Li // CHECK: struct SA
47193ee2dbSKelvin Li // CHECK-NEXT: const int da[5] = {0};
48193ee2dbSKelvin Li // CHECK-NEXT: ST g[10];
49193ee2dbSKelvin Li // CHECK-NEXT: STarr &rg = this->g;
50193ee2dbSKelvin Li // CHECK-NEXT: int i;
51193ee2dbSKelvin Li // CHECK-NEXT: int &j = this->i;
52193ee2dbSKelvin Li // CHECK-NEXT: int *k = &this->j;
53193ee2dbSKelvin Li // CHECK-NEXT: int *&z = this->k;
54193ee2dbSKelvin Li // CHECK-NEXT: int aa[10];
55193ee2dbSKelvin Li // CHECK-NEXT: arr &raa = this->aa;
56193ee2dbSKelvin Li // CHECK-NEXT: func(
57*cbecfdfeSAlexey Bataev // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->k){{$}}
58193ee2dbSKelvin Li // CHECK-NEXT: {
59193ee2dbSKelvin Li // CHECK-NEXT: }
60193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->z)
61193ee2dbSKelvin Li // CHECK-NEXT: {
62193ee2dbSKelvin Li // CHECK-NEXT: }
63193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->aa)
64193ee2dbSKelvin Li // CHECK-NEXT: {
65193ee2dbSKelvin Li // CHECK-NEXT: }
66193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->raa)
67193ee2dbSKelvin Li // CHECK-NEXT: {
68193ee2dbSKelvin Li // CHECK-NEXT: }
69193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->g)
70193ee2dbSKelvin Li // CHECK-NEXT: {
71193ee2dbSKelvin Li // CHECK-NEXT: }
72193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->rg)
73193ee2dbSKelvin Li // CHECK-NEXT: {
74193ee2dbSKelvin Li // CHECK-NEXT: }
75193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->da)
76193ee2dbSKelvin Li 
77193ee2dbSKelvin Li struct SB {
78193ee2dbSKelvin Li   unsigned A;
79193ee2dbSKelvin Li   unsigned B;
80193ee2dbSKelvin Li   float Arr[100];
81193ee2dbSKelvin Li   float *Ptr;
fooSB82193ee2dbSKelvin Li   float *foo() {
83193ee2dbSKelvin Li     return &Arr[0];
84193ee2dbSKelvin Li   }
85193ee2dbSKelvin Li };
86193ee2dbSKelvin Li 
87193ee2dbSKelvin Li struct SC {
88193ee2dbSKelvin Li   unsigned A : 2;
89193ee2dbSKelvin Li   unsigned B : 3;
90193ee2dbSKelvin Li   unsigned C;
91193ee2dbSKelvin Li   unsigned D;
92193ee2dbSKelvin Li   float Arr[100];
93193ee2dbSKelvin Li   SB S;
94193ee2dbSKelvin Li   SB ArrS[100];
95193ee2dbSKelvin Li   SB *PtrS;
96193ee2dbSKelvin Li   SB *&RPtrS;
97193ee2dbSKelvin Li   float *Ptr;
98193ee2dbSKelvin Li 
SCSC99193ee2dbSKelvin Li   SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
100193ee2dbSKelvin Li };
101193ee2dbSKelvin Li 
102193ee2dbSKelvin Li union SD {
103193ee2dbSKelvin Li   unsigned A;
104193ee2dbSKelvin Li   float B;
105193ee2dbSKelvin Li };
106193ee2dbSKelvin Li 
107193ee2dbSKelvin Li struct S1;
108193ee2dbSKelvin Li extern S1 a;
109193ee2dbSKelvin Li class S2 {
110193ee2dbSKelvin Li   mutable int a;
111193ee2dbSKelvin Li public:
S2()112193ee2dbSKelvin Li   S2():a(0) { }
S2(S2 & s2)113193ee2dbSKelvin Li   S2(S2 &s2):a(s2.a) { }
114193ee2dbSKelvin Li   static float S2s;
115193ee2dbSKelvin Li   static const float S2sc;
116193ee2dbSKelvin Li };
117193ee2dbSKelvin Li const float S2::S2sc = 0;
118193ee2dbSKelvin Li const S2 b;
119193ee2dbSKelvin Li const S2 ba[5];
120193ee2dbSKelvin Li class S3 {
121193ee2dbSKelvin Li   int a;
122193ee2dbSKelvin Li public:
S3()123193ee2dbSKelvin Li   S3():a(0) { }
S3(S3 & s3)124193ee2dbSKelvin Li   S3(S3 &s3):a(s3.a) { }
125193ee2dbSKelvin Li };
126193ee2dbSKelvin Li const S3 c;
127193ee2dbSKelvin Li const S3 ca[5];
128193ee2dbSKelvin Li extern const int f;
129193ee2dbSKelvin Li class S4 {
130193ee2dbSKelvin Li   int a;
131193ee2dbSKelvin Li   S4();
132193ee2dbSKelvin Li   S4(const S4 &s4);
133193ee2dbSKelvin Li public:
S4(int v)134193ee2dbSKelvin Li   S4(int v):a(v) { }
135193ee2dbSKelvin Li };
136193ee2dbSKelvin Li class S5 {
137193ee2dbSKelvin Li   int a;
S5()138193ee2dbSKelvin Li   S5():a(0) {}
S5(const S5 & s5)139193ee2dbSKelvin Li   S5(const S5 &s5):a(s5.a) { }
140193ee2dbSKelvin Li public:
S5(int v)141193ee2dbSKelvin Li   S5(int v):a(v) { }
142193ee2dbSKelvin Li };
143193ee2dbSKelvin Li 
144193ee2dbSKelvin Li S3 h;
145193ee2dbSKelvin Li #pragma omp threadprivate(h)
146193ee2dbSKelvin Li 
147193ee2dbSKelvin Li typedef struct {
148193ee2dbSKelvin Li   int a;
149193ee2dbSKelvin Li } S6;
150193ee2dbSKelvin Li 
151193ee2dbSKelvin Li template <typename T>
tmain(T argc)152193ee2dbSKelvin Li T tmain(T argc) {
153193ee2dbSKelvin Li   const T da[5] = { 0 };
154193ee2dbSKelvin Li   S6 h[10];
155193ee2dbSKelvin Li   auto &rh = h;
156193ee2dbSKelvin Li   T i;
157193ee2dbSKelvin Li   T &j = i;
158193ee2dbSKelvin Li   T *k = &j;
159193ee2dbSKelvin Li   T *&z = k;
160193ee2dbSKelvin Li   T aa[10];
161193ee2dbSKelvin Li   auto &raa = aa;
162193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(k)
163193ee2dbSKelvin Li   {}
164193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(z)
165193ee2dbSKelvin Li   {}
166193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(aa)
167193ee2dbSKelvin Li   {}
168193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(raa)
169193ee2dbSKelvin Li   {}
170193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(h)
171193ee2dbSKelvin Li   {}
172193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(rh)
173193ee2dbSKelvin Li   {}
174193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(da)
175193ee2dbSKelvin Li   {}
176193ee2dbSKelvin Li   return 0;
177193ee2dbSKelvin Li }
178193ee2dbSKelvin Li 
179193ee2dbSKelvin Li // CHECK: template<> int tmain<int>(int argc) {
180193ee2dbSKelvin Li // CHECK-NEXT: const int da[5] = {0};
181193ee2dbSKelvin Li // CHECK-NEXT: S6 h[10];
182193ee2dbSKelvin Li // CHECK-NEXT: auto &rh = h;
183193ee2dbSKelvin Li // CHECK-NEXT: int i;
184193ee2dbSKelvin Li // CHECK-NEXT: int &j = i;
185193ee2dbSKelvin Li // CHECK-NEXT: int *k = &j;
186193ee2dbSKelvin Li // CHECK-NEXT: int *&z = k;
187193ee2dbSKelvin Li // CHECK-NEXT: int aa[10];
188193ee2dbSKelvin Li // CHECK-NEXT: auto &raa = aa;
189193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(k)
190193ee2dbSKelvin Li // CHECK-NEXT: {
191193ee2dbSKelvin Li // CHECK-NEXT: }
192193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(z)
193193ee2dbSKelvin Li // CHECK-NEXT: {
194193ee2dbSKelvin Li // CHECK-NEXT: }
195193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(aa)
196193ee2dbSKelvin Li // CHECK-NEXT: {
197193ee2dbSKelvin Li // CHECK-NEXT: }
198193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(raa)
199193ee2dbSKelvin Li // CHECK-NEXT: {
200193ee2dbSKelvin Li // CHECK-NEXT: }
201193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(h)
202193ee2dbSKelvin Li // CHECK-NEXT: {
203193ee2dbSKelvin Li // CHECK-NEXT: }
204193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(rh)
205193ee2dbSKelvin Li // CHECK-NEXT: {
206193ee2dbSKelvin Li // CHECK-NEXT: }
207193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(da)
208193ee2dbSKelvin Li 
209193ee2dbSKelvin Li // CHECK: template<> int *tmain<int *>(int *argc) {
210193ee2dbSKelvin Li // CHECK-NEXT: int *const da[5] = {0};
211193ee2dbSKelvin Li // CHECK-NEXT: S6 h[10];
212193ee2dbSKelvin Li // CHECK-NEXT: auto &rh = h;
213193ee2dbSKelvin Li // CHECK-NEXT: int *i;
214193ee2dbSKelvin Li // CHECK-NEXT: int *&j = i;
215193ee2dbSKelvin Li // CHECK-NEXT: int **k = &j;
216193ee2dbSKelvin Li // CHECK-NEXT: int **&z = k;
217193ee2dbSKelvin Li // CHECK-NEXT: int *aa[10];
218193ee2dbSKelvin Li // CHECK-NEXT: auto &raa = aa;
219193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(k)
220193ee2dbSKelvin Li // CHECK-NEXT: {
221193ee2dbSKelvin Li // CHECK-NEXT: }
222193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(z)
223193ee2dbSKelvin Li // CHECK-NEXT: {
224193ee2dbSKelvin Li // CHECK-NEXT: }
225193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(aa)
226193ee2dbSKelvin Li // CHECK-NEXT: {
227193ee2dbSKelvin Li // CHECK-NEXT: }
228193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(raa)
229193ee2dbSKelvin Li // CHECK-NEXT: {
230193ee2dbSKelvin Li // CHECK-NEXT: }
231193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(h)
232193ee2dbSKelvin Li // CHECK-NEXT: {
233193ee2dbSKelvin Li // CHECK-NEXT: }
234193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(rh)
235193ee2dbSKelvin Li // CHECK-NEXT: {
236193ee2dbSKelvin Li // CHECK-NEXT: }
237193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(da)
238193ee2dbSKelvin Li 
239193ee2dbSKelvin Li // CHECK-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)240193ee2dbSKelvin Li int main(int argc, char **argv) {
241193ee2dbSKelvin Li   const int da[5] = { 0 };
242193ee2dbSKelvin Li   S6 h[10];
243193ee2dbSKelvin Li   auto &rh = h;
244193ee2dbSKelvin Li   int i;
245193ee2dbSKelvin Li   int &j = i;
246193ee2dbSKelvin Li   int *k = &j;
247193ee2dbSKelvin Li   int *&z = k;
248193ee2dbSKelvin Li   int aa[10];
249193ee2dbSKelvin Li   auto &raa = aa;
250193ee2dbSKelvin Li // CHECK-NEXT: const int da[5] = {0};
251193ee2dbSKelvin Li // CHECK-NEXT: S6 h[10];
252193ee2dbSKelvin Li // CHECK-NEXT: auto &rh = h;
253193ee2dbSKelvin Li // CHECK-NEXT: int i;
254193ee2dbSKelvin Li // CHECK-NEXT: int &j = i;
255193ee2dbSKelvin Li // CHECK-NEXT: int *k = &j;
256193ee2dbSKelvin Li // CHECK-NEXT: int *&z = k;
257193ee2dbSKelvin Li // CHECK-NEXT: int aa[10];
258193ee2dbSKelvin Li // CHECK-NEXT: auto &raa = aa;
259193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(k)
260193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(k)
261193ee2dbSKelvin Li   {}
262193ee2dbSKelvin Li // CHECK-NEXT: {
263193ee2dbSKelvin Li // CHECK-NEXT: }
264193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(z)
265193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(z)
266193ee2dbSKelvin Li   {}
267193ee2dbSKelvin Li // CHECK-NEXT: {
268193ee2dbSKelvin Li // CHECK-NEXT: }
269193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(aa)
270193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(aa)
271193ee2dbSKelvin Li   {}
272193ee2dbSKelvin Li // CHECK-NEXT: {
273193ee2dbSKelvin Li // CHECK-NEXT: }
274193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(raa)
275193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(raa)
276193ee2dbSKelvin Li   {}
277193ee2dbSKelvin Li // CHECK-NEXT: {
278193ee2dbSKelvin Li // CHECK-NEXT: }
279193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(h)
280193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(h)
281193ee2dbSKelvin Li   {}
282193ee2dbSKelvin Li // CHECK-NEXT: {
283193ee2dbSKelvin Li // CHECK-NEXT: }
284193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(rh)
285193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(rh)
286193ee2dbSKelvin Li   {}
287193ee2dbSKelvin Li // CHECK-NEXT: {
288193ee2dbSKelvin Li // CHECK-NEXT: }
289193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(da)
290193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(da)
291193ee2dbSKelvin Li   {}
292193ee2dbSKelvin Li // CHECK-NEXT: {
293193ee2dbSKelvin Li // CHECK-NEXT: }
294193ee2dbSKelvin Li   return tmain<int>(argc) + *tmain<int *>(&argc);
295193ee2dbSKelvin Li }
296193ee2dbSKelvin Li 
297193ee2dbSKelvin Li 
298193ee2dbSKelvin Li #endif
299