xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp (revision ebf13086740d714339b5f7a8bdadf9a5e1b754bb)
176600aeeSErich Keane // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
276600aeeSErich Keane 
376600aeeSErich Keane // Test this with PCH.
476600aeeSErich Keane // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
576600aeeSErich Keane // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
676600aeeSErich Keane 
776600aeeSErich Keane #ifndef PCH_HELPER
876600aeeSErich Keane #define PCH_HELPER
976600aeeSErich Keane 
1076600aeeSErich Keane int some_int();
1176600aeeSErich Keane short some_short();
1276600aeeSErich Keane long some_long();
1376600aeeSErich Keane enum E{};
1476600aeeSErich Keane E some_enum();
1576600aeeSErich Keane 
1676600aeeSErich Keane struct CorrectConvert {
1776600aeeSErich Keane   operator int();
1876600aeeSErich Keane } Convert;
1976600aeeSErich Keane 
2076600aeeSErich Keane 
2176600aeeSErich Keane void NormalUses() {
2276600aeeSErich Keane   // CHECK: FunctionDecl{{.*}}NormalUses
2376600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
2476600aeeSErich Keane 
2576600aeeSErich Keane #pragma acc parallel num_workers(some_int())
2676600aeeSErich Keane   while(true){}
2776600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
2876600aeeSErich Keane   // CHECK-NEXT: num_workers clause
2976600aeeSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'int'
3076600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
3176600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
3276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
3376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
3476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
3576600aeeSErich Keane 
3676600aeeSErich Keane #pragma acc kernels num_workers(some_short())
3776600aeeSErich Keane   while(true){}
3876600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
3976600aeeSErich Keane   // CHECK-NEXT: num_workers clause
4076600aeeSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'short'
4176600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
4276600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
4376600aeeSErich Keane   // CHECK-NEXT: WhileStmt
4476600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
4576600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
4676600aeeSErich Keane 
4776600aeeSErich Keane #pragma acc parallel num_workers(some_long())
4876600aeeSErich Keane   while(true){}
4976600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
5076600aeeSErich Keane   // CHECK-NEXT: num_workers clause
5176600aeeSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'long'
5276600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
5376600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
5476600aeeSErich Keane   // CHECK-NEXT: WhileStmt
5576600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
5676600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
5776600aeeSErich Keane 
5876600aeeSErich Keane #pragma acc parallel num_workers(some_enum())
5976600aeeSErich Keane   while(true){}
6076600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
6176600aeeSErich Keane   // CHECK-NEXT: num_workers clause
6276600aeeSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'E'
6376600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'E (*)()' <FunctionToPointerDecay>
6476600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'E ()' lvalue Function{{.*}} 'some_enum' 'E ()'
6576600aeeSErich Keane   // CHECK-NEXT: WhileStmt
6676600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
6776600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
6876600aeeSErich Keane 
6976600aeeSErich Keane #pragma acc kernels num_workers(Convert)
7076600aeeSErich Keane   while(true){}
7176600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
7276600aeeSErich Keane   // CHECK-NEXT: num_workers clause
7376600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
7476600aeeSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
7576600aeeSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
7676600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'struct CorrectConvert':'CorrectConvert' lvalue Var
7776600aeeSErich Keane   // CHECK-NEXT: WhileStmt
7876600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
7976600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
80b8adf169SErich Keane 
81b8adf169SErich Keane #pragma acc kernels vector_length(some_short())
82b8adf169SErich Keane   while(true){}
83b8adf169SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
84b8adf169SErich Keane   // CHECK-NEXT: vector_length clause
85b8adf169SErich Keane   // CHECK-NEXT: CallExpr{{.*}}'short'
86b8adf169SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
87b8adf169SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
88b8adf169SErich Keane   // CHECK-NEXT: WhileStmt
89b8adf169SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
90b8adf169SErich Keane   // CHECK-NEXT: CompoundStmt
91dc20a0eaSErich Keane 
92dc20a0eaSErich Keane #pragma acc parallel num_gangs(some_int(), some_long(), some_short())
93dc20a0eaSErich Keane   while(true){}
94dc20a0eaSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
95dc20a0eaSErich Keane   // CHECK-NEXT: num_gangs clause
96dc20a0eaSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'int'
97dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
98dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
99dc20a0eaSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'long'
100dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
101dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
102dc20a0eaSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'short'
103dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
104dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
105dc20a0eaSErich Keane   // CHECK-NEXT: WhileStmt
106dc20a0eaSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
107dc20a0eaSErich Keane   // CHECK-NEXT: CompoundStmt
108dc20a0eaSErich Keane 
109dc20a0eaSErich Keane #pragma acc kernels num_gangs(some_int())
110dc20a0eaSErich Keane   while(true){}
111dc20a0eaSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
112dc20a0eaSErich Keane   // CHECK-NEXT: num_gangs clause
113dc20a0eaSErich Keane   // CHECK-NEXT: CallExpr{{.*}}'int'
114dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
115dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
116dc20a0eaSErich Keane   // CHECK-NEXT: WhileStmt
117dc20a0eaSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
118dc20a0eaSErich Keane   // CHECK-NEXT: CompoundStmt
11930cfe2b2Serichkeane 
12030cfe2b2Serichkeane #pragma acc kernels async(some_int())
12130cfe2b2Serichkeane   while(true){}
12230cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
12330cfe2b2Serichkeane   // CHECK-NEXT: async clause
12430cfe2b2Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
12530cfe2b2Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
12630cfe2b2Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
12730cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
12830cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
12930cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
13030cfe2b2Serichkeane 
13130cfe2b2Serichkeane #pragma acc kernels async
13230cfe2b2Serichkeane   while(true){}
13330cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
13430cfe2b2Serichkeane   // CHECK-NEXT: async clause
13530cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
13630cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
13730cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
138*b1b46521Serichkeane 
139*b1b46521Serichkeane #pragma acc parallel wait
140*b1b46521Serichkeane   while (true){}
141*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
142*b1b46521Serichkeane   // CHECK-NEXT: wait clause
143*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
144*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
145*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
146*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
147*b1b46521Serichkeane #pragma acc parallel wait()
148*b1b46521Serichkeane   while (true){}
149*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
150*b1b46521Serichkeane   // CHECK-NEXT: wait clause
151*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
152*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
153*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
154*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
155*b1b46521Serichkeane #pragma acc parallel wait(some_int(), some_long())
156*b1b46521Serichkeane   while (true){}
157*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
158*b1b46521Serichkeane   // CHECK-NEXT: wait clause
159*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
160*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
161*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
162*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
163*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'long'
164*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
165*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
166*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
167*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
168*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
169*b1b46521Serichkeane #pragma acc parallel wait(queues:some_int(), some_long())
170*b1b46521Serichkeane   while (true){}
171*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
172*b1b46521Serichkeane   // CHECK-NEXT: wait clause has queues tag
173*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
174*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
175*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
176*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
177*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'long'
178*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
179*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
180*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
181*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
182*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
183*b1b46521Serichkeane #pragma acc parallel wait(devnum: some_int() :some_int(), some_long())
184*b1b46521Serichkeane   while (true){}
185*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
186*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum
187*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
188*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
189*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
190*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
191*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
192*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
193*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'long'
194*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
195*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
196*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
197*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
198*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
199*b1b46521Serichkeane #pragma acc parallel wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())
200*b1b46521Serichkeane   while (true){}
201*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
202*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum has queues tag
203*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
204*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
205*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
206*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
207*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
208*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
209*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'long'
210*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
211*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
212*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum has queues tag
213*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
214*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
215*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
216*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'int'
217*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
218*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
219*b1b46521Serichkeane   // CHECK-NEXT: CallExpr{{.*}}'long'
220*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
221*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
222*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
223*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
224*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
22576600aeeSErich Keane }
22676600aeeSErich Keane 
22730cfe2b2Serichkeane 
22876600aeeSErich Keane template<typename T, typename U>
22976600aeeSErich Keane void TemplUses(T t, U u) {
23076600aeeSErich Keane   // CHECK-NEXT: FunctionTemplateDecl
23176600aeeSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T
23276600aeeSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U
23376600aeeSErich Keane   // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
23476600aeeSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
23576600aeeSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
23676600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
23776600aeeSErich Keane 
23876600aeeSErich Keane #pragma acc parallel num_workers(t)
23976600aeeSErich Keane   while(true){}
24076600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
24176600aeeSErich Keane   // CHECK-NEXT: num_workers clause
24276600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'
24376600aeeSErich Keane   // CHECK-NEXT: WhileStmt
24476600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
24576600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
24676600aeeSErich Keane 
24776600aeeSErich Keane #pragma acc kernels num_workers(u)
24876600aeeSErich Keane   while(true){}
24976600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
25076600aeeSErich Keane   // CHECK-NEXT: num_workers clause
25176600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
25276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
25376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
25476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
25576600aeeSErich Keane 
25676600aeeSErich Keane #pragma acc parallel num_workers(U::value)
25776600aeeSErich Keane   while(true){}
25876600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
25976600aeeSErich Keane   // CHECK-NEXT: num_workers clause
26076600aeeSErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
26176600aeeSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
26276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
26376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
26476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
26576600aeeSErich Keane 
26676600aeeSErich Keane #pragma acc kernels num_workers(T{})
26776600aeeSErich Keane   while(true){}
26876600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
26976600aeeSErich Keane   // CHECK-NEXT: num_workers clause
27076600aeeSErich Keane   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'T' 'T' list
27176600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}} 'void'
27276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
27376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
27476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
27576600aeeSErich Keane 
27676600aeeSErich Keane #pragma acc parallel num_workers(U{})
27776600aeeSErich Keane   while(true){}
27876600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
27976600aeeSErich Keane   // CHECK-NEXT: num_workers clause
28076600aeeSErich Keane   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'U' 'U' list
28176600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}} 'void'
28276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
28376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
28476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
28576600aeeSErich Keane 
28676600aeeSErich Keane #pragma acc kernels num_workers(typename U::IntTy{})
28776600aeeSErich Keane   while(true){}
28876600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
28976600aeeSErich Keane   // CHECK-NEXT: num_workers clause
29076600aeeSErich Keane   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::IntTy' 'typename U::IntTy' list
29176600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}} 'void'
29276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
29376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
29476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
29576600aeeSErich Keane 
29676600aeeSErich Keane #pragma acc parallel num_workers(typename U::ShortTy{})
29776600aeeSErich Keane   while(true){}
29876600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
29976600aeeSErich Keane   // CHECK-NEXT: num_workers clause
30076600aeeSErich Keane   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::ShortTy' 'typename U::ShortTy' list
30176600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}} 'void'
30276600aeeSErich Keane   // CHECK-NEXT: WhileStmt
30376600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
30476600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
30576600aeeSErich Keane 
306b8adf169SErich Keane #pragma acc kernels vector_length(u)
307b8adf169SErich Keane   while(true){}
308b8adf169SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
309b8adf169SErich Keane   // CHECK-NEXT: vector_length clause
310b8adf169SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
311b8adf169SErich Keane   // CHECK-NEXT: WhileStmt
312b8adf169SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
313b8adf169SErich Keane   // CHECK-NEXT: CompoundStmt
314b8adf169SErich Keane 
315b8adf169SErich Keane #pragma acc parallel vector_length(U::value)
316b8adf169SErich Keane   while(true){}
317b8adf169SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
318b8adf169SErich Keane   // CHECK-NEXT: vector_length clause
319b8adf169SErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
320b8adf169SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
321b8adf169SErich Keane   // CHECK-NEXT: WhileStmt
322b8adf169SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
323b8adf169SErich Keane   // CHECK-NEXT: CompoundStmt
324b8adf169SErich Keane 
325dc20a0eaSErich Keane #pragma acc kernels num_gangs(u)
326dc20a0eaSErich Keane   while(true){}
327dc20a0eaSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
328dc20a0eaSErich Keane   // CHECK-NEXT: num_gangs clause
329dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
330dc20a0eaSErich Keane   // CHECK-NEXT: WhileStmt
331dc20a0eaSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
332dc20a0eaSErich Keane   // CHECK-NEXT: CompoundStmt
333dc20a0eaSErich Keane 
334dc20a0eaSErich Keane #pragma acc parallel num_gangs(u, U::value)
335dc20a0eaSErich Keane   while(true){}
336dc20a0eaSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
337dc20a0eaSErich Keane   // CHECK-NEXT: num_gangs clause
338dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
339dc20a0eaSErich Keane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
340dc20a0eaSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
341dc20a0eaSErich Keane   // CHECK-NEXT: WhileStmt
342dc20a0eaSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
343dc20a0eaSErich Keane   // CHECK-NEXT: CompoundStmt
344dc20a0eaSErich Keane 
34530cfe2b2Serichkeane #pragma acc kernels async
34630cfe2b2Serichkeane   while(true){}
34730cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
34830cfe2b2Serichkeane   // CHECK-NEXT: async clause
34930cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
35030cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
35130cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
35230cfe2b2Serichkeane 
35330cfe2b2Serichkeane #pragma acc kernels async(u)
35430cfe2b2Serichkeane   while(true){}
35530cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
35630cfe2b2Serichkeane   // CHECK-NEXT: async clause
35730cfe2b2Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
35830cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
35930cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
36030cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
36130cfe2b2Serichkeane 
36230cfe2b2Serichkeane #pragma acc parallel async (U::value)
36330cfe2b2Serichkeane   while(true){}
36430cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
36530cfe2b2Serichkeane   // CHECK-NEXT: async clause
36630cfe2b2Serichkeane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
36730cfe2b2Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
36830cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
36930cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
37030cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
37130cfe2b2Serichkeane 
372*b1b46521Serichkeane #pragma acc parallel wait
373*b1b46521Serichkeane   while (true){}
374*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
375*b1b46521Serichkeane   // CHECK-NEXT: wait clause
376*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
377*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
378*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
379*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
380*b1b46521Serichkeane 
381*b1b46521Serichkeane #pragma acc parallel wait()
382*b1b46521Serichkeane   while (true){}
383*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
384*b1b46521Serichkeane   // CHECK-NEXT: wait clause
385*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
386*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
387*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
388*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
389*b1b46521Serichkeane 
390*b1b46521Serichkeane #pragma acc parallel wait(U::value, u)
391*b1b46521Serichkeane   while (true){}
392*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
393*b1b46521Serichkeane   // CHECK-NEXT: wait clause
394*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
395*b1b46521Serichkeane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
396*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
397*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
398*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
399*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
400*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
401*b1b46521Serichkeane 
402*b1b46521Serichkeane #pragma acc parallel wait(queues: U::value, u)
403*b1b46521Serichkeane   while (true){}
404*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
405*b1b46521Serichkeane   // CHECK-NEXT: wait clause has queues tag
406*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
407*b1b46521Serichkeane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
408*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
409*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
410*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
411*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
412*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
413*b1b46521Serichkeane 
414*b1b46521Serichkeane #pragma acc parallel wait(devnum:u:queues: U::value, u)
415*b1b46521Serichkeane   while (true){}
416*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
417*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum has queues tag
418*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
419*b1b46521Serichkeane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
420*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
421*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
422*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
423*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
424*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
425*b1b46521Serichkeane 
426*b1b46521Serichkeane #pragma acc parallel wait(devnum:u: U::value, u)
427*b1b46521Serichkeane   while (true){}
428*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
429*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum
430*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
431*b1b46521Serichkeane   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
432*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
433*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
434*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
435*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
436*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
437*b1b46521Serichkeane 
438dc20a0eaSErich Keane   // CHECK-NEXT: DeclStmt
439dc20a0eaSErich Keane   // CHECK-NEXT: VarDecl{{.*}}EndMarker
440dc20a0eaSErich Keane   int EndMarker;
441dc20a0eaSErich Keane 
44276600aeeSErich Keane   // Check the instantiated versions of the above.
44376600aeeSErich Keane   // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation
44476600aeeSErich Keane   // CHECK-NEXT: TemplateArgument type 'CorrectConvert'
44576600aeeSErich Keane   // CHECK-NEXT: RecordType{{.*}} 'CorrectConvert'
44676600aeeSErich Keane   // CHECK-NEXT: CXXRecord{{.*}} 'CorrectConvert'
44776600aeeSErich Keane   // CHECK-NEXT: TemplateArgument type 'HasInt'
44876600aeeSErich Keane   // CHECK-NEXT: RecordType{{.*}} 'HasInt'
44976600aeeSErich Keane   // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'
45076600aeeSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} used t 'CorrectConvert'
45176600aeeSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'
45276600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
45376600aeeSErich Keane 
45476600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
45576600aeeSErich Keane   // CHECK-NEXT: num_workers clause
45676600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
45776600aeeSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
45876600aeeSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
45976600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'CorrectConvert' lvalue ParmVar
46076600aeeSErich Keane   // CHECK-NEXT: WhileStmt
46176600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
46276600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
46376600aeeSErich Keane 
46476600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
46576600aeeSErich Keane   // CHECK-NEXT: num_workers clause
46676600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
46776600aeeSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
46876600aeeSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
46976600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
47076600aeeSErich Keane   // CHECK-NEXT: WhileStmt
47176600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
47276600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
47376600aeeSErich Keane 
47476600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
47576600aeeSErich Keane   // CHECK-NEXT: num_workers clause
47676600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
47776600aeeSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
47876600aeeSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
47976600aeeSErich Keane   // CHECK-NEXT: WhileStmt
48076600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
48176600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
48276600aeeSErich Keane 
48376600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
48476600aeeSErich Keane   // CHECK-NEXT: num_workers clause
48576600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
48676600aeeSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
48776600aeeSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
48876600aeeSErich Keane   // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'CorrectConvert' lvalue
48976600aeeSErich Keane   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'CorrectConvert' functional cast to struct CorrectConvert <NoOp>
49076600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}}'CorrectConvert'
49176600aeeSErich Keane   // CHECK-NEXT: WhileStmt
49276600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
49376600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
49476600aeeSErich Keane 
49576600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
49676600aeeSErich Keane   // CHECK-NEXT: num_workers clause
49776600aeeSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
49876600aeeSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
49976600aeeSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
50076600aeeSErich Keane   // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'HasInt' lvalue
50176600aeeSErich Keane   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'HasInt' functional cast to struct HasInt <NoOp>
50276600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}}'HasInt'
50376600aeeSErich Keane   // CHECK-NEXT: WhileStmt
50476600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
50576600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
50676600aeeSErich Keane 
50776600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
50876600aeeSErich Keane   // CHECK-NEXT: num_workers clause
50976600aeeSErich Keane   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::IntTy':'int' functional cast to typename struct HasInt::IntTy <NoOp>
51076600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'
51176600aeeSErich Keane   // CHECK-NEXT: WhileStmt
51276600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
51376600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
51476600aeeSErich Keane 
51576600aeeSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
51676600aeeSErich Keane   // CHECK-NEXT: num_workers clause
51776600aeeSErich Keane   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::ShortTy':'short' functional cast to typename struct HasInt::ShortTy <NoOp>
51876600aeeSErich Keane   // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'
51976600aeeSErich Keane   // CHECK-NEXT: WhileStmt
52076600aeeSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
52176600aeeSErich Keane   // CHECK-NEXT: CompoundStmt
522b8adf169SErich Keane 
523b8adf169SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
524b8adf169SErich Keane   // CHECK-NEXT: vector_length clause
525b8adf169SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
526b8adf169SErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
527b8adf169SErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
528b8adf169SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
529b8adf169SErich Keane   // CHECK-NEXT: WhileStmt
530b8adf169SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
531b8adf169SErich Keane   // CHECK-NEXT: CompoundStmt
532b8adf169SErich Keane 
533b8adf169SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
534b8adf169SErich Keane   // CHECK-NEXT: vector_length clause
535b8adf169SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
536b8adf169SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
537b8adf169SErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
538b8adf169SErich Keane   // CHECK-NEXT: WhileStmt
539b8adf169SErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
540b8adf169SErich Keane   // CHECK-NEXT: CompoundStmt
541dc20a0eaSErich Keane 
542dc20a0eaSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
543dc20a0eaSErich Keane   // CHECK-NEXT: num_gangs clause
544dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
545dc20a0eaSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
546dc20a0eaSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
547dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
548dc20a0eaSErich Keane   // CHECK-NEXT: WhileStmt
549dc20a0eaSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
550dc20a0eaSErich Keane   // CHECK-NEXT: CompoundStmt
551dc20a0eaSErich Keane 
552dc20a0eaSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
553dc20a0eaSErich Keane   // CHECK-NEXT: num_gangs clause
554dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
555dc20a0eaSErich Keane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
556dc20a0eaSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
557dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
558dc20a0eaSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
559dc20a0eaSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
560dc20a0eaSErich Keane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
561dc20a0eaSErich Keane   // CHECK-NEXT: WhileStmt
562dc20a0eaSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
563dc20a0eaSErich Keane   // CHECK-NEXT: CompoundStmt
564dc20a0eaSErich Keane 
56530cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
56630cfe2b2Serichkeane   // CHECK-NEXT: async clause
56730cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
56830cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
56930cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
57030cfe2b2Serichkeane 
57130cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
57230cfe2b2Serichkeane   // CHECK-NEXT: async clause
57330cfe2b2Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
57430cfe2b2Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
57530cfe2b2Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
57630cfe2b2Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
57730cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
57830cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
57930cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
58030cfe2b2Serichkeane 
58130cfe2b2Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
58230cfe2b2Serichkeane   // CHECK-NEXT: async clause
58330cfe2b2Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
58430cfe2b2Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
58530cfe2b2Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
58630cfe2b2Serichkeane   // CHECK-NEXT: WhileStmt
58730cfe2b2Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
58830cfe2b2Serichkeane   // CHECK-NEXT: CompoundStmt
58930cfe2b2Serichkeane 
590*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
591*b1b46521Serichkeane   // CHECK-NEXT: wait clause
592*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
593*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
594*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
595*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
596*b1b46521Serichkeane 
597*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
598*b1b46521Serichkeane   // CHECK-NEXT: wait clause
599*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
600*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
601*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
602*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
603*b1b46521Serichkeane 
604*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
605*b1b46521Serichkeane   // CHECK-NEXT: wait clause
606*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
607*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
608*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
609*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
610*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
611*b1b46521Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
612*b1b46521Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
613*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
614*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
615*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
616*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
617*b1b46521Serichkeane 
618*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
619*b1b46521Serichkeane   // CHECK-NEXT: wait clause has queues tag
620*b1b46521Serichkeane   // CHECK-NEXT: <<<NULL>>>
621*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
622*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
623*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
624*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
625*b1b46521Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
626*b1b46521Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
627*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
628*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
629*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
630*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
631*b1b46521Serichkeane 
632*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
633*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum has queues tag
634*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
635*b1b46521Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
636*b1b46521Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
637*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
638*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
639*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
640*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
641*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
642*b1b46521Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
643*b1b46521Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
644*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
645*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
646*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
647*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
648*b1b46521Serichkeane 
649*b1b46521Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
650*b1b46521Serichkeane   // CHECK-NEXT: wait clause has devnum
651*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
652*b1b46521Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
653*b1b46521Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
654*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
655*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
656*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
657*b1b46521Serichkeane   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
658*b1b46521Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
659*b1b46521Serichkeane   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
660*b1b46521Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
661*b1b46521Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
662*b1b46521Serichkeane   // CHECK-NEXT: WhileStmt
663*b1b46521Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
664*b1b46521Serichkeane   // CHECK-NEXT: CompoundStmt
665*b1b46521Serichkeane 
666dc20a0eaSErich Keane   // CHECK-NEXT: DeclStmt
667dc20a0eaSErich Keane   // CHECK-NEXT: VarDecl{{.*}}EndMarker
66876600aeeSErich Keane }
66976600aeeSErich Keane 
67076600aeeSErich Keane struct HasInt {
67176600aeeSErich Keane   using IntTy = int;
67276600aeeSErich Keane   using ShortTy = short;
67376600aeeSErich Keane   static constexpr int value = 1;
67476600aeeSErich Keane 
67576600aeeSErich Keane   operator char();
67676600aeeSErich Keane };
67776600aeeSErich Keane 
67876600aeeSErich Keane void Inst() {
67976600aeeSErich Keane   TemplUses<CorrectConvert, HasInt>({}, {});
68076600aeeSErich Keane }
68176600aeeSErich Keane #endif // PCH_HELPER
682