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 -fsyntax-only -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 -fsyntax-only -verify %s -ast-print | FileCheck %s
8
9 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s
10 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s
11 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s
12
13 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s
14 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s
15 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %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 // nesting a target region
60 #pragma omp target data map(e)
61 {
62 #pragma omp target map(always, alloc: e)
63 foo();
64 #pragma omp target map(close, alloc: e)
65 foo();
66 #ifdef OMP51
67 #pragma omp target map(present, alloc: e)
68 foo();
69 #endif
70 }
71
72 return 0;
73 }
74
75 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
76 // CHECK-NEXT: T i, j, b, c, d, e, x[20];
77 // CHECK-NEXT: #pragma omp target data map(to: c){{$}}
78 // CHECK-NEXT: i = argc;
79 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
80 // CHECK-NEXT: foo();
81 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
82 // CHECK-NEXT: foo();
83 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
84 // CHECK-NEXT: foo();
85 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
86 // CHECK-NEXT: foo();
87 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
88 // CHECK-NEXT: foo();
89 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
90 // CHECK-NEXT: foo();
91 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
92 // CHECK-NEXT: foo();
93 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
94 // CHECK-NEXT: foo();
95 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
96 // OMP51-NEXT: foo();
97 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
98 // CHECK-NEXT: {
99 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
100 // CHECK-NEXT: foo();
101 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
102 // CHECK-NEXT: foo();
103 // OMP51-NEXT: #pragma omp target map(present,alloc: e)
104 // OMP51-NEXT: foo();
105 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
106 // CHECK-NEXT: int i, j, b, c, d, e, x[20];
107 // CHECK-NEXT: #pragma omp target data map(to: c)
108 // CHECK-NEXT: i = argc;
109 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
110 // CHECK-NEXT: foo();
111 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
112 // CHECK-NEXT: foo();
113 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
114 // CHECK-NEXT: foo();
115 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
116 // CHECK-NEXT: foo();
117 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
118 // CHECK-NEXT: foo();
119 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
120 // CHECK-NEXT: foo();
121 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
122 // CHECK-NEXT: foo();
123 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
124 // CHECK-NEXT: foo();
125 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
126 // OMP51-NEXT: foo();
127 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
128 // CHECK-NEXT: {
129 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
130 // CHECK-NEXT: foo();
131 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
132 // CHECK-NEXT: foo();
133 // OMP51-NEXT: #pragma omp target map(present,alloc: e)
134 // OMP51-NEXT: foo();
135 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
136 // CHECK-NEXT: char i, j, b, c, d, e, x[20];
137 // CHECK-NEXT: #pragma omp target data map(to: c)
138 // CHECK-NEXT: i = argc;
139 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
140 // CHECK-NEXT: foo();
141 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
142 // CHECK-NEXT: foo();
143 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
144 // CHECK-NEXT: foo();
145 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
146 // CHECK-NEXT: foo();
147 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
148 // CHECK-NEXT: foo();
149 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
150 // CHECK-NEXT: foo();
151 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
152 // CHECK-NEXT: foo();
153 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
154 // CHECK-NEXT: foo();
155 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
156 // OMP51-NEXT: foo();
157 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
158 // CHECK-NEXT: {
159 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
160 // CHECK-NEXT: foo();
161 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
162 // CHECK-NEXT: foo();
163 // OMP51-NEXT: #pragma omp target map(present,alloc: e)
164 // OMP51-NEXT: foo();
165
main(int argc,char ** argv)166 int main (int argc, char **argv) {
167 int b = argc, c, d, e, f, g, x[20];
168 static int a;
169 // CHECK: static int a;
170
171 #pragma omp target data map(to: ([argc][3][a])argv)
172 // CHECK: #pragma omp target data map(to: ([argc][3][a])argv)
173 #pragma omp target data map(to: c)
174 // CHECK: #pragma omp target data map(to: c)
175 a=2;
176 // CHECK-NEXT: a = 2;
177 #pragma omp target data map(to: c) if (target data: b)
178 // CHECK: #pragma omp target data map(to: c) if(target data: b)
179 foo();
180 // CHECK-NEXT: foo();
181
182 #pragma omp target data map(to: c) if (b > g)
183 // CHECK: #pragma omp target data map(to: c) if(b > g)
184 foo();
185 // CHECK-NEXT: foo();
186
187 #pragma omp target data map(c)
188 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
189 foo();
190 // CHECK-NEXT: foo();
191
192 #pragma omp target data map(c) if(b>g)
193 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g)
194 foo();
195 // CHECK-NEXT: foo();
196
197 #pragma omp target data map(x[0:10], c)
198 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
199 foo();
200 // CHECK-NEXT: foo();
201
202 #pragma omp target data map(to: c) map(from: d)
203 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
204 foo();
205 // CHECK-NEXT: foo();
206
207 #pragma omp target data map(always,alloc: e)
208 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
209 foo();
210 // CHECK-NEXT: foo();
211
212 #pragma omp target data map(close,alloc: e)
213 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
214 foo();
215 // CHECK-NEXT: foo();
216
217 // OMP51-NEXT: #pragma omp target data map(present,alloc: e)
218 // OMP51-NEXT: foo();
219 #ifdef OMP51
220 #pragma omp target data map(present,alloc: e)
221 foo();
222 #endif
223
224 // nesting a target region
225 #pragma omp target data map(e)
226 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
227 {
228 // CHECK-NEXT: {
229 #pragma omp target map(always, alloc: e)
230 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
231 foo();
232 // CHECK-NEXT: foo();
233 #pragma omp target map(close, alloc: e)
234 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
235 foo();
236 // CHECK-NEXT: foo();
237 #pragma omp target map(always, alloc: e)
238 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
239 foo();
240 }
241
242 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
243 }
244
245 #endif
246