xref: /llvm-project/clang/test/OpenMP/target_data_ast_print.cpp (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
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
4 
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
8 
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
12 
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
17 
18 #ifndef HEADER
19 #define HEADER
20 
foo()21 void foo() {}
22 
23 template <typename T, int C>
tmain(T argc,T * argv)24 T tmain(T argc, T *argv) {
25   T i, j, b, c, d, e, x[20];
26 
27 #pragma omp target data map(to: c)
28   i = argc;
29 
30 #pragma omp target data map(to: c) if (target data: j > 0)
31   foo();
32 
33 #pragma omp target data map(to: c) if (b)
34   foo();
35 
36 #pragma omp target data map(c)
37   foo();
38 
39 #pragma omp target data map(c) if(b>e)
40   foo();
41 
42 #pragma omp target data map(x[0:10], c)
43   foo();
44 
45 #pragma omp target data map(to: c) map(from: d)
46   foo();
47 
48 #pragma omp target data map(always,alloc: e)
49   foo();
50 
51 #pragma omp target data map(close,alloc: e)
52   foo();
53 
54 #ifdef OMP51
55 #pragma omp target data map(present,alloc: e)
56   foo();
57 #endif
58 
59 #ifdef OMPX
60 #pragma omp target data map(ompx_hold,alloc: e)
61   foo();
62 #endif
63 
64 // nesting a target region
65 #pragma omp target data map(e)
66 {
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
79 }
80 
81   return 0;
82 }
83 
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();
186 
main(int argc,char ** argv)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;
191 
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();
202 
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();
207 
208 #pragma omp target data map(c)
209 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
210   foo();
211 // CHECK-NEXT: foo();
212 
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();
217 
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();
222 
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();
227 
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();
232 
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();
237 
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
244 
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
251 
252 // nesting a target region
253 #pragma omp target data map(e)
254 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
255 {
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();
268 }
269 
270   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
271 }
272 
273 #endif
274