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