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 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: c)
143 // CHECK:      #pragma omp target data map(to: c)
144   a=2;
145 // CHECK-NEXT: a = 2;
146 #pragma omp target data map(to: c) if (target data: b)
147 // CHECK: #pragma omp target data map(to: c) if(target data: b)
148   foo();
149 // CHECK-NEXT: foo();
150 
151 #pragma omp target data map(to: c) if (b > g)
152 // CHECK: #pragma omp target data map(to: c) if(b > g)
153   foo();
154 // CHECK-NEXT: foo();
155 
156 #pragma omp target data map(c)
157 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
158   foo();
159 // CHECK-NEXT: foo();
160 
161 #pragma omp target data map(c) if(b>g)
162 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g)
163   foo();
164 // CHECK-NEXT: foo();
165 
166 #pragma omp target data map(x[0:10], c)
167 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
168   foo();
169 // CHECK-NEXT: foo();
170 
171 #pragma omp target data map(to: c) map(from: d)
172 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
173   foo();
174 // CHECK-NEXT: foo();
175 
176 #pragma omp target data map(always,alloc: e)
177 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
178   foo();
179 // CHECK-NEXT: foo();
180 
181 #pragma omp target data map(close,alloc: e)
182 // CHECK-NEXT: #pragma omp target data map(close,alloc: e)
183   foo();
184 // CHECK-NEXT: foo();
185 
186 // nesting a target region
187 #pragma omp target data map(e)
188 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
189 {
190 // CHECK-NEXT: {
191   #pragma omp target map(always, alloc: e)
192 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
193     foo();
194 // CHECK-NEXT: foo();
195 #pragma omp target map(close, alloc: e)
196 // CHECK-NEXT: #pragma omp target map(close,alloc: e)
197   foo();
198 }
199 
200   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
201 }
202 
203 #endif
204