xref: /aosp_15_r20/external/clang/test/OpenMP/target_map_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 200 %s
2*67e74705SXin Li // RUN: %clang_cc1 -DCCODE -verify -fopenmp -ferror-limit 200 -x c %s
3*67e74705SXin Li #ifdef CCODE
foo(int arg)4*67e74705SXin Li void foo(int arg) {
5*67e74705SXin Li   const int n = 0;
6*67e74705SXin Li 
7*67e74705SXin Li   double marr[10][10][10];
8*67e74705SXin Li 
9*67e74705SXin Li   #pragma omp target map(marr[2][0:2][0:2]) // expected-error {{array section does not specify contiguous storage}}
10*67e74705SXin Li   {}
11*67e74705SXin Li   #pragma omp target map(marr[:][0:][:])
12*67e74705SXin Li   {}
13*67e74705SXin Li   #pragma omp target map(marr[:][1:][:]) // expected-error {{array section does not specify contiguous storage}}
14*67e74705SXin Li   {}
15*67e74705SXin Li   #pragma omp target map(marr[:][n:][:])
16*67e74705SXin Li   {}
17*67e74705SXin Li }
18*67e74705SXin Li #else
19*67e74705SXin Li template <typename T, int I>
20*67e74705SXin Li struct SA {
21*67e74705SXin Li   static int ss;
22*67e74705SXin Li   #pragma omp threadprivate(ss) // expected-note {{defined as threadprivate or thread local}}
23*67e74705SXin Li   float a;
24*67e74705SXin Li   int b[12];
25*67e74705SXin Li   float *c;
26*67e74705SXin Li   T d;
27*67e74705SXin Li   float e[I];
28*67e74705SXin Li   T *f;
funcSA29*67e74705SXin Li   void func(int arg) {
30*67e74705SXin Li     #pragma omp target map(arg,a,d)
31*67e74705SXin Li     {}
32*67e74705SXin Li     #pragma omp target map(arg[2:2],a,d) // expected-error {{subscripted value is not an array or pointer}}
33*67e74705SXin Li     {}
34*67e74705SXin Li     #pragma omp target map(arg,a*2) // expected-error {{expected expression containing only member accesses and/or array sections based on named variables}}
35*67e74705SXin Li     {}
36*67e74705SXin Li     #pragma omp target map(arg,(c+1)[2]) // expected-error {{expected expression containing only member accesses and/or array sections based on named variables}}
37*67e74705SXin Li     {}
38*67e74705SXin Li     #pragma omp target map(arg,a[:2],d) // expected-error {{subscripted value is not an array or pointer}}
39*67e74705SXin Li     {}
40*67e74705SXin Li     #pragma omp target map(arg,a,d[:2]) // expected-error {{subscripted value is not an array or pointer}}
41*67e74705SXin Li     {}
42*67e74705SXin Li 
43*67e74705SXin Li     #pragma omp target map(to:ss) // expected-error {{threadprivate variables are not allowed in 'map' clause}}
44*67e74705SXin Li     {}
45*67e74705SXin Li 
46*67e74705SXin Li     #pragma omp target map(to:b,e)
47*67e74705SXin Li     {}
48*67e74705SXin Li     #pragma omp target map(to:b,e) map(to:b) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}}
49*67e74705SXin Li     {}
50*67e74705SXin Li     #pragma omp target map(to:b[:2],e)
51*67e74705SXin Li     {}
52*67e74705SXin Li     #pragma omp target map(to:b,e[:])
53*67e74705SXin Li     {}
54*67e74705SXin Li 
55*67e74705SXin Li     #pragma omp target map(always, tofrom: c,f)
56*67e74705SXin Li     {}
57*67e74705SXin Li     #pragma omp target map(always, tofrom: c[1:2],f)
58*67e74705SXin Li     {}
59*67e74705SXin Li     #pragma omp target map(always, tofrom: c,f[1:2])
60*67e74705SXin Li     {}
61*67e74705SXin Li     #pragma omp target map(always, tofrom: c[:],f)   // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
62*67e74705SXin Li     {}
63*67e74705SXin Li     #pragma omp target map(always, tofrom: c,f[:])   // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
64*67e74705SXin Li     {}
65*67e74705SXin Li     return;
66*67e74705SXin Li   }
67*67e74705SXin Li };
68*67e74705SXin Li 
69*67e74705SXin Li struct SB {
70*67e74705SXin Li   unsigned A;
71*67e74705SXin Li   unsigned B;
72*67e74705SXin Li   float Arr[100];
73*67e74705SXin Li   float *Ptr;
fooSB74*67e74705SXin Li   float *foo() {
75*67e74705SXin Li     return &Arr[0];
76*67e74705SXin Li   }
77*67e74705SXin Li };
78*67e74705SXin Li 
79*67e74705SXin Li struct SC {
80*67e74705SXin Li   unsigned A : 2;
81*67e74705SXin Li   unsigned B : 3;
82*67e74705SXin Li   unsigned C;
83*67e74705SXin Li   unsigned D;
84*67e74705SXin Li   float Arr[100];
85*67e74705SXin Li   SB S;
86*67e74705SXin Li   SB ArrS[100];
87*67e74705SXin Li   SB *PtrS;
88*67e74705SXin Li   SB *&RPtrS;
89*67e74705SXin Li   float *Ptr;
90*67e74705SXin Li 
SCSC91*67e74705SXin Li   SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
92*67e74705SXin Li };
93*67e74705SXin Li 
94*67e74705SXin Li union SD {
95*67e74705SXin Li   unsigned A;
96*67e74705SXin Li   float B;
97*67e74705SXin Li };
98*67e74705SXin Li 
SAclient(int arg)99*67e74705SXin Li void SAclient(int arg) {
100*67e74705SXin Li   SA<int,123> s;
101*67e74705SXin Li   s.func(arg); // expected-note {{in instantiation of member function}}
102*67e74705SXin Li   double marr[10][10][10];
103*67e74705SXin Li   double marr2[5][10][1];
104*67e74705SXin Li   double mvla[5][arg][10];
105*67e74705SXin Li   double ***mptr;
106*67e74705SXin Li   const int n = 0;
107*67e74705SXin Li   const int m = 1;
108*67e74705SXin Li   double mvla2[5][arg][m+n+10];
109*67e74705SXin Li 
110*67e74705SXin Li   SB *p;
111*67e74705SXin Li 
112*67e74705SXin Li   SD u;
113*67e74705SXin Li   SC r(p),t(p);
114*67e74705SXin Li   #pragma omp target map(r)
115*67e74705SXin Li   {}
116*67e74705SXin Li   #pragma omp target map(marr[2][0:2][0:2]) // expected-error {{array section does not specify contiguous storage}}
117*67e74705SXin Li   {}
118*67e74705SXin Li   #pragma omp target map(marr[:][0:2][0:2]) // expected-error {{array section does not specify contiguous storage}}
119*67e74705SXin Li   {}
120*67e74705SXin Li   #pragma omp target map(marr[2][3][0:2])
121*67e74705SXin Li   {}
122*67e74705SXin Li   #pragma omp target map(marr[:][:][:])
123*67e74705SXin Li   {}
124*67e74705SXin Li   #pragma omp target map(marr[:2][:][:])
125*67e74705SXin Li   {}
126*67e74705SXin Li   #pragma omp target map(marr[arg:][:][:])
127*67e74705SXin Li   {}
128*67e74705SXin Li   #pragma omp target map(marr[arg:])
129*67e74705SXin Li   {}
130*67e74705SXin Li   #pragma omp target map(marr[arg:][:arg][:]) // correct if arg is the size of dimension 2
131*67e74705SXin Li   {}
132*67e74705SXin Li   #pragma omp target map(marr[:arg][:])
133*67e74705SXin Li   {}
134*67e74705SXin Li   #pragma omp target map(marr[:arg][n:])
135*67e74705SXin Li   {}
136*67e74705SXin Li   #pragma omp target map(marr[:][:arg][n:]) // correct if arg is the size of  dimension 2
137*67e74705SXin Li   {}
138*67e74705SXin Li   #pragma omp target map(marr[:][:m][n:]) // expected-error {{array section does not specify contiguous storage}}
139*67e74705SXin Li   {}
140*67e74705SXin Li   #pragma omp target map(marr[n:m][:arg][n:])
141*67e74705SXin Li   {}
142*67e74705SXin Li   #pragma omp target map(marr[:2][:1][:]) // expected-error {{array section does not specify contiguous storage}}
143*67e74705SXin Li   {}
144*67e74705SXin Li   #pragma omp target map(marr[:2][1:][:]) // expected-error {{array section does not specify contiguous storage}}
145*67e74705SXin Li   {}
146*67e74705SXin Li   #pragma omp target map(marr[:2][:][:1]) // expected-error {{array section does not specify contiguous storage}}
147*67e74705SXin Li   {}
148*67e74705SXin Li   #pragma omp target map(marr[:2][:][1:]) // expected-error {{array section does not specify contiguous storage}}
149*67e74705SXin Li   {}
150*67e74705SXin Li   #pragma omp target map(marr[:1][:2][:])
151*67e74705SXin Li   {}
152*67e74705SXin Li   #pragma omp target map(marr[:1][0][:])
153*67e74705SXin Li   {}
154*67e74705SXin Li   #pragma omp target map(marr[:arg][:2][:]) // correct if arg is 1
155*67e74705SXin Li   {}
156*67e74705SXin Li   #pragma omp target map(marr[:1][3:1][:2])
157*67e74705SXin Li   {}
158*67e74705SXin Li   #pragma omp target map(marr[:1][3:arg][:2]) // correct if arg is 1
159*67e74705SXin Li   {}
160*67e74705SXin Li   #pragma omp target map(marr[:1][3:2][:2]) // expected-error {{array section does not specify contiguous storage}}
161*67e74705SXin Li   {}
162*67e74705SXin Li   #pragma omp target map(marr[:2][:10][:])
163*67e74705SXin Li   {}
164*67e74705SXin Li   #pragma omp target map(marr[:2][:][:5+5])
165*67e74705SXin Li   {}
166*67e74705SXin Li   #pragma omp target map(marr[:2][2+2-4:][0:5+5])
167*67e74705SXin Li   {}
168*67e74705SXin Li 
169*67e74705SXin Li   #pragma omp target map(marr[:1][:2][0]) // expected-error {{array section does not specify contiguous storage}}
170*67e74705SXin Li   {}
171*67e74705SXin Li   #pragma omp target map(marr2[:1][:2][0])
172*67e74705SXin Li   {}
173*67e74705SXin Li 
174*67e74705SXin Li   #pragma omp target map(mvla[:1][:][0]) // correct if the size of dimension 2 is 1.
175*67e74705SXin Li   {}
176*67e74705SXin Li   #pragma omp target map(mvla[:2][:arg][:]) // correct if arg is the size of dimension 2.
177*67e74705SXin Li   {}
178*67e74705SXin Li   #pragma omp target map(mvla[:1][:2][0]) // expected-error {{array section does not specify contiguous storage}}
179*67e74705SXin Li    {}
180*67e74705SXin Li   #pragma omp target map(mvla[1][2:arg][:])
181*67e74705SXin Li   {}
182*67e74705SXin Li   #pragma omp target map(mvla[:1][:][:])
183*67e74705SXin Li   {}
184*67e74705SXin Li   #pragma omp target map(mvla2[:1][:2][:11])
185*67e74705SXin Li   {}
186*67e74705SXin Li   #pragma omp target map(mvla2[:1][:2][:10]) // expected-error {{array section does not specify contiguous storage}}
187*67e74705SXin Li   {}
188*67e74705SXin Li 
189*67e74705SXin Li   #pragma omp target map(mptr[:2][2+2-4:1][0:5+5]) // expected-error {{array section does not specify contiguous storage}}
190*67e74705SXin Li   {}
191*67e74705SXin Li   #pragma omp target map(mptr[:1][:2-1][2:4-3])
192*67e74705SXin Li   {}
193*67e74705SXin Li   #pragma omp target map(mptr[:1][:arg][2:4-3]) // correct if arg is 1.
194*67e74705SXin Li   {}
195*67e74705SXin Li   #pragma omp target map(mptr[:1][:2-1][0:2])
196*67e74705SXin Li   {}
197*67e74705SXin Li   #pragma omp target map(mptr[:1][:2][0:2]) // expected-error {{array section does not specify contiguous storage}}
198*67e74705SXin Li   {}
199*67e74705SXin Li   #pragma omp target map(mptr[:1][:][0:2]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
200*67e74705SXin Li   {}
201*67e74705SXin Li   #pragma omp target map(mptr[:2][:1][0:2]) // expected-error {{array section does not specify contiguous storage}}
202*67e74705SXin Li   {}
203*67e74705SXin Li 
204*67e74705SXin Li   #pragma omp target map(r.ArrS[0].B)
205*67e74705SXin Li   {}
206*67e74705SXin Li   #pragma omp target map(r.ArrS[:1].B) // expected-error {{OpenMP array section is not allowed here}}
207*67e74705SXin Li   {}
208*67e74705SXin Li   #pragma omp target map(r.ArrS[:arg].B) // expected-error {{OpenMP array section is not allowed here}}
209*67e74705SXin Li   {}
210*67e74705SXin Li   #pragma omp target map(r.ArrS[0].Arr[1:23])
211*67e74705SXin Li   {}
212*67e74705SXin Li   #pragma omp target map(r.ArrS[0].Arr[1:arg])
213*67e74705SXin Li   {}
214*67e74705SXin Li   #pragma omp target map(r.ArrS[0].Arr[arg:23])
215*67e74705SXin Li   {}
216*67e74705SXin Li   #pragma omp target map(r.ArrS[0].Error) // expected-error {{no member named 'Error' in 'SB'}}
217*67e74705SXin Li   {}
218*67e74705SXin Li   #pragma omp target map(r.ArrS[0].A, r.ArrS[1].A) // expected-error {{multiple array elements associated with the same variable are not allowed in map clauses of the same construct}} expected-note {{used here}}
219*67e74705SXin Li   {}
220*67e74705SXin Li   #pragma omp target map(r.ArrS[0].A, t.ArrS[1].A)
221*67e74705SXin Li   {}
222*67e74705SXin Li   #pragma omp target map(r.PtrS[0], r.PtrS->B) // expected-error {{same pointer derreferenced in multiple different ways in map clause expressions}} expected-note {{used here}}
223*67e74705SXin Li   {}
224*67e74705SXin Li   #pragma omp target map(r.RPtrS[0], r.RPtrS->B) // expected-error {{same pointer derreferenced in multiple different ways in map clause expressions}} expected-note {{used here}}
225*67e74705SXin Li   {}
226*67e74705SXin Li   #pragma omp target map(r.S.Arr[:12])
227*67e74705SXin Li   {}
228*67e74705SXin Li   #pragma omp target map(r.S.foo()[:12]) // expected-error {{expected expression containing only member accesses and/or array sections based on named variables}}
229*67e74705SXin Li   {}
230*67e74705SXin Li   #pragma omp target map(r.C, r.D)
231*67e74705SXin Li   {}
232*67e74705SXin Li   #pragma omp target map(r.C, r.C) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}}
233*67e74705SXin Li   {}
234*67e74705SXin Li   #pragma omp target map(r.C) map(r.C) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}}
235*67e74705SXin Li   {}
236*67e74705SXin Li   #pragma omp target map(r.C, r.S)  // this would be an error only caught at runtime - Sema would have to make sure there is not way for the missing data between fields to be mapped somewhere else.
237*67e74705SXin Li   {}
238*67e74705SXin Li   #pragma omp target map(r, r.S)  // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}}
239*67e74705SXin Li   {}
240*67e74705SXin Li   #pragma omp target map(r.C, t.C)
241*67e74705SXin Li   {}
242*67e74705SXin Li   #pragma omp target map(r.A)   // expected-error {{bit fields cannot be used to specify storage in a 'map' clause}}
243*67e74705SXin Li   {}
244*67e74705SXin Li   #pragma omp target map(r.Arr)
245*67e74705SXin Li   {}
246*67e74705SXin Li   #pragma omp target map(r.Arr[3:5])
247*67e74705SXin Li   {}
248*67e74705SXin Li   #pragma omp target map(r.Ptr[3:5])
249*67e74705SXin Li   {}
250*67e74705SXin Li   #pragma omp target map(r.ArrS[3:5].A)   // expected-error {{OpenMP array section is not allowed here}}
251*67e74705SXin Li   {}
252*67e74705SXin Li   #pragma omp target map(r.ArrS[3:5].Arr[6:7])   // expected-error {{OpenMP array section is not allowed here}}
253*67e74705SXin Li   {}
254*67e74705SXin Li   #pragma omp target map(r.ArrS[3].Arr[6:7])
255*67e74705SXin Li   {}
256*67e74705SXin Li   #pragma omp target map(r.S.Arr[4:5])
257*67e74705SXin Li   {}
258*67e74705SXin Li   #pragma omp target map(r.S.Ptr[4:5])
259*67e74705SXin Li   {}
260*67e74705SXin Li   #pragma omp target map(r.S.Ptr[:])  // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
261*67e74705SXin Li   {}
262*67e74705SXin Li   #pragma omp target map((p+1)->A)  // expected-error {{expected expression containing only member accesses and/or array sections based on named variables}}
263*67e74705SXin Li   {}
264*67e74705SXin Li   #pragma omp target map(u.B)  // expected-error {{mapped storage cannot be derived from a union}}
265*67e74705SXin Li   {}
266*67e74705SXin Li 
267*67e74705SXin Li   #pragma omp target data map(to: r.C) //expected-note {{used here}}
268*67e74705SXin Li   {
269*67e74705SXin Li     #pragma omp target map(r.D)  // expected-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}}
270*67e74705SXin Li     {}
271*67e74705SXin Li   }
272*67e74705SXin Li 
273*67e74705SXin Li   #pragma omp target data map(to: t.Ptr) //expected-note {{used here}}
274*67e74705SXin Li   {
275*67e74705SXin Li     #pragma omp target map(t.Ptr[:23])  // expected-error {{pointer cannot be mapped along with a section derived from itself}}
276*67e74705SXin Li     {}
277*67e74705SXin Li   }
278*67e74705SXin Li 
279*67e74705SXin Li   #pragma omp target data map(to: t.C, t.D)
280*67e74705SXin Li   {
281*67e74705SXin Li   #pragma omp target data map(to: t.C)
282*67e74705SXin Li   {
283*67e74705SXin Li     #pragma omp target map(t.D)
284*67e74705SXin Li     {}
285*67e74705SXin Li   }
286*67e74705SXin Li   }
287*67e74705SXin Li 
288*67e74705SXin Li   #pragma omp target data map(to: t)
289*67e74705SXin Li   {
290*67e74705SXin Li   #pragma omp target data map(to: t.C)
291*67e74705SXin Li   {
292*67e74705SXin Li     #pragma omp target map(t.D)
293*67e74705SXin Li     {}
294*67e74705SXin Li   }
295*67e74705SXin Li   }
296*67e74705SXin Li }
foo()297*67e74705SXin Li void foo() {
298*67e74705SXin Li }
299*67e74705SXin Li 
foobool(int argc)300*67e74705SXin Li bool foobool(int argc) {
301*67e74705SXin Li   return argc;
302*67e74705SXin Li }
303*67e74705SXin Li 
304*67e74705SXin Li struct S1; // expected-note 2 {{declared here}}
305*67e74705SXin Li extern S1 a;
306*67e74705SXin Li class S2 {
307*67e74705SXin Li   mutable int a;
308*67e74705SXin Li public:
S2()309*67e74705SXin Li   S2():a(0) { }
S2(S2 & s2)310*67e74705SXin Li   S2(S2 &s2):a(s2.a) { }
311*67e74705SXin Li   static float S2s; // expected-note 4 {{mappable type cannot contain static members}}
312*67e74705SXin Li   static const float S2sc; // expected-note 4 {{mappable type cannot contain static members}}
313*67e74705SXin Li };
314*67e74705SXin Li const float S2::S2sc = 0;
315*67e74705SXin Li const S2 b;
316*67e74705SXin Li const S2 ba[5];
317*67e74705SXin Li class S3 {
318*67e74705SXin Li   int a;
319*67e74705SXin Li public:
S3()320*67e74705SXin Li   S3():a(0) { }
S3(S3 & s3)321*67e74705SXin Li   S3(S3 &s3):a(s3.a) { }
322*67e74705SXin Li };
323*67e74705SXin Li const S3 c;
324*67e74705SXin Li const S3 ca[5];
325*67e74705SXin Li extern const int f;
326*67e74705SXin Li class S4 {
327*67e74705SXin Li   int a;
328*67e74705SXin Li   S4();
329*67e74705SXin Li   S4(const S4 &s4);
330*67e74705SXin Li public:
S4(int v)331*67e74705SXin Li   S4(int v):a(v) { }
332*67e74705SXin Li };
333*67e74705SXin Li class S5 {
334*67e74705SXin Li   int a;
S5()335*67e74705SXin Li   S5():a(0) {}
S5(const S5 & s5)336*67e74705SXin Li   S5(const S5 &s5):a(s5.a) { }
337*67e74705SXin Li public:
S5(int v)338*67e74705SXin Li   S5(int v):a(v) { }
339*67e74705SXin Li };
340*67e74705SXin Li 
341*67e74705SXin Li S3 h;
342*67e74705SXin Li #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
343*67e74705SXin Li 
344*67e74705SXin Li typedef int from;
345*67e74705SXin Li 
346*67e74705SXin Li template <typename T, int I> // expected-note {{declared here}}
tmain(T argc)347*67e74705SXin Li T tmain(T argc) {
348*67e74705SXin Li   const T d = 5;
349*67e74705SXin Li   const T da[5] = { 0 };
350*67e74705SXin Li   S4 e(4);
351*67e74705SXin Li   S5 g(5);
352*67e74705SXin Li   T i, t[20];
353*67e74705SXin Li   T &j = i;
354*67e74705SXin Li   T *k = &j;
355*67e74705SXin Li   T x;
356*67e74705SXin Li   T y;
357*67e74705SXin Li   T to, tofrom, always;
358*67e74705SXin Li   const T (&l)[5] = da;
359*67e74705SXin Li #pragma omp target map // expected-error {{expected '(' after 'map'}}
360*67e74705SXin Li   {}
361*67e74705SXin Li #pragma omp target map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
362*67e74705SXin Li   {}
363*67e74705SXin Li #pragma omp target map() // expected-error {{expected expression}}
364*67e74705SXin Li   {}
365*67e74705SXin Li #pragma omp target map(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
366*67e74705SXin Li   {}
367*67e74705SXin Li #pragma omp target map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}}
368*67e74705SXin Li   {}
369*67e74705SXin Li #pragma omp target map(to:) // expected-error {{expected expression}}
370*67e74705SXin Li   {}
371*67e74705SXin Li #pragma omp target map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
372*67e74705SXin Li   {}
373*67e74705SXin Li #pragma omp target map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
374*67e74705SXin Li   {}
375*67e74705SXin Li #pragma omp target map(x)
376*67e74705SXin Li   foo();
377*67e74705SXin Li #pragma omp target map(tofrom: t[:I])
378*67e74705SXin Li   foo();
379*67e74705SXin Li #pragma omp target map(T: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} expected-error {{incomplete type 'S1' where a complete type is required}}
380*67e74705SXin Li   foo();
381*67e74705SXin Li #pragma omp target map(T) // expected-error {{'T' does not refer to a value}}
382*67e74705SXin Li   foo();
383*67e74705SXin Li #pragma omp target map(I) // expected-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}}
384*67e74705SXin Li   foo();
385*67e74705SXin Li #pragma omp target map(S2::S2s)
386*67e74705SXin Li   foo();
387*67e74705SXin Li #pragma omp target map(S2::S2sc)
388*67e74705SXin Li   foo();
389*67e74705SXin Li #pragma omp target map(x)
390*67e74705SXin Li   foo();
391*67e74705SXin Li #pragma omp target map(to: x)
392*67e74705SXin Li   foo();
393*67e74705SXin Li #pragma omp target map(to: to)
394*67e74705SXin Li   foo();
395*67e74705SXin Li #pragma omp target map(to)
396*67e74705SXin Li   foo();
397*67e74705SXin Li #pragma omp target map(to, x)
398*67e74705SXin Li   foo();
399*67e74705SXin Li #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
400*67e74705SXin Li #pragma omp target data map(tofrom: argc > 0 ? x : y) // expected-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}}
401*67e74705SXin Li #pragma omp target data map(argc)
402*67e74705SXin Li #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}}
403*67e74705SXin Li #pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error 2 {{type 'S2' is not mappable to target}}
404*67e74705SXin Li #pragma omp target data map(ba) // expected-error 2 {{type 'S2' is not mappable to target}}
405*67e74705SXin Li #pragma omp target data map(ca)
406*67e74705SXin Li #pragma omp target data map(da)
407*67e74705SXin Li #pragma omp target data map(S2::S2s)
408*67e74705SXin Li #pragma omp target data map(S2::S2sc)
409*67e74705SXin Li #pragma omp target data map(e, g)
410*67e74705SXin Li #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}}
411*67e74705SXin Li #pragma omp target data map(k) map(k) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}}
412*67e74705SXin Li #pragma omp target map(k), map(k[:5]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} expected-note 2 {{used here}}
413*67e74705SXin Li   foo();
414*67e74705SXin Li #pragma omp target data map(da)
415*67e74705SXin Li #pragma omp target map(da[:4])
416*67e74705SXin Li   foo();
417*67e74705SXin Li #pragma omp target data map(k, j, l) // expected-note 2 {{used here}}
418*67e74705SXin Li #pragma omp target data map(k[:4]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}}
419*67e74705SXin Li #pragma omp target data map(j)
420*67e74705SXin Li #pragma omp target map(l) map(l[:5]) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}}
421*67e74705SXin Li   foo();
422*67e74705SXin Li #pragma omp target data map(k[:4], j, l[:5]) // expected-note 4 {{used here}}
423*67e74705SXin Li #pragma omp target data map(k) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}}
424*67e74705SXin Li #pragma omp target data map(j)
425*67e74705SXin Li #pragma omp target map(l) // expected-error 2 {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}}
426*67e74705SXin Li   foo();
427*67e74705SXin Li 
428*67e74705SXin Li #pragma omp target data map(always, tofrom: x)
429*67e74705SXin Li #pragma omp target data map(always: x) // expected-error {{missing map type}}
430*67e74705SXin Li #pragma omp target data map(tofrom, always: x) // expected-error {{incorrect map type modifier, expected 'always'}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
431*67e74705SXin Li #pragma omp target data map(always, tofrom: always, tofrom, x)
432*67e74705SXin Li #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}}
433*67e74705SXin Li   foo();
434*67e74705SXin Li   return 0;
435*67e74705SXin Li }
436*67e74705SXin Li 
main(int argc,char ** argv)437*67e74705SXin Li int main(int argc, char **argv) {
438*67e74705SXin Li   const int d = 5;
439*67e74705SXin Li   const int da[5] = { 0 };
440*67e74705SXin Li   S4 e(4);
441*67e74705SXin Li   S5 g(5);
442*67e74705SXin Li   int i;
443*67e74705SXin Li   int &j = i;
444*67e74705SXin Li   int *k = &j;
445*67e74705SXin Li   int x;
446*67e74705SXin Li   int y;
447*67e74705SXin Li   int to, tofrom, always;
448*67e74705SXin Li   const int (&l)[5] = da;
449*67e74705SXin Li #pragma omp target data map // expected-error {{expected '(' after 'map'}} expected-error {{expected at least one map clause for '#pragma omp target data'}}
450*67e74705SXin Li #pragma omp target data map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
451*67e74705SXin Li #pragma omp target data map() // expected-error {{expected expression}}
452*67e74705SXin Li #pragma omp target data map(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
453*67e74705SXin Li #pragma omp target data map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}}
454*67e74705SXin Li #pragma omp target data map(to:) // expected-error {{expected expression}}
455*67e74705SXin Li #pragma omp target data map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
456*67e74705SXin Li #pragma omp target data map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
457*67e74705SXin Li #pragma omp target map(x)
458*67e74705SXin Li   foo();
459*67e74705SXin Li #pragma omp target map(to: x)
460*67e74705SXin Li   foo();
461*67e74705SXin Li #pragma omp target map(to: to)
462*67e74705SXin Li   foo();
463*67e74705SXin Li #pragma omp target map(to)
464*67e74705SXin Li   foo();
465*67e74705SXin Li #pragma omp target map(to, x)
466*67e74705SXin Li   foo();
467*67e74705SXin Li #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
468*67e74705SXin Li #pragma omp target data map(tofrom: argc > 0 ? argv[1] : argv[2]) // expected-error {{xpected expression containing only member accesses and/or array sections based on named variables}}
469*67e74705SXin Li #pragma omp target data map(argc)
470*67e74705SXin Li #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}}
471*67e74705SXin Li #pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error 2 {{type 'S2' is not mappable to target}}
472*67e74705SXin Li #pragma omp target data map(argv[1])
473*67e74705SXin Li #pragma omp target data map(ba) // expected-error 2 {{type 'S2' is not mappable to target}}
474*67e74705SXin Li #pragma omp target data map(ca)
475*67e74705SXin Li #pragma omp target data map(da)
476*67e74705SXin Li #pragma omp target data map(S2::S2s)
477*67e74705SXin Li #pragma omp target data map(S2::S2sc)
478*67e74705SXin Li #pragma omp target data map(e, g)
479*67e74705SXin Li #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}}
480*67e74705SXin Li #pragma omp target data map(k), map(k) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}}
481*67e74705SXin Li #pragma omp target map(k), map(k[:5]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} expected-note {{used here}}
482*67e74705SXin Li   foo();
483*67e74705SXin Li #pragma omp target data map(da)
484*67e74705SXin Li #pragma omp target map(da[:4])
485*67e74705SXin Li   foo();
486*67e74705SXin Li #pragma omp target data map(k, j, l) // expected-note {{used here}}
487*67e74705SXin Li #pragma omp target data map(k[:4]) // expected-error {{pointer cannot be mapped along with a section derived from itself}}
488*67e74705SXin Li #pragma omp target data map(j)
489*67e74705SXin Li #pragma omp target map(l) map(l[:5]) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}}
490*67e74705SXin Li   foo();
491*67e74705SXin Li #pragma omp target data map(k[:4], j, l[:5]) // expected-note 2 {{used here}}
492*67e74705SXin Li #pragma omp target data map(k) // expected-error {{pointer cannot be mapped along with a section derived from itself}}
493*67e74705SXin Li #pragma omp target data map(j)
494*67e74705SXin Li #pragma omp target map(l) // expected-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}}
495*67e74705SXin Li   foo();
496*67e74705SXin Li 
497*67e74705SXin Li #pragma omp target data map(always, tofrom: x)
498*67e74705SXin Li #pragma omp target data map(always: x) // expected-error {{missing map type}}
499*67e74705SXin Li #pragma omp target data map(tofrom, always: x) // expected-error {{incorrect map type modifier, expected 'always'}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
500*67e74705SXin Li #pragma omp target data map(always, tofrom: always, tofrom, x)
501*67e74705SXin Li #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}}
502*67e74705SXin Li   foo();
503*67e74705SXin Li #pragma omp target private(j) map(j) // expected-error {{private variable cannot be in a map clause in '#pragma omp target' directive}}  expected-note {{defined as private}}
504*67e74705SXin Li   {}
505*67e74705SXin Li #pragma omp target firstprivate(j) map(j)  // expected-error {{firstprivate variable cannot be in a map clause in '#pragma omp target' directive}} expected-note {{defined as firstprivate}}
506*67e74705SXin Li   {}
507*67e74705SXin Li   return tmain<int, 3>(argc)+tmain<from, 4>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}}
508*67e74705SXin Li }
509*67e74705SXin Li #endif
510