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