[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / OpenMP / target_data_ast_print.cpp
blob9e883b25f11d41ac726fb048082e34327ad48719
1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s
9 // RUN: %clang_cc1 -DOMP51 -DOMPX -verify -fopenmp -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s
10 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
11 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp -fopenmp-extensions -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s
13 // RUN: %clang_cc1 -DOMP51 -DOMPX -verify -fopenmp-simd -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s
14 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp-simd -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
15 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp-simd -fopenmp-extensions -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s
16 // expected-no-diagnostics
18 #ifndef HEADER
19 #define HEADER
21 void foo() {}
23 template <typename T, int C>
24 T tmain(T argc, T *argv) {
25 T i, j, b, c, d, e, x[20];
27 #pragma omp target data map(to: c)
28 i = argc;
30 #pragma omp target data map(to: c) if (target data: j > 0)
31 foo();
33 #pragma omp target data map(to: c) if (b)
34 foo();
36 #pragma omp target data map(c)
37 foo();
39 #pragma omp target data map(c) if(b>e)
40 foo();
42 #pragma omp target data map(x[0:10], c)
43 foo();
45 #pragma omp target data map(to: c) map(from: d)
46 foo();
48 #pragma omp target data map(always,alloc: e)
49 foo();
51 #pragma omp target data map(close,alloc: e)
52 foo();
54 #ifdef OMP51
55 #pragma omp target data map(present,alloc: e)
56 foo();
57 #endif
59 #ifdef OMPX
60 #pragma omp target data map(ompx_hold,alloc: e)
61 foo();
62 #endif
64 // nesting a target region
65 #pragma omp target data map(e)
67 #pragma omp target map(always, alloc: e)
68 foo();
69 #pragma omp target map(close, alloc: e)
70 foo();
71 #ifdef OMP51
72 #pragma omp target map(present, alloc: e)
73 foo();
74 #endif
75 #ifdef OMPX
76 #pragma omp target map(ompx_hold, alloc: e)
77 foo();
78 #endif
81 return 0;
84 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
85 // CHECK-NEXT: T i, j, b, c, d, e, x[20];
86 // CHECK-NEXT: #pragma omp target data map(to: c){{$}}
87 // CHECK-NEXT: i = argc;
88 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
89 // CHECK-NEXT: foo();
90 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
91 // CHECK-NEXT: foo();
92 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
93 // CHECK-NEXT: foo();
94 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
95 // CHECK-NEXT: foo();
96 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
97 // CHECK-NEXT: foo();
98 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
99 // CHECK-NEXT: foo();
100 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
101 // CHECK-NEXT: foo();
102 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
103 // CHECK-NEXT: foo();
104 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
105 // OMP51-NEXT: foo();
106 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)
107 // OMPX-NEXT: foo();
108 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
109 // CHECK-NEXT: {
110 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
111 // CHECK-NEXT: foo();
112 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
113 // CHECK-NEXT: foo();
114 // OMP51-NEXT: #pragma omp target map(present,alloc: e)
115 // OMP51-NEXT: foo();
116 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e)
117 // OMPX-NEXT: foo();
118 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
119 // CHECK-NEXT: int i, j, b, c, d, e, x[20];
120 // CHECK-NEXT: #pragma omp target data map(to: c)
121 // CHECK-NEXT: i = argc;
122 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
123 // CHECK-NEXT: foo();
124 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
125 // CHECK-NEXT: foo();
126 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
127 // CHECK-NEXT: foo();
128 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
129 // CHECK-NEXT: foo();
130 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
131 // CHECK-NEXT: foo();
132 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
133 // CHECK-NEXT: foo();
134 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
135 // CHECK-NEXT: foo();
136 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
137 // CHECK-NEXT: foo();
138 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
139 // OMP51-NEXT: foo();
140 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)
141 // OMPX-NEXT: foo();
142 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
143 // CHECK-NEXT: {
144 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
145 // CHECK-NEXT: foo();
146 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
147 // CHECK-NEXT: foo();
148 // OMP51-NEXT: #pragma omp target map(present,alloc: e)
149 // OMP51-NEXT: foo();
150 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e)
151 // OMPX-NEXT: foo();
152 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
153 // CHECK-NEXT: char i, j, b, c, d, e, x[20];
154 // CHECK-NEXT: #pragma omp target data map(to: c)
155 // CHECK-NEXT: i = argc;
156 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
157 // CHECK-NEXT: foo();
158 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
159 // CHECK-NEXT: foo();
160 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
161 // CHECK-NEXT: foo();
162 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
163 // CHECK-NEXT: foo();
164 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
165 // CHECK-NEXT: foo();
166 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
167 // CHECK-NEXT: foo();
168 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
169 // CHECK-NEXT: foo();
170 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
171 // CHECK-NEXT: foo();
172 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
173 // OMP51-NEXT: foo();
174 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)
175 // OMPX-NEXT: foo();
176 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
177 // CHECK-NEXT: {
178 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
179 // CHECK-NEXT: foo();
180 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
181 // CHECK-NEXT: foo();
182 // OMP51-NEXT: #pragma omp target map(present,alloc: e)
183 // OMP51-NEXT: foo();
184 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e)
185 // OMPX-NEXT: foo();
187 int main (int argc, char **argv) {
188 int b = argc, c, d, e, f, g, x[20];
189 static int a;
190 // CHECK: static int a;
192 #pragma omp target data map(to: ([argc][3][a])argv)
193 // CHECK: #pragma omp target data map(to: ([argc][3][a])argv)
194 #pragma omp target data map(to: c)
195 // CHECK: #pragma omp target data map(to: c)
196 a=2;
197 // CHECK-NEXT: a = 2;
198 #pragma omp target data map(to: c) if (target data: b)
199 // CHECK: #pragma omp target data map(to: c) if(target data: b)
200 foo();
201 // CHECK-NEXT: foo();
203 #pragma omp target data map(to: c) if (b > g)
204 // CHECK: #pragma omp target data map(to: c) if(b > g)
205 foo();
206 // CHECK-NEXT: foo();
208 #pragma omp target data map(c)
209 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
210 foo();
211 // CHECK-NEXT: foo();
213 #pragma omp target data map(c) if(b>g)
214 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g)
215 foo();
216 // CHECK-NEXT: foo();
218 #pragma omp target data map(x[0:10], c)
219 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
220 foo();
221 // CHECK-NEXT: foo();
223 #pragma omp target data map(to: c) map(from: d)
224 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
225 foo();
226 // CHECK-NEXT: foo();
228 #pragma omp target data map(always,alloc: e)
229 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
230 foo();
231 // CHECK-NEXT: foo();
233 #pragma omp target data map(close,alloc: e)
234 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
235 foo();
236 // CHECK-NEXT: foo();
238 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
239 // OMP51-NEXT: foo();
240 #ifdef OMP51
241 #pragma omp target data map(present,alloc: e)
242 foo();
243 #endif
245 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)
246 // OMPX-NEXT: foo();
247 #ifdef OMPX
248 #pragma omp target data map(ompx_hold,alloc: e)
249 foo();
250 #endif
252 // nesting a target region
253 #pragma omp target data map(e)
254 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
256 // CHECK-NEXT: {
257 #pragma omp target map(always, alloc: e)
258 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
259 foo();
260 // CHECK-NEXT: foo();
261 #pragma omp target map(close, alloc: e)
262 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
263 foo();
264 // CHECK-NEXT: foo();
265 #pragma omp target map(always, alloc: e)
266 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
267 foo();
270 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
273 #endif