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>
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