xref: /llvm-project/clang/test/OpenMP/declare_target_messages.cpp (revision 978e0839ae2feb5ddda3e4e0b5a7ddba1727d2d8)
1 // DEFINE: %{common_opts_mac} = -triple x86_64-apple-macos10.7.0
2 // DEFINE: %{limit} = -fnoopenmp-use-tls -ferror-limit 100
3 // DEFINE: %{target_mac} = -fopenmp-targets=x86_64-apple-macos10.7.0
4 // DEFINE: %{aux_triple} = -aux-triple x86_64-apple-macos10.7.0
5 // DEFINE: %{openmp45} = -fopenmp -fopenmp-version=45
6 // DEFINE: %{openmp50} = -fopenmp -fopenmp-version=50
7 // DEFINE: %{openmp50_simd} = -fopenmp-simd -fopenmp-version=50
8 // DEFINE: %{openmp52} = -fopenmp -fopenmp-version=52
9 // DEFINE: %{openmp60} = -fopenmp -fopenmp-version=60
10 // DEFINE: %{openmp60_simd} = -fopenmp-simd -fopenmp-version=60
11 
12 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause,omp45-to-51-clause  %{openmp45} %{limit} -o - %s
13 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51  %{openmp50} %{target_mac} %{limit} -o - %s
14 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var  %{openmp60} %{target_mac} %{limit} -o - %s
15 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51,dev5  %{openmp50} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s
16 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s
17 
18 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} %{target_mac} %{limit} -o - %s
19 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} %{target_mac} %{limit} -o - %s
20 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s
21 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s
22 
23 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause -fopenmp-version=45 -fopenmp-simd %{limit} -o - %s
24 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
25 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -DTESTEND=1 -o - %s
26 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s
27 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s
28 
29 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s
30 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s
31 
32 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 %{openmp50} %{limit} -o - %s
33 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
34 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s
35 
36 
37 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
38 #pragma omp end declare target
39 
40 // ompvar-error@+1 {{variable captured in declare target region must appear in a to clause}}
41 int a, b, z;
42 // expected-note@+1 {{defined as threadprivate or thread local}}
43 __thread int t;
44 
45 // expected-error@+1 {{expected '(' after 'declare target'}}
46 #pragma omp declare target .
47 
48 #pragma omp declare target
49 void f();
50 // expected-warning@+1 {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
51 #pragma omp end declare target shared(a)
52 
53 // omp52-error@+8 {{unexpected 'map' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
54 // omp52-error@+7 {{expected at least one 'enter', 'link' or 'indirect' clause}}
55 // omp51-error@+6 {{unexpected 'map' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
56 // omp51-error@+5 {{expected at least one 'to', 'link' or 'indirect' clause}}
57 // omp5-error@+4 {{unexpected 'map' clause, only 'to', 'link' or 'device_type' clauses expected}}
58 // omp5-error@+3 {{expected at least one 'to' or 'link' clause}}
59 // omp45-error@+2 {{unexpected 'map' clause, only 'to' or 'link' clauses expected}}
60 // omp45-error@+1 {{expected at least one 'to' or 'link' clause}}
61 #pragma omp declare target map(a)
62 
63 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
64 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
65 // omp45-to-51-error@+1 {{use of undeclared identifier 'foo1'}}
66 #pragma omp declare target to(foo1)
67 
68 // expected-error@+1 {{use of undeclared identifier 'foo2'}}
69 #pragma omp declare target link(foo2)
70 
71 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
72 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
73 // dev5-note@+2 {{marked as 'device_type(host)' here}}
74 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
75 #pragma omp declare target to(f) device_type(host)
76 
77 void q();
78 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
79 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
80 // omp5-and-51-warning@+2 {{more than one 'device_type' clause is specified}}
81 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
82 #pragma omp declare target to(q) device_type(any) device_type(any) device_type(host)
83 
84 #if _OPENMP == 202011
85 // omp51-error@+1 {{directive '#pragma omp declare target' cannot contain more than one 'indirect' clause}}
86 #pragma omp declare target to(q) indirect(true) indirect(false)
87 
88 // expected-note@+1 {{declared here}}
89 int xxx;
90 // omp51-error@+2 {{expression is not an integral constant expression}}
91 // omp51-note@+1 {{read of non-const variable 'xxx' is not allowed in a constant expression}}
92 #pragma omp declare target to(q) indirect(xxx)
93 
94 constexpr bool fz() {return true;}
95 // omp51-error@+1 {{unexpected 'to' clause, only 'device_type', 'indirect' clauses expected}}
96 #pragma omp begin declare target to(q) indirect(fz()) device_type(nohost)
97 #pragma omp end declare target
98 
99 // omp51-error@+1 {{unexpected 'to' clause, only 'device_type', 'indirect' clauses expected}}
100 #pragma omp begin declare target indirect to(xxx)
101 void bar();
102 #pragma omp end declare target
103 
104 // omp51-error@+2 {{unexpected 'tofrom' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
105 // omp51-error@+1 {{expected at least one 'to', 'link' or 'indirect' clause}}
106 #pragma omp declare target tofrom(xxx)
107 
108 // omp51-error@+1 {{only 'device_type(any)' clause is allowed with indirect clause}}
109 #pragma omp begin declare target device_type(host) indirect
110 void bar();
111 #pragma omp end declare target
112 #endif  // _OPENMP
113 
114 void c();
115 
116 // expected-note@+1 {{'func' defined here}}
117 void func() {}
118 
119 // omp52-error@+5 {{unexpected 'allocate' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
120 // omp51-error@+4 {{unexpected 'allocate' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
121 // omp5-error@+3 {{unexpected 'allocate' clause, only 'to', 'link' or 'device_type' clauses expected}}
122 // expected-error@+2 {{function name is not allowed in 'link' clause}}
123 // omp45-error@+1 {{unexpected 'allocate' clause, only 'to' or 'link' clauses expected}}
124 #pragma omp declare target link(func) allocate(a)
125 
126 void bar();
127 void baz() {bar();}
128 // omp5-or-later-warning@+1 {{declaration marked as declare target after first use, it may lead to incorrect results}}
129 #pragma omp declare target(bar)
130 
131 extern int b;
132 
133 struct NonT {
134   int a;
135 };
136 
137 typedef int sint;
138 
139 template <typename T>
140 T bla1() { return 0; }
141 
142 #pragma omp declare target
143 template <typename T>
144 T bla2() { return 0; }
145 #pragma omp end declare target
146 
147 template<>
148 float bla2() { return 1.0; }
149 
150 #pragma omp declare target
151 void blub2() {
152   bla2<float>();
153   bla2<int>();
154 }
155 #pragma omp end declare target
156 
157 void t2() {
158 #pragma omp target
159   {
160     bla2<float>();
161     bla2<long>();
162   }
163 }
164 
165 #pragma omp declare target
166   void abc();
167 #pragma omp end declare target
168 void cba();
169 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
170 #pragma omp end declare target
171 
172 #pragma omp declare target
173 #pragma omp declare target
174 void def();
175 #pragma omp end declare target
176 void fed();
177 
178 #pragma omp declare target
179 // expected-note@+1 {{defined as threadprivate or thread local}}
180 #pragma omp threadprivate(a)
181 extern int b;
182 int g;
183 
184 struct T {
185   int a;
186   virtual int method();
187 };
188 
189 class VC {
190   T member;
191   NonT member1;
192   public:
193     virtual int method() { T a; return 0; }
194 };
195 
196 struct C {
197   NonT a;
198   sint b;
199   int method();
200   int method1();
201 };
202 
203 int C::method1() {
204   return 0;
205 }
206 
207 void foo(int p) {
208 // expected-error@+1 {{threadprivate variables cannot be used in target constructs}}
209   a = 0;
210   b = 0;
211 // expected-error@+1 {{threadprivate variables cannot be used in target constructs}}
212   t = 1;
213   C object;
214   VC object1;
215   g = object.method();
216   g += object.method1();
217   g += object1.method() + p;
218   // dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
219   f();
220   q();
221   c();
222 }
223 #pragma omp declare target
224 void foo1() {
225   // omp5-or-later-var-note@+1 {{variable 'z' is captured here}}
226   [&](){ (void)(b+z);}();
227 }
228 #pragma omp end declare target
229 
230 #pragma omp end declare target
231 #pragma omp end declare target
232 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
233 #pragma omp end declare target
234 
235 int C::method() {
236   return 0;
237 }
238 
239 struct S {
240 #pragma omp declare target
241   int v;
242 #pragma omp end declare target
243 };
244 
245 void foo3() {
246   return;
247 }
248 
249 int *y;
250 int **w = &y;
251 int main (int argc, char **argv) {
252   int a = 2;
253 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp declare target'}}
254 #pragma omp declare target
255   int v;
256 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
257 #pragma omp end declare target
258   foo(v);
259 
260   // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
261   // omp52-error@+1 {{unexpected 'to' clause, use 'enter' instead}}
262 #pragma omp declare target to(foo3) link(w)
263   // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
264   // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
265   // omp45-to-51-var-error@+1 {{local variable 'a' should not be used in 'declare target' directive}}
266 #pragma omp declare target to(a)
267   return (0);
268 }
269 
270 namespace {
271 #pragma omp declare target
272   int x;
273 }
274 #pragma omp end declare target
275 
276 // expected-error@+1 {{'S' used in declare target directive is not a variable or a function name}}
277 #pragma omp declare target link(S)
278 
279 // expected-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}}
280 #pragma omp declare target (x, x)
281 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
282 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
283 // omp45-to-51-clause-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}}
284 #pragma omp declare target to(x) to(x)
285 // expected-error@+1 {{'x' must not appear in both clauses 'to' and 'link'}}
286 #pragma omp declare target link(x)
287 
288 void bazz() {}
289 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
290 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
291 // host5-note@+2 3 {{marked as 'device_type(nohost)' here}}
292 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
293 #pragma omp declare target to(bazz) device_type(nohost)
294 void bazzz() {bazz();}
295 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
296 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
297 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
298 #pragma omp declare target to(bazzz) device_type(nohost)
299 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
300 void any() {bazz();}
301 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
302 void host1() {bazz();}
303 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
304 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
305 // dev5-note@+2 3 {{marked as 'device_type(host)' here}}
306 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
307 #pragma omp declare target to(host1) device_type(host)
308 //host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
309 void host2() {bazz();}
310 // omp52-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
311 // omp52-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
312 #pragma omp declare target to(host2)
313 // dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
314 void device() {host1();}
315 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
316 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
317 // host5-note@+2 2 {{marked as 'device_type(nohost)' here}}
318 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
319 #pragma omp declare target to(device) device_type(nohost)
320 void host3() {host1();} // dev5-error {{function with 'device_type(host)' is not available on device}}
321 // omp52-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
322 // omp52-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
323 #pragma omp declare target to(host3)
324 
325 #pragma omp declare target
326 void any1() {any();}
327 // dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
328 void any2() {host1();}
329 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
330 void any3() {device();}
331 void any4() {any2();}
332 #pragma omp end declare target
333 
334 void any5() {any();}
335 void any6() {host1();}
336 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
337 void any7() {device();}
338 void any8() {any2();}
339 
340 int MultiDevTy;
341 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
342 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
343 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
344 #pragma omp declare target to(MultiDevTy) device_type(any)
345 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
346 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
347 // host-5-and-51-error@+2 {{'device_type(host)' does not match previously specified 'device_type(any)' for the same declaration}}
348 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
349 #pragma omp declare target to(MultiDevTy) device_type(host)
350 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
351 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
352 // no-host5-and-51-error@+2 {{'device_type(nohost)' does not match previously specified 'device_type(any)' for the same declaration}}
353 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
354 #pragma omp declare target to(MultiDevTy) device_type(nohost)
355 
356 // expected-warning@+1 {{declaration is not declared in any declare target region}}
357 static int variable = 100;
358 static float variable1 = 200;
359 // expected-warning@+1 {{declaration is not declared in any declare target region}}
360 static float variable2 = variable1;
361 
362 // expected-warning@+1 {{declaration is not declared in any declare target region}}
363 static int var = 1;
364 
365 static int var1 = 10;
366 static int *var2 = &var1;
367 // expected-warning@+1 {{declaration is not declared in any declare target region}}
368 static int **ptr1 = &var2;
369 
370 int arr[2] = {1,2};
371 // expected-warning@+1 {{declaration is not declared in any declare target region}}
372 int (*arrptr)[2] = &arr;
373 
374 class declare{
375   public: int x;
376           void print();
377 };
378 declare obj1;
379 // expected-warning@+1 {{declaration is not declared in any declare target region}}
380 declare *obj2 = &obj1;
381 
382 struct target{
383   int x;
384   void print();
385 };
386 // expected-warning@+1 {{declaration is not declared in any declare target region}}
387 static target S;
388 
389 #pragma omp declare target
390 // expected-note@+1 {{used here}}
391 int target_var = variable;
392 // expected-note@+1 {{used here}}
393 float target_var1 = variable2;
394 // expected-note@+1 {{used here}}
395 int *ptr = &var;
396 // expected-note@+1 {{used here}}
397 int ***ptr2 = &ptr1;
398 // expected-note@+1 {{used here}}
399 int (**ptr3)[2] = &arrptr;
400 // expected-note@+1 {{used here}}
401 declare **obj3 = &obj2;
402 // expected-note@+1 {{used here}}
403 target *S1 = &S;
404 #pragma omp end declare target
405 
406 #if TESTENDINC
407 #include "unterminated_declare_target_include.h"
408 #elif TESTEND
409 // expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp declare target'}}
410 #pragma omp declare target
411 #else
412 // expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}}
413 #pragma omp begin declare target
414 #endif
415