xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-clause-ast.cpp (revision 2c2accbcc6b0f132182a35b65ac76c038912cd1e)
10c7b92a4SErich Keane // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
20c7b92a4SErich Keane 
30c7b92a4SErich Keane // Test this with PCH.
40c7b92a4SErich Keane // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
50c7b92a4SErich Keane // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
60c7b92a4SErich Keane 
70c7b92a4SErich Keane #ifndef PCH_HELPER
80c7b92a4SErich Keane #define PCH_HELPER
9daa88364SErich Keane void NormalFunc(int i, float f) {
100c7b92a4SErich Keane   // CHECK: FunctionDecl{{.*}}NormalFunc
11daa88364SErich Keane   // CHECK-NEXT: ParmVarDecl
12daa88364SErich Keane   // CHECK-NEXT: ParmVarDecl
130c7b92a4SErich Keane   // CHECK-NEXT: CompoundStmt
140c7b92a4SErich Keane #pragma acc parallel default(none)
150c7b92a4SErich Keane   while(true);
160c7b92a4SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
170c7b92a4SErich Keane   // CHECK-NEXT: default(none)
180c7b92a4SErich Keane   // CHECK-NEXT: WhileStmt
190c7b92a4SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
200c7b92a4SErich Keane   // CHECK-NEXT: NullStmt
210c7b92a4SErich Keane 
220c7b92a4SErich Keane #pragma acc serial default(present)
230c7b92a4SErich Keane   while(true);
240c7b92a4SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
250c7b92a4SErich Keane   // CHECK-NEXT: default(present)
260c7b92a4SErich Keane   // CHECK-NEXT: WhileStmt
270c7b92a4SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
280c7b92a4SErich Keane   // CHECK-NEXT: NullStmt
29daa88364SErich Keane 
30daa88364SErich Keane #pragma acc kernels if( i < f)
31daa88364SErich Keane   while(true);
32daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
33daa88364SErich Keane   // CHECK-NEXT: if clause
34daa88364SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
35daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
36daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
37daa88364SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
38daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
39daa88364SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
40daa88364SErich Keane   // CHECK-NEXT: WhileStmt
41daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
42daa88364SErich Keane   // CHECK-NEXT: NullStmt
43a15b685cSErich Keane 
44a15b685cSErich Keane #pragma acc parallel reduction(+: i)
45a15b685cSErich Keane   while(true);
46a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
47a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: +
48a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
49a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
50a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
51a15b685cSErich Keane   // CHECK-NEXT: NullStmt
52a15b685cSErich Keane 
53a15b685cSErich Keane #pragma acc serial reduction(*: f)
54a15b685cSErich Keane   while(true);
55a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
56a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: *
57a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
58a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
59a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
60a15b685cSErich Keane   // CHECK-NEXT: NullStmt
61a15b685cSErich Keane 
62a15b685cSErich Keane #pragma acc parallel reduction(max: i)
63a15b685cSErich Keane   while(true);
64a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
65a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: max
66a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
67a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
68a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
69a15b685cSErich Keane   // CHECK-NEXT: NullStmt
70a15b685cSErich Keane 
71a15b685cSErich Keane #pragma acc serial reduction(min: f)
72a15b685cSErich Keane   while(true);
73a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
74a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: min
75a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
76a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
77a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
78a15b685cSErich Keane   // CHECK-NEXT: NullStmt
79a15b685cSErich Keane 
80a15b685cSErich Keane #pragma acc parallel reduction(&: i)
81a15b685cSErich Keane   while(true);
82a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
83a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: &
84a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
85a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
86a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
87a15b685cSErich Keane   // CHECK-NEXT: NullStmt
88a15b685cSErich Keane 
89a15b685cSErich Keane #pragma acc serial reduction(|: f)
90a15b685cSErich Keane   while(true);
91a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
92a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: |
93a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
94a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
95a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
96a15b685cSErich Keane   // CHECK-NEXT: NullStmt
97a15b685cSErich Keane 
98a15b685cSErich Keane 
99a15b685cSErich Keane #pragma acc parallel reduction(^: i)
100a15b685cSErich Keane   while(true);
101a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
102a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: ^
103a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
104a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
105a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
106a15b685cSErich Keane   // CHECK-NEXT: NullStmt
107a15b685cSErich Keane 
108a15b685cSErich Keane #pragma acc serial reduction(&&: f)
109a15b685cSErich Keane   while(true);
110a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
111a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: &&
112a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
113a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
114a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
115a15b685cSErich Keane   // CHECK-NEXT: NullStmt
116a15b685cSErich Keane 
117a15b685cSErich Keane 
118a15b685cSErich Keane #pragma acc parallel reduction(||: i)
119a15b685cSErich Keane   while(true);
120a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
121a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: ||
122a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
123a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
124a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
125a15b685cSErich Keane   // CHECK-NEXT: NullStmt
1260c7b92a4SErich Keane }
1270c7b92a4SErich Keane 
1280c7b92a4SErich Keane template<typename T>
1290c7b92a4SErich Keane void TemplFunc() {
1300c7b92a4SErich Keane   // CHECK: FunctionTemplateDecl{{.*}}TemplFunc
1310c7b92a4SErich Keane   // CHECK-NEXT: TemplateTypeParmDecl
1320c7b92a4SErich Keane 
1330c7b92a4SErich Keane   // Match the prototype:
1340c7b92a4SErich Keane   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
1350c7b92a4SErich Keane   // CHECK-NEXT: CompoundStmt
1360c7b92a4SErich Keane 
1370c7b92a4SErich Keane #pragma acc kernels default(none)
1380c7b92a4SErich Keane   while(true);
1390c7b92a4SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
1400c7b92a4SErich Keane   // CHECK-NEXT: default(none)
1410c7b92a4SErich Keane   // CHECK-NEXT: WhileStmt
1420c7b92a4SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
1430c7b92a4SErich Keane   // CHECK-NEXT: NullStmt
1440c7b92a4SErich Keane 
1450c7b92a4SErich Keane #pragma acc parallel default(present)
1460c7b92a4SErich Keane   while(true);
1470c7b92a4SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
1480c7b92a4SErich Keane   // CHECK-NEXT: default(present)
1490c7b92a4SErich Keane   // CHECK-NEXT: WhileStmt
1500c7b92a4SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
1510c7b92a4SErich Keane   // CHECK-NEXT: NullStmt
1520c7b92a4SErich Keane 
153daa88364SErich Keane #pragma acc parallel if(T::SomeFloat < typename T::IntTy{})
154daa88364SErich Keane   while(true);
155daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
156daa88364SErich Keane   // CHECK-NEXT: if clause
157daa88364SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
158daa88364SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
159daa88364SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
160daa88364SErich Keane   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
161daa88364SErich Keane   // CHECK-NEXT: InitListExpr{{.*}} 'void'
162daa88364SErich Keane   // CHECK-NEXT: WhileStmt
163daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
164daa88364SErich Keane   // CHECK-NEXT: NullStmt
165daa88364SErich Keane 
166daa88364SErich Keane #pragma acc serial if(typename T::IntTy{})
167daa88364SErich Keane   while(true);
168daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
169daa88364SErich Keane   // CHECK-NEXT: if clause
170daa88364SErich Keane   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
171daa88364SErich Keane   // CHECK-NEXT: InitListExpr{{.*}} 'void'
172daa88364SErich Keane   // CHECK-NEXT: WhileStmt
173daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
174daa88364SErich Keane   // CHECK-NEXT: NullStmt
175daa88364SErich Keane 
176daa88364SErich Keane #pragma acc kernels if(T::SomeFloat)
177daa88364SErich Keane   while(true);
178daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
179daa88364SErich Keane   // CHECK-NEXT: if clause
180daa88364SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
181daa88364SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
182daa88364SErich Keane   // CHECK-NEXT: WhileStmt
183daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
184daa88364SErich Keane   // CHECK-NEXT: NullStmt
185daa88364SErich Keane 
186daa88364SErich Keane #pragma acc parallel if(T::BC)
187daa88364SErich Keane   while(true);
188daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
189daa88364SErich Keane   // CHECK-NEXT: if clause
190daa88364SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
191daa88364SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
192daa88364SErich Keane   // CHECK-NEXT: WhileStmt
193daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
194daa88364SErich Keane   // CHECK-NEXT: NullStmt
195daa88364SErich Keane 
19661338782SErich Keane #pragma acc serial self
19761338782SErich Keane   while(true);
19861338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
19961338782SErich Keane   // CHECK-NEXT: self clause
200*2c2accbcSerichkeane   // CHECK-NEXT: <<<NULL>>
20161338782SErich Keane   // CHECK-NEXT: WhileStmt
20261338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
20361338782SErich Keane   // CHECK-NEXT: NullStmt
20461338782SErich Keane 
20561338782SErich Keane #pragma acc kernels self(T::SomeFloat)
20661338782SErich Keane   while(true);
20761338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
20861338782SErich Keane   // CHECK-NEXT: self clause
20961338782SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
21061338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
21161338782SErich Keane   // CHECK-NEXT: WhileStmt
21261338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
21361338782SErich Keane   // CHECK-NEXT: NullStmt
21461338782SErich Keane 
21561338782SErich Keane #pragma acc parallel self(T::SomeFloat) if (T::SomeFloat)
21661338782SErich Keane   while(true);
21761338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
21861338782SErich Keane   // CHECK-NEXT: self clause
21961338782SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
22061338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
22161338782SErich Keane   // CHECK-NEXT: if clause
22261338782SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
22361338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
22461338782SErich Keane   // CHECK-NEXT: WhileStmt
22561338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
22661338782SErich Keane   // CHECK-NEXT: NullStmt
22761338782SErich Keane 
22861338782SErich Keane #pragma acc serial if(T::SomeFloat) self(T::SomeFloat)
22961338782SErich Keane   while(true);
23061338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
23161338782SErich Keane   // CHECK-NEXT: if clause
23261338782SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
23361338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
23461338782SErich Keane   // CHECK-NEXT: self clause
23561338782SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
23661338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
23761338782SErich Keane   // CHECK-NEXT: WhileStmt
23861338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
23961338782SErich Keane   // CHECK-NEXT: NullStmt
24061338782SErich Keane 
241a15b685cSErich Keane   T t;
242a15b685cSErich Keane   // CHECK-NEXT: DeclStmt
243a15b685cSErich Keane   // CHECK-NEXT: VarDecl{{.*}} t 'T'
244a15b685cSErich Keane 
245a15b685cSErich Keane #pragma acc parallel reduction(+: t)
246a15b685cSErich Keane   while(true);
247a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
248a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: +
249a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T'
250a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
251a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
252a15b685cSErich Keane   // CHECK-NEXT: NullStmt
253a15b685cSErich Keane 
254a15b685cSErich Keane #pragma acc serial reduction(*: T::SomeFloat)
255a15b685cSErich Keane   while(true);
256a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
257a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: *
258a15b685cSErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
259a15b685cSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
260a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
261a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
262a15b685cSErich Keane   // CHECK-NEXT: NullStmt
263a15b685cSErich Keane 
264a15b685cSErich Keane   typename T::IntTy i;
265a15b685cSErich Keane   // CHECK-NEXT: DeclStmt
266a15b685cSErich Keane   // CHECK-NEXT: VarDecl{{.*}} i 'typename T::IntTy'
267a15b685cSErich Keane 
268a15b685cSErich Keane #pragma acc parallel reduction(max: i)
269a15b685cSErich Keane   while(true);
270a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
271a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: max
272a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy'
273a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
274a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
275a15b685cSErich Keane   // CHECK-NEXT: NullStmt
276a15b685cSErich Keane 
277a15b685cSErich Keane #pragma acc serial reduction(min: t)
278a15b685cSErich Keane   while(true);
279a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
280a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: min
281a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T'
282a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
283a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
284a15b685cSErich Keane   // CHECK-NEXT: NullStmt
285a15b685cSErich Keane 
286a15b685cSErich Keane #pragma acc parallel reduction(&: T::SomeFloat)
287a15b685cSErich Keane   while(true);
288a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
289a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: &
290a15b685cSErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
291a15b685cSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
292a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
293a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
294a15b685cSErich Keane   // CHECK-NEXT: NullStmt
295a15b685cSErich Keane 
296a15b685cSErich Keane #pragma acc serial reduction(|: i)
297a15b685cSErich Keane   while(true);
298a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
299a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: |
300a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy'
301a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
302a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
303a15b685cSErich Keane   // CHECK-NEXT: NullStmt
304a15b685cSErich Keane 
305a15b685cSErich Keane #pragma acc parallel reduction(^: t)
306a15b685cSErich Keane   while(true);
307a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
308a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: ^
309a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T'
310a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
311a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
312a15b685cSErich Keane   // CHECK-NEXT: NullStmt
313a15b685cSErich Keane 
314a15b685cSErich Keane #pragma acc serial reduction(&&: T::SomeFloat)
315a15b685cSErich Keane   while(true);
316a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
317a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: &&
318a15b685cSErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
319a15b685cSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
320a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
321a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
322a15b685cSErich Keane   // CHECK-NEXT: NullStmt
323a15b685cSErich Keane 
324a15b685cSErich Keane #pragma acc parallel reduction(||: i)
325a15b685cSErich Keane   while(true);
326a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
327a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: ||
328a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy'
329a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
330a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
331a15b685cSErich Keane   // CHECK-NEXT: NullStmt
332a15b685cSErich Keane 
3330c7b92a4SErich Keane   // Match the instantiation:
3340c7b92a4SErich Keane   // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation
335daa88364SErich Keane   // CHECK-NEXT: TemplateArgument type 'InstTy'
336daa88364SErich Keane   // CHECK-NEXT: RecordType{{.*}} 'InstTy'
337daa88364SErich Keane   // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'
3380c7b92a4SErich Keane   // CHECK-NEXT: CompoundStmt
339daa88364SErich Keane 
3400c7b92a4SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
3410c7b92a4SErich Keane   // CHECK-NEXT: default(none)
3420c7b92a4SErich Keane   // CHECK-NEXT: WhileStmt
3430c7b92a4SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
3440c7b92a4SErich Keane   // CHECK-NEXT: NullStmt
345daa88364SErich Keane 
3460c7b92a4SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
3470c7b92a4SErich Keane   // CHECK-NEXT: default(present)
3480c7b92a4SErich Keane   // CHECK-NEXT: WhileStmt
3490c7b92a4SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
3500c7b92a4SErich Keane   // CHECK-NEXT: NullStmt
351daa88364SErich Keane 
352daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
353daa88364SErich Keane   // CHECK-NEXT: if clause
354daa88364SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
355daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
356daa88364SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
357daa88364SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
358daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
359daa88364SErich Keane   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
360daa88364SErich Keane   // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
361daa88364SErich Keane   // CHECK-NEXT: WhileStmt
362daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
363daa88364SErich Keane   // CHECK-NEXT: NullStmt
364daa88364SErich Keane 
365daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
366daa88364SErich Keane   // CHECK-NEXT: if clause
367daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>
368daa88364SErich Keane   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
369daa88364SErich Keane   // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
370daa88364SErich Keane   // CHECK-NEXT: WhileStmt
371daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
372daa88364SErich Keane   // CHECK-NEXT: NullStmt
373daa88364SErich Keane 
374daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
375daa88364SErich Keane   // CHECK-NEXT: if clause
376daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
377daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
378daa88364SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
379daa88364SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
380daa88364SErich Keane   // CHECK-NEXT: WhileStmt
381daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
382daa88364SErich Keane   // CHECK-NEXT: NullStmt
383daa88364SErich Keane 
384daa88364SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
385daa88364SErich Keane   // CHECK-NEXT: if clause
386daa88364SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion>
387daa88364SErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool'
388daa88364SErich Keane   // CHECK-NEXT: MemberExpr{{.*}} .operator bool
389daa88364SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion'
390daa88364SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
391daa88364SErich Keane   // CHECK-NEXT: WhileStmt
392daa88364SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
393daa88364SErich Keane   // CHECK-NEXT: NullStmt
39461338782SErich Keane 
39561338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
39661338782SErich Keane   // CHECK-NEXT: self clause
397*2c2accbcSerichkeane   // CHECK-NEXT: <<<NULL>>
39861338782SErich Keane   // CHECK-NEXT: WhileStmt
39961338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
40061338782SErich Keane   // CHECK-NEXT: NullStmt
40161338782SErich Keane 
40261338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
40361338782SErich Keane   // CHECK-NEXT: self clause
40461338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
40561338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
40661338782SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
40761338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
40861338782SErich Keane   // CHECK-NEXT: WhileStmt
40961338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
41061338782SErich Keane   // CHECK-NEXT: NullStmt
41161338782SErich Keane 
41261338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
41361338782SErich Keane   // CHECK-NEXT: self clause
41461338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
41561338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
41661338782SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
41761338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
41861338782SErich Keane   // CHECK-NEXT: if clause
41961338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
42061338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
42161338782SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
42261338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
42361338782SErich Keane   // CHECK-NEXT: WhileStmt
42461338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
42561338782SErich Keane   // CHECK-NEXT: NullStmt
42661338782SErich Keane 
42761338782SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
42861338782SErich Keane   // CHECK-NEXT: if clause
42961338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
43061338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
43161338782SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
43261338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
43361338782SErich Keane   // CHECK-NEXT: self clause
43461338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
43561338782SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
43661338782SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
43761338782SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
43861338782SErich Keane   // CHECK-NEXT: WhileStmt
43961338782SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
44061338782SErich Keane   // CHECK-NEXT: NullStmt
44161338782SErich Keane 
442a15b685cSErich Keane   // CHECK-NEXT: DeclStmt
443a15b685cSErich Keane   // CHECK-NEXT: VarDecl{{.*}} t 'InstTy'
444a15b685cSErich Keane   // CHECK-NEXT: CXXConstructExpr
445a15b685cSErich Keane 
446a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
447a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: +
448a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy'
449a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
450a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
451a15b685cSErich Keane   // CHECK-NEXT: NullStmt
452a15b685cSErich Keane 
453a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
454a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: *
455a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
456a15b685cSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
457a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
458a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
459a15b685cSErich Keane   // CHECK-NEXT: NullStmt
460a15b685cSErich Keane 
461a15b685cSErich Keane   // CHECK-NEXT: DeclStmt
462a15b685cSErich Keane   // CHECK-NEXT: VarDecl{{.*}} i 'typename InstTy::IntTy':'int'
463a15b685cSErich Keane 
464a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
465a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: max
466a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int'
467a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
468a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
469a15b685cSErich Keane   // CHECK-NEXT: NullStmt
470a15b685cSErich Keane 
471a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
472a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: min
473a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy'
474a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
475a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
476a15b685cSErich Keane   // CHECK-NEXT: NullStmt
477a15b685cSErich Keane 
478a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
479a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: &
480a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
481a15b685cSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
482a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
483a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
484a15b685cSErich Keane   // CHECK-NEXT: NullStmt
485a15b685cSErich Keane 
486a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
487a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: |
488a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int'
489a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
490a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
491a15b685cSErich Keane   // CHECK-NEXT: NullStmt
492a15b685cSErich Keane 
493a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
494a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: ^
495a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy'
496a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
497a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
498a15b685cSErich Keane   // CHECK-NEXT: NullStmt
499a15b685cSErich Keane 
500a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial
501a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: &&
502a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
503a15b685cSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
504a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
505a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
506a15b685cSErich Keane   // CHECK-NEXT: NullStmt
507a15b685cSErich Keane 
508a15b685cSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
509a15b685cSErich Keane   // CHECK-NEXT: reduction clause Operator: ||
510a15b685cSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int'
511a15b685cSErich Keane   // CHECK-NEXT: WhileStmt
512a15b685cSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
513a15b685cSErich Keane   // CHECK-NEXT: NullStmt
514a15b685cSErich Keane 
5150c7b92a4SErich Keane }
5160c7b92a4SErich Keane 
517daa88364SErich Keane struct BoolConversion{ operator bool() const;};
518daa88364SErich Keane struct InstTy {
519daa88364SErich Keane   using IntTy = int;
520daa88364SErich Keane   static constexpr float SomeFloat = 5.0;
521daa88364SErich Keane   static constexpr BoolConversion BC;
522daa88364SErich Keane };
523daa88364SErich Keane 
5240c7b92a4SErich Keane void Instantiate() {
525daa88364SErich Keane   TemplFunc<InstTy>();
5260c7b92a4SErich Keane }
5270c7b92a4SErich Keane #endif
528