1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8 
9 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
10 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
11 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
12 
13 // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s
14 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
15 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
16 
17 // expected-no-diagnostics
18 
19 #ifndef HEADER
20 #define HEADER
21 
22 template <typename T, int C>
23 T tmain(T argc, T *argv) {
24   T i, j, b, c, d, e, x[20];
25 
26   i = argc;
27 #pragma omp target exit data map(from: i)
28 
29 #pragma omp target exit data map(from: i) if (target exit data: j > 0)
30 
31 #pragma omp target exit data map(from: i) if (b)
32 
33 #pragma omp target exit data map(from: c)
34 
35 #pragma omp target exit data map(from: c) if(b>e)
36 
37 #pragma omp target exit data map(release: x[0:10], c)
38 
39 #pragma omp target exit data map(delete: x[0:10])
40 
41 #pragma omp target exit data map(always, delete: x[0:10])
42 
43 #pragma omp target exit data map(from: c) map(release: d)
44 
45 #pragma omp target exit data map(always,release: e)
46 
47 #pragma omp target exit data nowait map(from: i)
48 
49 #pragma omp target exit data nowait map(from: i) if (target exit data: j > 0)
50 
51 #pragma omp target exit data map(from: i) if (b) nowait
52 
53 #pragma omp target exit data map(from: c) nowait
54 
55 #pragma omp target exit data map(from: c) nowait if(b>e)
56 
57 #pragma omp target exit data nowait map(release: x[0:10], c)
58 
59 #pragma omp target exit data nowait map(from: c) map(release: d)
60 
61 #pragma omp target exit data nowait map(always,release: e)
62 
63 #pragma omp target exit data depend(in : argc, argv[i:argc], x[:]) nowait map(from: i)
64 
65 #pragma omp target exit data nowait depend(in : argc, argv[i:argc], x[:]) map(from: i) if (target exit data: j > 0)
66 
67 #pragma omp target exit data map(from: i) depend(in : argc, argv[i:argc], x[:]) if (b) nowait
68 
69 #pragma omp target exit data map(from: c) depend(in : argc, argv[i:argc], x[:]) nowait
70 
71 #pragma omp target exit data map(from: c) depend(in : argc, argv[i:argc], x[:]) nowait if(b>e)
72 
73 #pragma omp target exit data nowait map(release: x[0:10], c) depend(in : argc, argv[i:argc], x[:])
74 
75 #pragma omp target exit data nowait map(from: c) depend(in : argc, argv[i:argc], x[:]) map(release: d)
76 
77 #pragma omp target exit data depend(in : argc, argv[i:argc], x[:]) nowait map(always,release: e)
78 
79   return 0;
80 }
81 
82 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
83 // CHECK-NEXT: T i, j, b, c, d, e, x[20];
84 // CHECK-NEXT: i = argc;
85 // CHECK-NEXT: #pragma omp target exit data map(from: i){{$}}
86 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(target exit data: j > 0)
87 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(b)
88 // CHECK-NEXT: #pragma omp target exit data map(from: c)
89 // CHECK-NEXT: #pragma omp target exit data map(from: c) if(b > e)
90 // CHECK-NEXT: #pragma omp target exit data map(release: x[0:10],c)
91 // CHECK-NEXT: #pragma omp target exit data map(delete: x[0:10])
92 // CHECK-NEXT: #pragma omp target exit data map(always,delete: x[0:10])
93 // CHECK-NEXT: #pragma omp target exit data map(from: c) map(release: d)
94 // CHECK-NEXT: #pragma omp target exit data map(always,release: e)
95 // CHECK-NEXT: #pragma omp target exit data nowait map(from: i)
96 // CHECK-NEXT: #pragma omp target exit data nowait map(from: i) if(target exit data: j > 0)
97 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(b) nowait
98 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait
99 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait if(b > e)
100 // CHECK-NEXT: #pragma omp target exit data nowait map(release: x[0:10],c)
101 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) map(release: d)
102 // CHECK-NEXT: #pragma omp target exit data nowait map(always,release: e)
103 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) nowait map(from: i)
104 // CHECK-NEXT: #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(from: i) if(target exit data: j > 0)
105 // CHECK-NEXT: #pragma omp target exit data map(from: i) depend(in : argc,argv[i:argc],x[:]) if(b) nowait
106 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait
107 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait if(b > e)
108 // CHECK-NEXT: #pragma omp target exit data nowait map(release: x[0:10],c) depend(in : argc,argv[i:argc],x[:])
109 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) depend(in : argc,argv[i:argc],x[:]) map(release: d)
110 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) nowait map(always,release: e)
111 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
112 // CHECK-NEXT: int i, j, b, c, d, e, x[20];
113 // CHECK-NEXT: i = argc;
114 // CHECK-NEXT: #pragma omp target exit data map(from: i)
115 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(target exit data: j > 0)
116 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(b)
117 // CHECK-NEXT: #pragma omp target exit data map(from: c)
118 // CHECK-NEXT: #pragma omp target exit data map(from: c) if(b > e)
119 // CHECK-NEXT: #pragma omp target exit data map(release: x[0:10],c)
120 // CHECK-NEXT: #pragma omp target exit data map(delete: x[0:10])
121 // CHECK-NEXT: #pragma omp target exit data map(always,delete: x[0:10])
122 // CHECK-NEXT: #pragma omp target exit data map(from: c) map(release: d)
123 // CHECK-NEXT: #pragma omp target exit data map(always,release: e)
124 // CHECK-NEXT: #pragma omp target exit data nowait map(from: i)
125 // CHECK-NEXT: #pragma omp target exit data nowait map(from: i) if(target exit data: j > 0)
126 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(b) nowait
127 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait
128 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait if(b > e)
129 // CHECK-NEXT: #pragma omp target exit data nowait map(release: x[0:10],c)
130 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) map(release: d)
131 // CHECK-NEXT: #pragma omp target exit data nowait map(always,release: e)
132 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) nowait map(from: i)
133 // CHECK-NEXT: #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(from: i) if(target exit data: j > 0)
134 // CHECK-NEXT: #pragma omp target exit data map(from: i) depend(in : argc,argv[i:argc],x[:]) if(b) nowait
135 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait
136 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait if(b > e)
137 // CHECK-NEXT: #pragma omp target exit data nowait map(release: x[0:10],c) depend(in : argc,argv[i:argc],x[:])
138 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) depend(in : argc,argv[i:argc],x[:]) map(release: d)
139 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) nowait map(always,release: e)
140 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
141 // CHECK-NEXT: char i, j, b, c, d, e, x[20];
142 // CHECK-NEXT: i = argc;
143 // CHECK-NEXT: #pragma omp target exit data map(from: i)
144 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(target exit data: j > 0)
145 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(b)
146 // CHECK-NEXT: #pragma omp target exit data map(from: c)
147 // CHECK-NEXT: #pragma omp target exit data map(from: c) if(b > e)
148 // CHECK-NEXT: #pragma omp target exit data map(release: x[0:10],c)
149 // CHECK-NEXT: #pragma omp target exit data map(delete: x[0:10])
150 // CHECK-NEXT: #pragma omp target exit data map(always,delete: x[0:10])
151 // CHECK-NEXT: #pragma omp target exit data map(from: c) map(release: d)
152 // CHECK-NEXT: #pragma omp target exit data map(always,release: e)
153 // CHECK-NEXT: #pragma omp target exit data nowait map(from: i)
154 // CHECK-NEXT: #pragma omp target exit data nowait map(from: i) if(target exit data: j > 0)
155 // CHECK-NEXT: #pragma omp target exit data map(from: i) if(b) nowait
156 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait
157 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait if(b > e)
158 // CHECK-NEXT: #pragma omp target exit data nowait map(release: x[0:10],c)
159 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) map(release: d)
160 // CHECK-NEXT: #pragma omp target exit data nowait map(always,release: e)
161 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) nowait map(from: i)
162 // CHECK-NEXT: #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(from: i) if(target exit data: j > 0)
163 // CHECK-NEXT: #pragma omp target exit data map(from: i) depend(in : argc,argv[i:argc],x[:]) if(b) nowait
164 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait
165 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait if(b > e)
166 // CHECK-NEXT: #pragma omp target exit data nowait map(release: x[0:10],c) depend(in : argc,argv[i:argc],x[:])
167 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) depend(in : argc,argv[i:argc],x[:]) map(release: d)
168 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) nowait map(always,release: e)
169 
main(int argc,char ** argv)170 int main (int argc, char **argv) {
171   int b = argc, i, c, d, e, f, g, x[20];
172   static int a;
173 // CHECK: static int a;
174 
175 #pragma omp target exit data map(from: a)
176 // CHECK:      #pragma omp target exit data map(from: a)
177   a=2;
178 // CHECK-NEXT: a = 2;
179 #pragma omp target exit data map(from: a) if (target exit data: b)
180 // CHECK: #pragma omp target exit data map(from: a) if(target exit data: b)
181 
182 #pragma omp target exit data map(from: a) if (b > g)
183 // CHECK: #pragma omp target exit data map(from: a) if(b > g)
184 
185 #pragma omp target exit data map(from: c)
186 // CHECK-NEXT: #pragma omp target exit data map(from: c)
187 
188 #pragma omp target exit data map(release: c) if(b>g)
189 // CHECK-NEXT: #pragma omp target exit data map(release: c) if(b > g)
190 
191 #pragma omp target exit data map(from: x[0:10], c)
192 // CHECK-NEXT: #pragma omp target exit data map(from: x[0:10],c)
193 
194 #pragma omp target exit data map(delete: x[0:10])
195 // CHECK-NEXT: #pragma omp target exit data map(delete: x[0:10])
196 
197 #pragma omp target exit data map(always, delete: x[0:10])
198 // CHECK-NEXT: #pragma omp target exit data map(always,delete: x[0:10])
199 
200 #pragma omp target exit data map(from: c) map(release: d)
201 // CHECK-NEXT: #pragma omp target exit data map(from: c) map(release: d)
202 
203 #pragma omp target exit data map(always,release: e)
204 // CHECK-NEXT: #pragma omp target exit data map(always,release: e)
205 
206 #pragma omp target exit data nowait map(from: a)
207 // CHECK:      #pragma omp target exit data nowait map(from: a)
208 
209 #pragma omp target exit data nowait map(from: a) if (target exit data: b)
210 // CHECK: #pragma omp target exit data nowait map(from: a) if(target exit data: b)
211 
212 #pragma omp target exit data map(from: a) if (b > g) nowait
213 // CHECK: #pragma omp target exit data map(from: a) if(b > g) nowait
214 
215 #pragma omp target exit data map(from: c) nowait
216 // CHECK-NEXT: #pragma omp target exit data map(from: c) nowait
217 
218 #pragma omp target exit data map(release: c) nowait if(b>g)
219 // CHECK-NEXT: #pragma omp target exit data map(release: c) nowait if(b > g)
220 
221 #pragma omp target exit data nowait map(from: x[0:10], c)
222 // CHECK-NEXT: #pragma omp target exit data nowait map(from: x[0:10],c)
223 
224 #pragma omp target exit data nowait map(from: c) map(release: d)
225 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) map(release: d)
226 
227 #pragma omp target exit data nowait map(always,release: e)
228 // CHECK-NEXT: #pragma omp target exit data nowait map(always,release: e)
229 
230 #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(from: a)
231 // CHECK:      #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(from: a)
232 
233 #pragma omp target exit data nowait map(from: a) depend(in : argc,argv[i:argc],x[:]) if (target exit data: b)
234 // CHECK: #pragma omp target exit data nowait map(from: a) depend(in : argc,argv[i:argc],x[:]) if(target exit data: b)
235 
236 #pragma omp target exit data map(from: a) if (b > g) nowait depend(in : argc,argv[i:argc],x[:])
237 // CHECK: #pragma omp target exit data map(from: a) if(b > g) nowait depend(in : argc,argv[i:argc],x[:])
238 
239 #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait
240 // CHECK-NEXT: #pragma omp target exit data map(from: c) depend(in : argc,argv[i:argc],x[:]) nowait
241 
242 #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) map(release: c) nowait if(b>g)
243 // CHECK-NEXT: #pragma omp target exit data depend(in : argc,argv[i:argc],x[:]) map(release: c) nowait if(b > g)
244 
245 #pragma omp target exit data nowait map(from: x[0:10], c) depend(in : argc,argv[i:argc],x[:])
246 // CHECK-NEXT: #pragma omp target exit data nowait map(from: x[0:10],c) depend(in : argc,argv[i:argc],x[:])
247 
248 #pragma omp target exit data nowait map(from: c) depend(in : argc,argv[i:argc],x[:]) map(release: d)
249 // CHECK-NEXT: #pragma omp target exit data nowait map(from: c) depend(in : argc,argv[i:argc],x[:]) map(release: d)
250 
251 #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(always,release: e)
252 // CHECK-NEXT: #pragma omp target exit data nowait depend(in : argc,argv[i:argc],x[:]) map(always,release: e)
253 
254   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
255 }
256 
257 #endif
258