[flang][OpenMP] 'no_openmp_constructs' added to clang broke flang build (#126145)
[llvm-project.git] / clang / test / SemaOpenACC / compute-construct-clause-ast.cpp
blob58c12b828439dfe3dcbb868fd5fd557e14aa25a9
1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
3 // Test this with PCH.
4 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
5 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
7 #ifndef PCH_HELPER
8 #define PCH_HELPER
9 void NormalFunc(int i, float f) {
10 // CHECK: FunctionDecl{{.*}}NormalFunc
11 // CHECK-NEXT: ParmVarDecl
12 // CHECK-NEXT: ParmVarDecl
13 // CHECK-NEXT: CompoundStmt
14 #pragma acc parallel default(none)
15 while(true);
16 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
17 // CHECK-NEXT: default(none)
18 // CHECK-NEXT: WhileStmt
19 // CHECK-NEXT: CXXBoolLiteralExpr
20 // CHECK-NEXT: NullStmt
22 #pragma acc serial default(present)
23 while(true);
24 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
25 // CHECK-NEXT: default(present)
26 // CHECK-NEXT: WhileStmt
27 // CHECK-NEXT: CXXBoolLiteralExpr
28 // CHECK-NEXT: NullStmt
30 #pragma acc kernels if( i < f)
31 while(true);
32 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
33 // CHECK-NEXT: if clause
34 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
35 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
36 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
37 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
38 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
39 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
40 // CHECK-NEXT: WhileStmt
41 // CHECK-NEXT: CXXBoolLiteralExpr
42 // CHECK-NEXT: NullStmt
44 #pragma acc parallel reduction(+: i)
45 while(true);
46 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
47 // CHECK-NEXT: reduction clause Operator: +
48 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
49 // CHECK-NEXT: WhileStmt
50 // CHECK-NEXT: CXXBoolLiteralExpr
51 // CHECK-NEXT: NullStmt
53 #pragma acc serial reduction(*: f)
54 while(true);
55 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
56 // CHECK-NEXT: reduction clause Operator: *
57 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
58 // CHECK-NEXT: WhileStmt
59 // CHECK-NEXT: CXXBoolLiteralExpr
60 // CHECK-NEXT: NullStmt
62 #pragma acc parallel reduction(max: i)
63 while(true);
64 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
65 // CHECK-NEXT: reduction clause Operator: max
66 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
67 // CHECK-NEXT: WhileStmt
68 // CHECK-NEXT: CXXBoolLiteralExpr
69 // CHECK-NEXT: NullStmt
71 #pragma acc serial reduction(min: f)
72 while(true);
73 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
74 // CHECK-NEXT: reduction clause Operator: min
75 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
76 // CHECK-NEXT: WhileStmt
77 // CHECK-NEXT: CXXBoolLiteralExpr
78 // CHECK-NEXT: NullStmt
80 #pragma acc parallel reduction(&: i)
81 while(true);
82 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
83 // CHECK-NEXT: reduction clause Operator: &
84 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
85 // CHECK-NEXT: WhileStmt
86 // CHECK-NEXT: CXXBoolLiteralExpr
87 // CHECK-NEXT: NullStmt
89 #pragma acc serial reduction(|: f)
90 while(true);
91 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
92 // CHECK-NEXT: reduction clause Operator: |
93 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
94 // CHECK-NEXT: WhileStmt
95 // CHECK-NEXT: CXXBoolLiteralExpr
96 // CHECK-NEXT: NullStmt
99 #pragma acc parallel reduction(^: i)
100 while(true);
101 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
102 // CHECK-NEXT: reduction clause Operator: ^
103 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
104 // CHECK-NEXT: WhileStmt
105 // CHECK-NEXT: CXXBoolLiteralExpr
106 // CHECK-NEXT: NullStmt
108 #pragma acc serial reduction(&&: f)
109 while(true);
110 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
111 // CHECK-NEXT: reduction clause Operator: &&
112 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
113 // CHECK-NEXT: WhileStmt
114 // CHECK-NEXT: CXXBoolLiteralExpr
115 // CHECK-NEXT: NullStmt
118 #pragma acc parallel reduction(||: i)
119 while(true);
120 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
121 // CHECK-NEXT: reduction clause Operator: ||
122 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
123 // CHECK-NEXT: WhileStmt
124 // CHECK-NEXT: CXXBoolLiteralExpr
125 // CHECK-NEXT: NullStmt
128 template<typename T>
129 void TemplFunc() {
130 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc
131 // CHECK-NEXT: TemplateTypeParmDecl
133 // Match the prototype:
134 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
135 // CHECK-NEXT: CompoundStmt
137 #pragma acc kernels default(none)
138 while(true);
139 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
140 // CHECK-NEXT: default(none)
141 // CHECK-NEXT: WhileStmt
142 // CHECK-NEXT: CXXBoolLiteralExpr
143 // CHECK-NEXT: NullStmt
145 #pragma acc parallel default(present)
146 while(true);
147 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
148 // CHECK-NEXT: default(present)
149 // CHECK-NEXT: WhileStmt
150 // CHECK-NEXT: CXXBoolLiteralExpr
151 // CHECK-NEXT: NullStmt
153 #pragma acc parallel if(T::SomeFloat < typename T::IntTy{})
154 while(true);
155 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
156 // CHECK-NEXT: if clause
157 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
158 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
159 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
160 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
161 // CHECK-NEXT: InitListExpr{{.*}} 'void'
162 // CHECK-NEXT: WhileStmt
163 // CHECK-NEXT: CXXBoolLiteralExpr
164 // CHECK-NEXT: NullStmt
166 #pragma acc serial if(typename T::IntTy{})
167 while(true);
168 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
169 // CHECK-NEXT: if clause
170 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
171 // CHECK-NEXT: InitListExpr{{.*}} 'void'
172 // CHECK-NEXT: WhileStmt
173 // CHECK-NEXT: CXXBoolLiteralExpr
174 // CHECK-NEXT: NullStmt
176 #pragma acc kernels if(T::SomeFloat)
177 while(true);
178 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
179 // CHECK-NEXT: if clause
180 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
181 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
182 // CHECK-NEXT: WhileStmt
183 // CHECK-NEXT: CXXBoolLiteralExpr
184 // CHECK-NEXT: NullStmt
186 #pragma acc parallel if(T::BC)
187 while(true);
188 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
189 // CHECK-NEXT: if clause
190 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
191 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
192 // CHECK-NEXT: WhileStmt
193 // CHECK-NEXT: CXXBoolLiteralExpr
194 // CHECK-NEXT: NullStmt
196 #pragma acc serial self
197 while(true);
198 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
199 // CHECK-NEXT: self clause
200 // CHECK-NEXT: <<<NULL>>
201 // CHECK-NEXT: WhileStmt
202 // CHECK-NEXT: CXXBoolLiteralExpr
203 // CHECK-NEXT: NullStmt
205 #pragma acc kernels self(T::SomeFloat)
206 while(true);
207 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
208 // CHECK-NEXT: self clause
209 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
210 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
211 // CHECK-NEXT: WhileStmt
212 // CHECK-NEXT: CXXBoolLiteralExpr
213 // CHECK-NEXT: NullStmt
215 #pragma acc parallel self(T::SomeFloat) if (T::SomeFloat)
216 while(true);
217 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
218 // CHECK-NEXT: self clause
219 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
220 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
221 // CHECK-NEXT: if clause
222 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
223 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
224 // CHECK-NEXT: WhileStmt
225 // CHECK-NEXT: CXXBoolLiteralExpr
226 // CHECK-NEXT: NullStmt
228 #pragma acc serial if(T::SomeFloat) self(T::SomeFloat)
229 while(true);
230 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
231 // CHECK-NEXT: if clause
232 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
233 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
234 // CHECK-NEXT: self clause
235 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
236 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
237 // CHECK-NEXT: WhileStmt
238 // CHECK-NEXT: CXXBoolLiteralExpr
239 // CHECK-NEXT: NullStmt
241 T t;
242 // CHECK-NEXT: DeclStmt
243 // CHECK-NEXT: VarDecl{{.*}} t 'T'
245 #pragma acc parallel reduction(+: t)
246 while(true);
247 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
248 // CHECK-NEXT: reduction clause Operator: +
249 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T'
250 // CHECK-NEXT: WhileStmt
251 // CHECK-NEXT: CXXBoolLiteralExpr
252 // CHECK-NEXT: NullStmt
254 #pragma acc serial reduction(*: T::SomeFloat)
255 while(true);
256 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
257 // CHECK-NEXT: reduction clause Operator: *
258 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
259 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
260 // CHECK-NEXT: WhileStmt
261 // CHECK-NEXT: CXXBoolLiteralExpr
262 // CHECK-NEXT: NullStmt
264 typename T::IntTy i;
265 // CHECK-NEXT: DeclStmt
266 // CHECK-NEXT: VarDecl{{.*}} i 'typename T::IntTy'
268 #pragma acc parallel reduction(max: i)
269 while(true);
270 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
271 // CHECK-NEXT: reduction clause Operator: max
272 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy'
273 // CHECK-NEXT: WhileStmt
274 // CHECK-NEXT: CXXBoolLiteralExpr
275 // CHECK-NEXT: NullStmt
277 #pragma acc serial reduction(min: t)
278 while(true);
279 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
280 // CHECK-NEXT: reduction clause Operator: min
281 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T'
282 // CHECK-NEXT: WhileStmt
283 // CHECK-NEXT: CXXBoolLiteralExpr
284 // CHECK-NEXT: NullStmt
286 #pragma acc parallel reduction(&: T::SomeFloat)
287 while(true);
288 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
289 // CHECK-NEXT: reduction clause Operator: &
290 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
291 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
292 // CHECK-NEXT: WhileStmt
293 // CHECK-NEXT: CXXBoolLiteralExpr
294 // CHECK-NEXT: NullStmt
296 #pragma acc serial reduction(|: i)
297 while(true);
298 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
299 // CHECK-NEXT: reduction clause Operator: |
300 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy'
301 // CHECK-NEXT: WhileStmt
302 // CHECK-NEXT: CXXBoolLiteralExpr
303 // CHECK-NEXT: NullStmt
305 #pragma acc parallel reduction(^: t)
306 while(true);
307 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
308 // CHECK-NEXT: reduction clause Operator: ^
309 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T'
310 // CHECK-NEXT: WhileStmt
311 // CHECK-NEXT: CXXBoolLiteralExpr
312 // CHECK-NEXT: NullStmt
314 #pragma acc serial reduction(&&: T::SomeFloat)
315 while(true);
316 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
317 // CHECK-NEXT: reduction clause Operator: &&
318 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
319 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
320 // CHECK-NEXT: WhileStmt
321 // CHECK-NEXT: CXXBoolLiteralExpr
322 // CHECK-NEXT: NullStmt
324 #pragma acc parallel reduction(||: i)
325 while(true);
326 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
327 // CHECK-NEXT: reduction clause Operator: ||
328 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy'
329 // CHECK-NEXT: WhileStmt
330 // CHECK-NEXT: CXXBoolLiteralExpr
331 // CHECK-NEXT: NullStmt
333 // Match the instantiation:
334 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation
335 // CHECK-NEXT: TemplateArgument type 'InstTy'
336 // CHECK-NEXT: RecordType{{.*}} 'InstTy'
337 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'
338 // CHECK-NEXT: CompoundStmt
340 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
341 // CHECK-NEXT: default(none)
342 // CHECK-NEXT: WhileStmt
343 // CHECK-NEXT: CXXBoolLiteralExpr
344 // CHECK-NEXT: NullStmt
346 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
347 // CHECK-NEXT: default(present)
348 // CHECK-NEXT: WhileStmt
349 // CHECK-NEXT: CXXBoolLiteralExpr
350 // CHECK-NEXT: NullStmt
352 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
353 // CHECK-NEXT: if clause
354 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
355 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
356 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
357 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
358 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
359 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
360 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
361 // CHECK-NEXT: WhileStmt
362 // CHECK-NEXT: CXXBoolLiteralExpr
363 // CHECK-NEXT: NullStmt
365 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
366 // CHECK-NEXT: if clause
367 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>
368 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
369 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
370 // CHECK-NEXT: WhileStmt
371 // CHECK-NEXT: CXXBoolLiteralExpr
372 // CHECK-NEXT: NullStmt
374 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
375 // CHECK-NEXT: if clause
376 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
377 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
378 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
379 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
380 // CHECK-NEXT: WhileStmt
381 // CHECK-NEXT: CXXBoolLiteralExpr
382 // CHECK-NEXT: NullStmt
384 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
385 // CHECK-NEXT: if clause
386 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion>
387 // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool'
388 // CHECK-NEXT: MemberExpr{{.*}} .operator bool
389 // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion'
390 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
391 // CHECK-NEXT: WhileStmt
392 // CHECK-NEXT: CXXBoolLiteralExpr
393 // CHECK-NEXT: NullStmt
395 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
396 // CHECK-NEXT: self clause
397 // CHECK-NEXT: <<<NULL>>
398 // CHECK-NEXT: WhileStmt
399 // CHECK-NEXT: CXXBoolLiteralExpr
400 // CHECK-NEXT: NullStmt
402 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
403 // CHECK-NEXT: self clause
404 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
405 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
406 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
407 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
408 // CHECK-NEXT: WhileStmt
409 // CHECK-NEXT: CXXBoolLiteralExpr
410 // CHECK-NEXT: NullStmt
412 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
413 // CHECK-NEXT: self clause
414 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
415 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
416 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
417 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
418 // CHECK-NEXT: if clause
419 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
420 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
421 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
422 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
423 // CHECK-NEXT: WhileStmt
424 // CHECK-NEXT: CXXBoolLiteralExpr
425 // CHECK-NEXT: NullStmt
427 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
428 // CHECK-NEXT: if clause
429 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
430 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
431 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
432 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
433 // CHECK-NEXT: self clause
434 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
435 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
436 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
437 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
438 // CHECK-NEXT: WhileStmt
439 // CHECK-NEXT: CXXBoolLiteralExpr
440 // CHECK-NEXT: NullStmt
442 // CHECK-NEXT: DeclStmt
443 // CHECK-NEXT: VarDecl{{.*}} t 'InstTy'
444 // CHECK-NEXT: CXXConstructExpr
446 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
447 // CHECK-NEXT: reduction clause Operator: +
448 // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy'
449 // CHECK-NEXT: WhileStmt
450 // CHECK-NEXT: CXXBoolLiteralExpr
451 // CHECK-NEXT: NullStmt
453 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
454 // CHECK-NEXT: reduction clause Operator: *
455 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
456 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
457 // CHECK-NEXT: WhileStmt
458 // CHECK-NEXT: CXXBoolLiteralExpr
459 // CHECK-NEXT: NullStmt
461 // CHECK-NEXT: DeclStmt
462 // CHECK-NEXT: VarDecl{{.*}} i 'typename InstTy::IntTy':'int'
464 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
465 // CHECK-NEXT: reduction clause Operator: max
466 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int'
467 // CHECK-NEXT: WhileStmt
468 // CHECK-NEXT: CXXBoolLiteralExpr
469 // CHECK-NEXT: NullStmt
471 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
472 // CHECK-NEXT: reduction clause Operator: min
473 // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy'
474 // CHECK-NEXT: WhileStmt
475 // CHECK-NEXT: CXXBoolLiteralExpr
476 // CHECK-NEXT: NullStmt
478 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
479 // CHECK-NEXT: reduction clause Operator: &
480 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
481 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
482 // CHECK-NEXT: WhileStmt
483 // CHECK-NEXT: CXXBoolLiteralExpr
484 // CHECK-NEXT: NullStmt
486 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
487 // CHECK-NEXT: reduction clause Operator: |
488 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int'
489 // CHECK-NEXT: WhileStmt
490 // CHECK-NEXT: CXXBoolLiteralExpr
491 // CHECK-NEXT: NullStmt
493 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
494 // CHECK-NEXT: reduction clause Operator: ^
495 // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy'
496 // CHECK-NEXT: WhileStmt
497 // CHECK-NEXT: CXXBoolLiteralExpr
498 // CHECK-NEXT: NullStmt
500 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
501 // CHECK-NEXT: reduction clause Operator: &&
502 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
503 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
504 // CHECK-NEXT: WhileStmt
505 // CHECK-NEXT: CXXBoolLiteralExpr
506 // CHECK-NEXT: NullStmt
508 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
509 // CHECK-NEXT: reduction clause Operator: ||
510 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int'
511 // CHECK-NEXT: WhileStmt
512 // CHECK-NEXT: CXXBoolLiteralExpr
513 // CHECK-NEXT: NullStmt
517 struct BoolConversion{ operator bool() const;};
518 struct InstTy {
519 using IntTy = int;
520 static constexpr float SomeFloat = 5.0;
521 static constexpr BoolConversion BC;
524 void Instantiate() {
525 TemplFunc<InstTy>();
527 #endif