xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-clause-ast.cpp (revision 2c2accbcc6b0f132182a35b65ac76c038912cd1e)
1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
2 
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
6 
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
21 
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
29 
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
43 
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
52 
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
61 
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
70 
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
79 
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
88 
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
97 
98 
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
107 
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
116 
117 
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
126 }
127 
128 template<typename T>
129 void TemplFunc() {
130   // CHECK: FunctionTemplateDecl{{.*}}TemplFunc
131   // CHECK-NEXT: TemplateTypeParmDecl
132 
133   // Match the prototype:
134   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
135   // CHECK-NEXT: CompoundStmt
136 
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
144 
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
152 
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
165 
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
175 
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
185 
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
195 
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
204 
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
214 
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
227 
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
240 
241   T t;
242   // CHECK-NEXT: DeclStmt
243   // CHECK-NEXT: VarDecl{{.*}} t 'T'
244 
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
253 
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
263 
264   typename T::IntTy i;
265   // CHECK-NEXT: DeclStmt
266   // CHECK-NEXT: VarDecl{{.*}} i 'typename T::IntTy'
267 
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
276 
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
285 
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
295 
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
304 
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
313 
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
323 
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
332 
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
339 
340   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
341   // CHECK-NEXT: default(none)
342   // CHECK-NEXT: WhileStmt
343   // CHECK-NEXT: CXXBoolLiteralExpr
344   // CHECK-NEXT: NullStmt
345 
346   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
347   // CHECK-NEXT: default(present)
348   // CHECK-NEXT: WhileStmt
349   // CHECK-NEXT: CXXBoolLiteralExpr
350   // CHECK-NEXT: NullStmt
351 
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
364 
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
373 
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
383 
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
394 
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
401 
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
411 
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
426 
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
441 
442   // CHECK-NEXT: DeclStmt
443   // CHECK-NEXT: VarDecl{{.*}} t 'InstTy'
444   // CHECK-NEXT: CXXConstructExpr
445 
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
452 
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
460 
461   // CHECK-NEXT: DeclStmt
462   // CHECK-NEXT: VarDecl{{.*}} i 'typename InstTy::IntTy':'int'
463 
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
470 
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
477 
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
485 
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
492 
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
499 
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
507 
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
514 
515 }
516 
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;
522 };
523 
524 void Instantiate() {
525   TemplFunc<InstTy>();
526 }
527 #endif
528