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