1 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
2 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s
4 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
5 // RUN: %clang_cc1 -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP51
6 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=52 -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP52
7 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
8 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
9 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
10 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP51
11 // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
12 // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP52
14 // RUN: %clang_cc1 -verify -fopenmp-simd -I %S/Inputs -ast-print %s | FileCheck %s
15 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
16 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s
17 // expected-no-diagnostics
24 #pragma omp declare target to(bar) device_type(any)
25 // OMP50: #pragma omp declare target{{$}}
27 // OMP50: #pragma omp end declare target{{$}}
29 #pragma omp declare target to(baz) device_type(nohost)
30 // OMP50: #pragma omp declare target device_type(nohost){{$}}
32 // OMP50: #pragma omp end declare target{{$}}
34 #pragma omp declare target to(bazz) device_type(host)
35 // OMP50: #pragma omp declare target device_type(host){{$}}
36 // OMP50: void bazz();
37 // OMP50: #pragma omp end declare target{{$}}
43 #pragma omp declare target to(boo_c) indirect
44 // OMP51: #pragma omp declare target indirect
45 // OMP51: void boo_c() {
47 // OMP51: #pragma omp end declare target
48 #pragma omp declare target indirect
50 #pragma omp end declare target
51 // OMP51: #pragma omp declare target indirect
52 // OMP51: void yoo() {
54 // OMP51: #pragma omp end declare target
58 #pragma omp declare target to(boo_cpp) indirect
59 // OMP51: #pragma omp declare target indirect
60 // OMP51: void boo_cpp() {
62 // OMP51: #pragma omp end declare target
64 constexpr bool f() {return false;}
65 #pragma omp begin declare target indirect(f())
68 #pragma omp end declare target
69 #pragma omp declare target to(zoo) indirect(false)
70 // OMP51: #pragma omp declare target indirect(f())
71 // OMP51: #pragma omp declare target indirect(false)
72 // OMP51: void zoo() {
74 // OMP51: #pragma omp end declare target
75 // OMP51: #pragma omp declare target indirect(f())
77 // OMP51: #pragma omp end declare target
85 #pragma omp declare target enter(boo_c) indirect
86 // OMP52: #pragma omp declare target indirect
87 // OMP52: void boo_c() {
89 // OMP52: #pragma omp end declare target
90 #pragma omp declare target indirect
92 #pragma omp end declare target
93 // OMP52: #pragma omp declare target indirect
94 // OMP52: void yoo() {
96 // OMP52: #pragma omp end declare target
100 #pragma omp declare target enter(boo_cpp) indirect
101 // OMP52: #pragma omp declare target indirect
102 // OMP52: void boo_cpp() {
104 // OMP52: #pragma omp end declare target
106 constexpr bool f() {return false;}
107 #pragma omp begin declare target indirect(f())
110 #pragma omp end declare target
111 #pragma omp declare target enter(zoo) indirect(false)
112 // OMP52: #pragma omp declare target indirect(f())
113 // OMP52: #pragma omp declare target indirect(false)
114 // OMP52: void zoo() {
116 // OMP52: #pragma omp end declare target
117 // OMP52: #pragma omp declare target indirect(f())
118 // OMP52: void xoo();
119 // OMP52: #pragma omp end declare target
124 int out_decl_target
= 0;
125 #pragma omp declare target (out_decl_target)
127 // CHECK: #pragma omp declare target{{$}}
128 // CHECK: int out_decl_target = 0;
129 // CHECK: #pragma omp end declare target{{$}}
130 // CHECK: #pragma omp declare target{{$}}
131 // CHECK: void lambda()
132 // CHECK: #pragma omp end declare target{{$}}
134 #pragma omp declare target
137 (void)[&] { ++out_decl_target
; };
139 #pragma clang __debug captured
140 (void)out_decl_target
;
143 #pragma omp end declare target
145 #pragma omp declare target
146 // CHECK: #pragma omp declare target{{$}}
148 // CHECK-NEXT: void foo()
149 #pragma omp end declare target
150 // CHECK: #pragma omp end declare target{{$}}
153 #pragma omp declare target
154 // CHECK: #pragma omp declare target
156 // CHECK-NEXT: void foo_c()
157 #pragma omp end declare target
158 // CHECK: #pragma omp end declare target
162 #pragma omp declare target
163 // CHECK: #pragma omp declare target
165 // CHECK-NEXT: void foo_cpp()
166 #pragma omp end declare target
167 // CHECK: #pragma omp end declare target
170 #pragma omp declare target
173 // CHECK: template <class T> struct C {
174 // CHECK: #pragma omp declare target
175 // CHECK-NEXT: static T ts;
176 // CHECK-NEXT: #pragma omp end declare target
178 // CHECK: template<> struct C<int>
180 // CHECK-NEXT: int t;
182 // CHECK-NEXT: #pragma omp declare target
183 // CHECK-NEXT: static int ts;
184 // CHECK: #pragma omp end declare target
188 // CHECK: #pragma omp declare target
189 // CHECK-NEXT: C(int t) : t(t) {
191 // CHECK: #pragma omp end declare target
196 // CHECK: #pragma omp declare target
197 // CHECK-NEXT: int foo() {
198 // CHECK-NEXT: return this->t;
200 // CHECK: #pragma omp end declare target
205 // CHECK: #pragma omp declare target
207 // CHECK: #pragma omp end declare target
209 // CHECK: #pragma omp declare target
210 // CHECK: int test1()
213 return c
.foo() + c
.ts
;
215 #pragma omp end declare target
216 // CHECK: #pragma omp end declare target
221 #pragma omp declare target (a1, f1)
222 // CHECK: #pragma omp declare target{{$}}
224 // CHECK: #pragma omp end declare target{{$}}
225 // CHECK: #pragma omp declare target{{$}}
227 // CHECK: #pragma omp end declare target{{$}}
232 #if _OPENMP == 202111
233 #pragma omp declare target enter(b1) enter(b2), enter(b3, f2)
235 #pragma omp declare target to(b1) to(b2), to(b3, f2)
236 #endif // _OPENMP == 202111
237 // CHECK: #pragma omp declare target{{$}}
239 // CHECK: #pragma omp end declare target{{$}}
240 // CHECK: #pragma omp declare target{{$}}
242 // CHECK: #pragma omp end declare target{{$}}
243 // CHECK: #pragma omp declare target{{$}}
245 // CHECK: #pragma omp end declare target{{$}}
246 // CHECK: #pragma omp declare target{{$}}
248 // CHECK: #pragma omp end declare target{{$}}
251 #pragma omp declare target link(c1) link(c2), link(c3)
252 // CHECK: #pragma omp declare target link{{$}}
254 // CHECK: #pragma omp end declare target{{$}}
255 // CHECK: #pragma omp declare target link{{$}}
257 // CHECK: #pragma omp end declare target{{$}}
258 // CHECK: #pragma omp declare target link{{$}}
260 // CHECK: #pragma omp end declare target{{$}}
263 #pragma omp declare target
266 #pragma omp end declare target
269 // CHECK: struct SSSt {
270 // CHECK: #pragma omp declare target
271 // CHECK: static int a;
272 // CHECK: #pragma omp end declare target
277 #pragma omp declare target
280 #pragma omp end declare target
283 // CHECK: template <class T> struct SSSTt {
284 // CHECK: #pragma omp declare target
285 // CHECK: static T a;
286 // CHECK: #pragma omp end declare target
289 #pragma omp declare target
290 template <typename T
>
291 T
baz() { return T(); }
292 #pragma omp end declare target
295 int baz() { return 1; }
297 // CHECK: #pragma omp declare target
298 // CHECK: template <typename T> T baz() {
299 // CHECK: return T();
301 // CHECK: #pragma omp end declare target
302 // CHECK: #pragma omp declare target
303 // CHECK: template<> float baz<float>() {
304 // CHECK: return float();
306 // CHECK: template<> int baz<int>() {
309 // CHECK: #pragma omp end declare target
311 #pragma omp declare target
312 #include "declare_target_include.h"
314 #pragma omp end declare target
316 // CHECK: #pragma omp declare target
317 // CHECK: void zyx();
318 // CHECK: #pragma omp end declare target
319 // CHECK: #pragma omp declare target
320 // CHECK: void xyz();
321 // CHECK: #pragma omp end declare target
323 #pragma omp declare target
324 #pragma omp declare target
326 #pragma omp end declare target
328 #pragma omp end declare target
330 // CHECK: #pragma omp declare target
331 // CHECK: void abc();
332 // CHECK: #pragma omp end declare target
333 // CHECK: #pragma omp declare target
334 // CHECK: void cba();
335 // CHECK: #pragma omp end declare target
337 #pragma omp declare target
338 int abc1() { return 1; }
339 #if _OPENMP == 202111
340 #pragma omp declare target enter(abc1) device_type(nohost)
342 #pragma omp declare target to(abc1) device_type(nohost)
343 #endif // _OPENMP == 202111
344 #pragma omp end declare target
346 // CHECK-NEXT: #pragma omp declare target
347 // CHECK-NEXT: #pragma omp declare target device_type(nohost)
348 // CHECK-NEXT: int abc1() {
349 // CHECK-NEXT: return 1;
351 // CHECK-NEXT: #pragma omp end declare target
353 #pragma omp declare target
355 #pragma omp declare target link(inner_link)
356 #pragma omp end declare target
358 // CHECK-NEXT: #pragma omp declare target
359 // CHECK-NEXT: #pragma omp declare target link
360 // CHECK-NEXT: int inner_link;
361 // CHECK-NEXT: #pragma omp end declare target
363 int main (int argc
, char **argv
) {
373 // CHECK: #pragma omp declare target
374 // CHECK-NEXT: int ts = 1;
375 // CHECK-NEXT: #pragma omp end declare target
377 // Do not expect anything here since the region is empty.
378 #pragma omp declare target
379 #pragma omp end declare target