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
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)
30 #pragma omp target data map(to: c) if (target data: j > 0)
33 #pragma omp target data map(to: c) if (b)
36 #pragma omp target data map(c)
39 #pragma omp target data map(c) if(b>e)
42 #pragma omp target data map(x[0:10], c)
45 #pragma omp target data map(to: c) map(from: d)
48 #pragma omp target data map(always,alloc: e)
51 #pragma omp target data map(close,alloc: e)
55 #pragma omp target data map(present,alloc: e)
60 #pragma omp target data map(ompx_hold,alloc: e)
64 // nesting a target region
65 #pragma omp target data map(e)
67 #pragma omp target map(always, alloc: e)
69 #pragma omp target map(close, alloc: e)
72 #pragma omp target map(present, alloc: e)
76 #pragma omp target map(ompx_hold, alloc: e)
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)
90 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
92 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
94 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
96 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
98 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
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)
108 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
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)
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)
142 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
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)
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)
176 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
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)
187 int main (int argc
, char **argv
) {
188 int b
= argc
, c
, d
, e
, f
, g
, x
[20];
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)
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)
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)
206 // CHECK-NEXT: foo();
208 #pragma omp target data map(c)
209 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
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)
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)
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)
226 // CHECK-NEXT: foo();
228 #pragma omp target data map(always,alloc: e)
229 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
231 // CHECK-NEXT: foo();
233 #pragma omp target data map(close,alloc: e)
234 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
236 // CHECK-NEXT: foo();
238 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
239 // OMP51-NEXT: foo();
241 #pragma omp target data map(present,alloc: e)
245 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)
248 #pragma omp target data map(ompx_hold,alloc: e)
252 // nesting a target region
253 #pragma omp target data map(e)
254 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
257 #pragma omp target map(always, alloc: e)
258 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
260 // CHECK-NEXT: foo();
261 #pragma omp target map(close, alloc: e)
262 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
264 // CHECK-NEXT: foo();
265 #pragma omp target map(always, alloc: e)
266 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
270 return tmain
<int, 5>(argc
, &argc
) + tmain
<char, 1>(argv
[0][0], argv
[0]);