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 <class T> |
16 | struct S { |
17 | operator T() {return T();} |
18 | static T TS; |
19 | #pragma omp threadprivate(TS) |
20 | }; |
21 | |
22 | // CHECK: template <class T> struct S { |
23 | // CHECK: static T TS; |
24 | // CHECK-NEXT: #pragma omp threadprivate(S::TS) |
25 | // CHECK: }; |
26 | // CHECK: template<> struct S<int> { |
27 | // CHECK: static int TS; |
28 | // CHECK-NEXT: #pragma omp threadprivate(S<int>::TS) |
29 | // CHECK-NEXT: } |
30 | // CHECK: template<> struct S<char> { |
31 | // CHECK: static char TS; |
32 | // CHECK-NEXT: #pragma omp threadprivate(S<char>::TS) |
33 | // CHECK-NEXT: } |
34 | |
35 | template <typename T, int C> |
36 | T tmain(T argc, T *argv) { |
37 | T b = argc, c, d, e, f, g; |
38 | static T h; |
39 | S<T> s; |
40 | T arr[C][10], arr1[C]; |
41 | T i, j, a[20]; |
42 | #pragma omp target parallel |
43 | h=2; |
44 | #pragma omp target parallel allocate(argv) default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10]) |
45 | foo(); |
46 | #pragma omp target parallel if (C) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(&& : g) allocate(g) |
47 | foo(); |
48 | #pragma omp target parallel if (target:argc > 0) |
49 | foo(); |
50 | #pragma omp target parallel if (parallel:argc > 0) |
51 | foo(); |
52 | #pragma omp target parallel if (C) |
53 | foo(); |
54 | #pragma omp target parallel map(i) |
55 | foo(); |
56 | #pragma omp target parallel map(a[0:10], i) |
57 | foo(); |
58 | #pragma omp target parallel map(to: i) map(from: j) |
59 | foo(); |
60 | #pragma omp target parallel map(always,alloc: i) |
61 | foo(); |
62 | #pragma omp target parallel nowait |
63 | foo(); |
64 | #pragma omp target parallel depend(in : argc, argv[i:argc], a[:]) |
65 | foo(); |
66 | #pragma omp target parallel defaultmap(tofrom: scalar) |
67 | foo(); |
68 | return 0; |
69 | } |
70 | |
71 | // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { |
72 | // CHECK-NEXT: T b = argc, c, d, e, f, g; |
73 | // CHECK-NEXT: static T h; |
74 | // CHECK-NEXT: S<T> s; |
75 | // CHECK-NEXT: T arr[C][10], arr1[C]; |
76 | // CHECK-NEXT: T i, j, a[20] |
77 | // CHECK-NEXT: #pragma omp target parallel{{$}} |
78 | // CHECK-NEXT: h = 2; |
79 | // CHECK-NEXT: #pragma omp target parallel allocate(argv) default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10]) |
80 | // CHECK-NEXT: foo() |
81 | // CHECK-NEXT: #pragma omp target parallel if(C) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(&&: g) allocate(g) |
82 | // CHECK-NEXT: foo() |
83 | // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0) |
84 | // CHECK-NEXT: foo() |
85 | // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0) |
86 | // CHECK-NEXT: foo() |
87 | // CHECK-NEXT: #pragma omp target parallel if(C) |
88 | // CHECK-NEXT: foo() |
89 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: i) |
90 | // CHECK-NEXT: foo() |
91 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i) |
92 | // CHECK-NEXT: foo() |
93 | // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j) |
94 | // CHECK-NEXT: foo() |
95 | // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i) |
96 | // CHECK-NEXT: foo() |
97 | // CHECK-NEXT: #pragma omp target parallel nowait |
98 | // CHECK-NEXT: foo() |
99 | // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:]) |
100 | // CHECK-NEXT: foo() |
101 | // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar) |
102 | // CHECK-NEXT: foo() |
103 | // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { |
104 | // CHECK-NEXT: int b = argc, c, d, e, f, g; |
105 | // CHECK-NEXT: static int h; |
106 | // CHECK-NEXT: S<int> s; |
107 | // CHECK-NEXT: int arr[5][10], arr1[5]; |
108 | // CHECK-NEXT: int i, j, a[20] |
109 | // CHECK-NEXT: #pragma omp target parallel |
110 | // CHECK-NEXT: h = 2; |
111 | // CHECK-NEXT: #pragma omp target parallel allocate(argv) default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10]) |
112 | // CHECK-NEXT: foo() |
113 | // CHECK-NEXT: #pragma omp target parallel if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: g) allocate(g) |
114 | // CHECK-NEXT: foo() |
115 | // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0) |
116 | // CHECK-NEXT: foo() |
117 | // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0) |
118 | // CHECK-NEXT: foo() |
119 | // CHECK-NEXT: #pragma omp target parallel if(5) |
120 | // CHECK-NEXT: foo() |
121 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: i) |
122 | // CHECK-NEXT: foo() |
123 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i) |
124 | // CHECK-NEXT: foo() |
125 | // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j) |
126 | // CHECK-NEXT: foo() |
127 | // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i) |
128 | // CHECK-NEXT: foo() |
129 | // CHECK-NEXT: #pragma omp target parallel nowait |
130 | // CHECK-NEXT: foo() |
131 | // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:]) |
132 | // CHECK-NEXT: foo() |
133 | // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar) |
134 | // CHECK-NEXT: foo() |
135 | // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { |
136 | // CHECK-NEXT: char b = argc, c, d, e, f, g; |
137 | // CHECK-NEXT: static char h; |
138 | // CHECK-NEXT: S<char> s; |
139 | // CHECK-NEXT: char arr[1][10], arr1[1]; |
140 | // CHECK-NEXT: char i, j, a[20] |
141 | // CHECK-NEXT: #pragma omp target parallel |
142 | // CHECK-NEXT: h = 2; |
143 | // CHECK-NEXT: #pragma omp target parallel allocate(argv) default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10]) |
144 | // CHECK-NEXT: foo() |
145 | // CHECK-NEXT: #pragma omp target parallel if(1) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(&&: g) allocate(g) |
146 | // CHECK-NEXT: foo() |
147 | // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0) |
148 | // CHECK-NEXT: foo() |
149 | // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0) |
150 | // CHECK-NEXT: foo() |
151 | // CHECK-NEXT: #pragma omp target parallel if(1) |
152 | // CHECK-NEXT: foo() |
153 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: i) |
154 | // CHECK-NEXT: foo() |
155 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i) |
156 | // CHECK-NEXT: foo() |
157 | // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j) |
158 | // CHECK-NEXT: foo() |
159 | // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i) |
160 | // CHECK-NEXT: foo() |
161 | // CHECK-NEXT: #pragma omp target parallel nowait |
162 | // CHECK-NEXT: foo() |
163 | // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:]) |
164 | // CHECK-NEXT: foo() |
165 | // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar) |
166 | // CHECK-NEXT: foo() |
167 | |
168 | // CHECK-LABEL: int main(int argc, char **argv) { |
169 | int main (int argc, char **argv) { |
170 | int i, j, a[20]; |
171 | // CHECK-NEXT: int i, j, a[20] |
172 | #pragma omp target parallel |
173 | // CHECK-NEXT: #pragma omp target parallel |
174 | foo(); |
175 | // CHECK-NEXT: foo(); |
176 | #pragma omp target parallel if (argc > 0) |
177 | // CHECK-NEXT: #pragma omp target parallel if(argc > 0) |
178 | foo(); |
179 | // CHECK-NEXT: foo(); |
180 | |
181 | #pragma omp target parallel if (target: argc > 0) |
182 | // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0) |
183 | foo(); |
184 | // CHECK-NEXT: foo(); |
185 | |
186 | #pragma omp target parallel if (parallel: argc > 0) |
187 | // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0) |
188 | foo(); |
189 | // CHECK-NEXT: foo(); |
190 | |
191 | #pragma omp target parallel map(i) if(argc>0) |
192 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: i) if(argc > 0) |
193 | foo(); |
194 | // CHECK-NEXT: foo(); |
195 | |
196 | #pragma omp target parallel map(i) |
197 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: i) |
198 | foo(); |
199 | // CHECK-NEXT: foo(); |
200 | |
201 | #pragma omp target parallel map(a[0:10], i) |
202 | // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i) |
203 | foo(); |
204 | // CHECK-NEXT: foo(); |
205 | |
206 | #pragma omp target parallel map(to: i) map(from: j) |
207 | // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j) |
208 | foo(); |
209 | // CHECK-NEXT: foo(); |
210 | |
211 | #pragma omp target parallel map(always,alloc: i) |
212 | // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i) |
213 | foo(); |
214 | // CHECK-NEXT: foo(); |
215 | |
216 | #pragma omp target parallel nowait |
217 | // CHECK-NEXT: #pragma omp target parallel nowait |
218 | foo(); |
219 | // CHECK-NEXT: foo(); |
220 | |
221 | #pragma omp target parallel depend(in : argc, argv[i:argc], a[:]) |
222 | // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:]) |
223 | foo(); |
224 | // CHECK-NEXT: foo(); |
225 | |
226 | #pragma omp target parallel defaultmap(tofrom: scalar) |
227 | // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar) |
228 | foo(); |
229 | // CHECK-NEXT: foo(); |
230 | |
231 | return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); |
232 | } |
233 | |
234 | extern template int S<int>::TS; |
235 | extern template char S<char>::TS; |
236 | |
237 | #endif |
238 | |