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