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