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