1 | // RUN: %clang_cc1 -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s |
2 | // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s |
3 | // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s |
4 | |
5 | // RUN: %clang_cc1 -verify -fopenmp-simd -I %S/Inputs -ast-print %s | FileCheck %s |
6 | // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s |
7 | // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s |
8 | // expected-no-diagnostics |
9 | |
10 | #ifndef HEADER |
11 | #define HEADER |
12 | |
13 | int out_decl_target = 0; |
14 | // CHECK: #pragma omp declare target{{$}} |
15 | // CHECK: int out_decl_target = 0; |
16 | // CHECK: #pragma omp end declare target{{$}} |
17 | // CHECK: #pragma omp declare target{{$}} |
18 | // CHECK: void lambda() |
19 | // CHECK: #pragma omp end declare target{{$}} |
20 | |
21 | #pragma omp declare target |
22 | void lambda () { |
23 | #ifdef __cpp_lambdas |
24 | (void)[&] { ++out_decl_target; }; |
25 | #else |
26 | #pragma clang __debug captured |
27 | (void)out_decl_target; |
28 | #endif |
29 | }; |
30 | #pragma omp end declare target |
31 | |
32 | #pragma omp declare target |
33 | // CHECK: #pragma omp declare target{{$}} |
34 | void foo() {} |
35 | // CHECK-NEXT: void foo() |
36 | #pragma omp end declare target |
37 | // CHECK: #pragma omp end declare target{{$}} |
38 | |
39 | extern "C" { |
40 | #pragma omp declare target |
41 | // CHECK: #pragma omp declare target |
42 | void foo_c() {} |
43 | // CHECK-NEXT: void foo_c() |
44 | #pragma omp end declare target |
45 | // CHECK: #pragma omp end declare target |
46 | } |
47 | |
48 | extern "C++" { |
49 | #pragma omp declare target |
50 | // CHECK: #pragma omp declare target |
51 | void foo_cpp() {} |
52 | // CHECK-NEXT: void foo_cpp() |
53 | #pragma omp end declare target |
54 | // CHECK: #pragma omp end declare target |
55 | } |
56 | |
57 | #pragma omp declare target |
58 | template <class T> |
59 | struct C { |
60 | // CHECK: template <class T> struct C { |
61 | // CHECK: #pragma omp declare target |
62 | // CHECK-NEXT: static T ts; |
63 | // CHECK-NEXT: #pragma omp end declare target |
64 | |
65 | // CHECK: template<> struct C<int> |
66 | T t; |
67 | // CHECK-NEXT: int t; |
68 | static T ts; |
69 | // CHECK-NEXT: #pragma omp declare target |
70 | // CHECK-NEXT: static int ts; |
71 | // CHECK: #pragma omp end declare target |
72 | |
73 | C(T t) : t(t) { |
74 | } |
75 | // CHECK: #pragma omp declare target |
76 | // CHECK-NEXT: C(int t) : t(t) { |
77 | // CHECK-NEXT: } |
78 | // CHECK: #pragma omp end declare target |
79 | |
80 | T foo() { |
81 | return t; |
82 | } |
83 | // CHECK: #pragma omp declare target |
84 | // CHECK-NEXT: int foo() { |
85 | // CHECK-NEXT: return this->t; |
86 | // CHECK-NEXT: } |
87 | // CHECK: #pragma omp end declare target |
88 | }; |
89 | |
90 | template<class T> |
91 | T C<T>::ts = 1; |
92 | // CHECK: #pragma omp declare target |
93 | // CHECK: T ts = 1; |
94 | // CHECK: #pragma omp end declare target |
95 | |
96 | // CHECK: #pragma omp declare target |
97 | // CHECK: int test1() |
98 | int test1() { |
99 | C<int> c(1); |
100 | return c.foo() + c.ts; |
101 | } |
102 | #pragma omp end declare target |
103 | // CHECK: #pragma omp end declare target |
104 | |
105 | int a1; |
106 | void f1() { |
107 | } |
108 | #pragma omp declare target (a1, f1) |
109 | // CHECK: #pragma omp declare target{{$}} |
110 | // CHECK: int a1; |
111 | // CHECK: #pragma omp end declare target{{$}} |
112 | // CHECK: #pragma omp declare target{{$}} |
113 | // CHECK: void f1() |
114 | // CHECK: #pragma omp end declare target{{$}} |
115 | |
116 | int b1, b2, b3; |
117 | void f2() { |
118 | } |
119 | #pragma omp declare target to(b1) to(b2), to(b3, f2) |
120 | // CHECK: #pragma omp declare target{{$}} |
121 | // CHECK: int b1; |
122 | // CHECK: #pragma omp end declare target{{$}} |
123 | // CHECK: #pragma omp declare target{{$}} |
124 | // CHECK: int b2; |
125 | // CHECK: #pragma omp end declare target{{$}} |
126 | // CHECK: #pragma omp declare target{{$}} |
127 | // CHECK: int b3; |
128 | // CHECK: #pragma omp end declare target{{$}} |
129 | // CHECK: #pragma omp declare target{{$}} |
130 | // CHECK: void f2() |
131 | // CHECK: #pragma omp end declare target{{$}} |
132 | |
133 | int c1, c2, c3; |
134 | #pragma omp declare target link(c1) link(c2), link(c3) |
135 | // CHECK: #pragma omp declare target link{{$}} |
136 | // CHECK: int c1; |
137 | // CHECK: #pragma omp end declare target{{$}} |
138 | // CHECK: #pragma omp declare target link{{$}} |
139 | // CHECK: int c2; |
140 | // CHECK: #pragma omp end declare target{{$}} |
141 | // CHECK: #pragma omp declare target link{{$}} |
142 | // CHECK: int c3; |
143 | // CHECK: #pragma omp end declare target{{$}} |
144 | |
145 | struct SSSt { |
146 | #pragma omp declare target |
147 | static int a; |
148 | int b; |
149 | #pragma omp end declare target |
150 | }; |
151 | |
152 | // CHECK: struct SSSt { |
153 | // CHECK: #pragma omp declare target |
154 | // CHECK: static int a; |
155 | // CHECK: #pragma omp end declare target |
156 | // CHECK: int b; |
157 | |
158 | template <class T> |
159 | struct SSSTt { |
160 | #pragma omp declare target |
161 | static T a; |
162 | int b; |
163 | #pragma omp end declare target |
164 | }; |
165 | |
166 | // CHECK: template <class T> struct SSSTt { |
167 | // CHECK: #pragma omp declare target |
168 | // CHECK: static T a; |
169 | // CHECK: #pragma omp end declare target |
170 | // CHECK: int b; |
171 | |
172 | #pragma omp declare target |
173 | template <typename T> |
174 | T baz() { return T(); } |
175 | #pragma omp end declare target |
176 | |
177 | template <> |
178 | int baz() { return 1; } |
179 | |
180 | // CHECK: #pragma omp declare target |
181 | // CHECK: template <typename T> T baz() { |
182 | // CHECK: return T(); |
183 | // CHECK: } |
184 | // CHECK: #pragma omp end declare target |
185 | // CHECK: #pragma omp declare target |
186 | // CHECK: template<> float baz<float>() { |
187 | // CHECK: return float(); |
188 | // CHECK: } |
189 | // CHECK: template<> int baz<int>() { |
190 | // CHECK: return 1; |
191 | // CHECK: } |
192 | // CHECK: #pragma omp end declare target |
193 | |
194 | #pragma omp declare target |
195 | #include "declare_target_include.h" |
196 | void xyz(); |
197 | #pragma omp end declare target |
198 | |
199 | // CHECK: #pragma omp declare target |
200 | // CHECK: void zyx(); |
201 | // CHECK: #pragma omp end declare target |
202 | // CHECK: #pragma omp declare target |
203 | // CHECK: void xyz(); |
204 | // CHECK: #pragma omp end declare target |
205 | |
206 | #pragma omp declare target |
207 | #pragma omp declare target |
208 | void abc(); |
209 | #pragma omp end declare target |
210 | void cba(); |
211 | #pragma omp end declare target |
212 | |
213 | // CHECK: #pragma omp declare target |
214 | // CHECK: void abc(); |
215 | // CHECK: #pragma omp end declare target |
216 | // CHECK: #pragma omp declare target |
217 | // CHECK: void cba(); |
218 | // CHECK: #pragma omp end declare target |
219 | |
220 | int main (int argc, char **argv) { |
221 | foo(); |
222 | foo_c(); |
223 | foo_cpp(); |
224 | test1(); |
225 | baz<float>(); |
226 | baz<int>(); |
227 | return (0); |
228 | } |
229 | |
230 | // CHECK: #pragma omp declare target |
231 | // CHECK-NEXT: int ts = 1; |
232 | // CHECK-NEXT: #pragma omp end declare target |
233 | #endif |
234 | |