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