xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp (revision ebf13086740d714339b5f7a8bdadf9a5e1b754bb)
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 
10 int some_int();
11 short some_short();
12 long some_long();
13 enum E{};
14 E some_enum();
15 
16 struct CorrectConvert {
17   operator int();
18 } Convert;
19 
20 
21 void NormalUses() {
22   // CHECK: FunctionDecl{{.*}}NormalUses
23   // CHECK-NEXT: CompoundStmt
24 
25 #pragma acc parallel num_workers(some_int())
26   while(true){}
27   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
28   // CHECK-NEXT: num_workers clause
29   // CHECK-NEXT: CallExpr{{.*}}'int'
30   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
31   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
32   // CHECK-NEXT: WhileStmt
33   // CHECK-NEXT: CXXBoolLiteralExpr
34   // CHECK-NEXT: CompoundStmt
35 
36 #pragma acc kernels num_workers(some_short())
37   while(true){}
38   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
39   // CHECK-NEXT: num_workers clause
40   // CHECK-NEXT: CallExpr{{.*}}'short'
41   // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
42   // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
43   // CHECK-NEXT: WhileStmt
44   // CHECK-NEXT: CXXBoolLiteralExpr
45   // CHECK-NEXT: CompoundStmt
46 
47 #pragma acc parallel num_workers(some_long())
48   while(true){}
49   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
50   // CHECK-NEXT: num_workers clause
51   // CHECK-NEXT: CallExpr{{.*}}'long'
52   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
53   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
54   // CHECK-NEXT: WhileStmt
55   // CHECK-NEXT: CXXBoolLiteralExpr
56   // CHECK-NEXT: CompoundStmt
57 
58 #pragma acc parallel num_workers(some_enum())
59   while(true){}
60   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
61   // CHECK-NEXT: num_workers clause
62   // CHECK-NEXT: CallExpr{{.*}}'E'
63   // CHECK-NEXT: ImplicitCastExpr{{.*}}'E (*)()' <FunctionToPointerDecay>
64   // CHECK-NEXT: DeclRefExpr{{.*}}'E ()' lvalue Function{{.*}} 'some_enum' 'E ()'
65   // CHECK-NEXT: WhileStmt
66   // CHECK-NEXT: CXXBoolLiteralExpr
67   // CHECK-NEXT: CompoundStmt
68 
69 #pragma acc kernels num_workers(Convert)
70   while(true){}
71   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
72   // CHECK-NEXT: num_workers clause
73   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
74   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
75   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
76   // CHECK-NEXT: DeclRefExpr{{.*}} 'struct CorrectConvert':'CorrectConvert' lvalue Var
77   // CHECK-NEXT: WhileStmt
78   // CHECK-NEXT: CXXBoolLiteralExpr
79   // CHECK-NEXT: CompoundStmt
80 
81 #pragma acc kernels vector_length(some_short())
82   while(true){}
83   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
84   // CHECK-NEXT: vector_length clause
85   // CHECK-NEXT: CallExpr{{.*}}'short'
86   // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
87   // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
88   // CHECK-NEXT: WhileStmt
89   // CHECK-NEXT: CXXBoolLiteralExpr
90   // CHECK-NEXT: CompoundStmt
91 
92 #pragma acc parallel num_gangs(some_int(), some_long(), some_short())
93   while(true){}
94   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
95   // CHECK-NEXT: num_gangs clause
96   // CHECK-NEXT: CallExpr{{.*}}'int'
97   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
98   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
99   // CHECK-NEXT: CallExpr{{.*}}'long'
100   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
101   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
102   // CHECK-NEXT: CallExpr{{.*}}'short'
103   // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
104   // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
105   // CHECK-NEXT: WhileStmt
106   // CHECK-NEXT: CXXBoolLiteralExpr
107   // CHECK-NEXT: CompoundStmt
108 
109 #pragma acc kernels num_gangs(some_int())
110   while(true){}
111   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
112   // CHECK-NEXT: num_gangs clause
113   // CHECK-NEXT: CallExpr{{.*}}'int'
114   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
115   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
116   // CHECK-NEXT: WhileStmt
117   // CHECK-NEXT: CXXBoolLiteralExpr
118   // CHECK-NEXT: CompoundStmt
119 
120 #pragma acc kernels async(some_int())
121   while(true){}
122   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
123   // CHECK-NEXT: async clause
124   // CHECK-NEXT: CallExpr{{.*}}'int'
125   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
126   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
127   // CHECK-NEXT: WhileStmt
128   // CHECK-NEXT: CXXBoolLiteralExpr
129   // CHECK-NEXT: CompoundStmt
130 
131 #pragma acc kernels async
132   while(true){}
133   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
134   // CHECK-NEXT: async clause
135   // CHECK-NEXT: WhileStmt
136   // CHECK-NEXT: CXXBoolLiteralExpr
137   // CHECK-NEXT: CompoundStmt
138 
139 #pragma acc parallel wait
140   while (true){}
141   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
142   // CHECK-NEXT: wait clause
143   // CHECK-NEXT: <<<NULL>>>
144   // CHECK-NEXT: WhileStmt
145   // CHECK-NEXT: CXXBoolLiteralExpr
146   // CHECK-NEXT: CompoundStmt
147 #pragma acc parallel wait()
148   while (true){}
149   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
150   // CHECK-NEXT: wait clause
151   // CHECK-NEXT: <<<NULL>>>
152   // CHECK-NEXT: WhileStmt
153   // CHECK-NEXT: CXXBoolLiteralExpr
154   // CHECK-NEXT: CompoundStmt
155 #pragma acc parallel wait(some_int(), some_long())
156   while (true){}
157   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
158   // CHECK-NEXT: wait clause
159   // CHECK-NEXT: <<<NULL>>>
160   // CHECK-NEXT: CallExpr{{.*}}'int'
161   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
162   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
163   // CHECK-NEXT: CallExpr{{.*}}'long'
164   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
165   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
166   // CHECK-NEXT: WhileStmt
167   // CHECK-NEXT: CXXBoolLiteralExpr
168   // CHECK-NEXT: CompoundStmt
169 #pragma acc parallel wait(queues:some_int(), some_long())
170   while (true){}
171   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
172   // CHECK-NEXT: wait clause has queues tag
173   // CHECK-NEXT: <<<NULL>>>
174   // CHECK-NEXT: CallExpr{{.*}}'int'
175   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
176   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
177   // CHECK-NEXT: CallExpr{{.*}}'long'
178   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
179   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
180   // CHECK-NEXT: WhileStmt
181   // CHECK-NEXT: CXXBoolLiteralExpr
182   // CHECK-NEXT: CompoundStmt
183 #pragma acc parallel wait(devnum: some_int() :some_int(), some_long())
184   while (true){}
185   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
186   // CHECK-NEXT: wait clause has devnum
187   // CHECK-NEXT: CallExpr{{.*}}'int'
188   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
189   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
190   // CHECK-NEXT: CallExpr{{.*}}'int'
191   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
192   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
193   // CHECK-NEXT: CallExpr{{.*}}'long'
194   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
195   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
196   // CHECK-NEXT: WhileStmt
197   // CHECK-NEXT: CXXBoolLiteralExpr
198   // CHECK-NEXT: CompoundStmt
199 #pragma acc parallel wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())
200   while (true){}
201   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
202   // CHECK-NEXT: wait clause has devnum has queues tag
203   // CHECK-NEXT: CallExpr{{.*}}'int'
204   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
205   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
206   // CHECK-NEXT: CallExpr{{.*}}'int'
207   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
208   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
209   // CHECK-NEXT: CallExpr{{.*}}'long'
210   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
211   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
212   // CHECK-NEXT: wait clause has devnum has queues tag
213   // CHECK-NEXT: CallExpr{{.*}}'int'
214   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
215   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
216   // CHECK-NEXT: CallExpr{{.*}}'int'
217   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
218   // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
219   // CHECK-NEXT: CallExpr{{.*}}'long'
220   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
221   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
222   // CHECK-NEXT: WhileStmt
223   // CHECK-NEXT: CXXBoolLiteralExpr
224   // CHECK-NEXT: CompoundStmt
225 }
226 
227 
228 template<typename T, typename U>
229 void TemplUses(T t, U u) {
230   // CHECK-NEXT: FunctionTemplateDecl
231   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T
232   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U
233   // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
234   // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
235   // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
236   // CHECK-NEXT: CompoundStmt
237 
238 #pragma acc parallel num_workers(t)
239   while(true){}
240   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
241   // CHECK-NEXT: num_workers clause
242   // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'
243   // CHECK-NEXT: WhileStmt
244   // CHECK-NEXT: CXXBoolLiteralExpr
245   // CHECK-NEXT: CompoundStmt
246 
247 #pragma acc kernels num_workers(u)
248   while(true){}
249   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
250   // CHECK-NEXT: num_workers clause
251   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
252   // CHECK-NEXT: WhileStmt
253   // CHECK-NEXT: CXXBoolLiteralExpr
254   // CHECK-NEXT: CompoundStmt
255 
256 #pragma acc parallel num_workers(U::value)
257   while(true){}
258   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
259   // CHECK-NEXT: num_workers clause
260   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
261   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
262   // CHECK-NEXT: WhileStmt
263   // CHECK-NEXT: CXXBoolLiteralExpr
264   // CHECK-NEXT: CompoundStmt
265 
266 #pragma acc kernels num_workers(T{})
267   while(true){}
268   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
269   // CHECK-NEXT: num_workers clause
270   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'T' 'T' list
271   // CHECK-NEXT: InitListExpr{{.*}} 'void'
272   // CHECK-NEXT: WhileStmt
273   // CHECK-NEXT: CXXBoolLiteralExpr
274   // CHECK-NEXT: CompoundStmt
275 
276 #pragma acc parallel num_workers(U{})
277   while(true){}
278   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
279   // CHECK-NEXT: num_workers clause
280   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'U' 'U' list
281   // CHECK-NEXT: InitListExpr{{.*}} 'void'
282   // CHECK-NEXT: WhileStmt
283   // CHECK-NEXT: CXXBoolLiteralExpr
284   // CHECK-NEXT: CompoundStmt
285 
286 #pragma acc kernels num_workers(typename U::IntTy{})
287   while(true){}
288   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
289   // CHECK-NEXT: num_workers clause
290   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::IntTy' 'typename U::IntTy' list
291   // CHECK-NEXT: InitListExpr{{.*}} 'void'
292   // CHECK-NEXT: WhileStmt
293   // CHECK-NEXT: CXXBoolLiteralExpr
294   // CHECK-NEXT: CompoundStmt
295 
296 #pragma acc parallel num_workers(typename U::ShortTy{})
297   while(true){}
298   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
299   // CHECK-NEXT: num_workers clause
300   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::ShortTy' 'typename U::ShortTy' list
301   // CHECK-NEXT: InitListExpr{{.*}} 'void'
302   // CHECK-NEXT: WhileStmt
303   // CHECK-NEXT: CXXBoolLiteralExpr
304   // CHECK-NEXT: CompoundStmt
305 
306 #pragma acc kernels vector_length(u)
307   while(true){}
308   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
309   // CHECK-NEXT: vector_length clause
310   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
311   // CHECK-NEXT: WhileStmt
312   // CHECK-NEXT: CXXBoolLiteralExpr
313   // CHECK-NEXT: CompoundStmt
314 
315 #pragma acc parallel vector_length(U::value)
316   while(true){}
317   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
318   // CHECK-NEXT: vector_length clause
319   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
320   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
321   // CHECK-NEXT: WhileStmt
322   // CHECK-NEXT: CXXBoolLiteralExpr
323   // CHECK-NEXT: CompoundStmt
324 
325 #pragma acc kernels num_gangs(u)
326   while(true){}
327   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
328   // CHECK-NEXT: num_gangs clause
329   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
330   // CHECK-NEXT: WhileStmt
331   // CHECK-NEXT: CXXBoolLiteralExpr
332   // CHECK-NEXT: CompoundStmt
333 
334 #pragma acc parallel num_gangs(u, U::value)
335   while(true){}
336   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
337   // CHECK-NEXT: num_gangs clause
338   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
339   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
340   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
341   // CHECK-NEXT: WhileStmt
342   // CHECK-NEXT: CXXBoolLiteralExpr
343   // CHECK-NEXT: CompoundStmt
344 
345 #pragma acc kernels async
346   while(true){}
347   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
348   // CHECK-NEXT: async clause
349   // CHECK-NEXT: WhileStmt
350   // CHECK-NEXT: CXXBoolLiteralExpr
351   // CHECK-NEXT: CompoundStmt
352 
353 #pragma acc kernels async(u)
354   while(true){}
355   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
356   // CHECK-NEXT: async clause
357   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
358   // CHECK-NEXT: WhileStmt
359   // CHECK-NEXT: CXXBoolLiteralExpr
360   // CHECK-NEXT: CompoundStmt
361 
362 #pragma acc parallel async (U::value)
363   while(true){}
364   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
365   // CHECK-NEXT: async clause
366   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
367   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
368   // CHECK-NEXT: WhileStmt
369   // CHECK-NEXT: CXXBoolLiteralExpr
370   // CHECK-NEXT: CompoundStmt
371 
372 #pragma acc parallel wait
373   while (true){}
374   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
375   // CHECK-NEXT: wait clause
376   // CHECK-NEXT: <<<NULL>>>
377   // CHECK-NEXT: WhileStmt
378   // CHECK-NEXT: CXXBoolLiteralExpr
379   // CHECK-NEXT: CompoundStmt
380 
381 #pragma acc parallel wait()
382   while (true){}
383   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
384   // CHECK-NEXT: wait clause
385   // CHECK-NEXT: <<<NULL>>>
386   // CHECK-NEXT: WhileStmt
387   // CHECK-NEXT: CXXBoolLiteralExpr
388   // CHECK-NEXT: CompoundStmt
389 
390 #pragma acc parallel wait(U::value, u)
391   while (true){}
392   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
393   // CHECK-NEXT: wait clause
394   // CHECK-NEXT: <<<NULL>>>
395   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
396   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
397   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
398   // CHECK-NEXT: WhileStmt
399   // CHECK-NEXT: CXXBoolLiteralExpr
400   // CHECK-NEXT: CompoundStmt
401 
402 #pragma acc parallel wait(queues: U::value, u)
403   while (true){}
404   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
405   // CHECK-NEXT: wait clause has queues tag
406   // CHECK-NEXT: <<<NULL>>>
407   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
408   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
409   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
410   // CHECK-NEXT: WhileStmt
411   // CHECK-NEXT: CXXBoolLiteralExpr
412   // CHECK-NEXT: CompoundStmt
413 
414 #pragma acc parallel wait(devnum:u:queues: U::value, u)
415   while (true){}
416   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
417   // CHECK-NEXT: wait clause has devnum has queues tag
418   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
419   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
420   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
421   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
422   // CHECK-NEXT: WhileStmt
423   // CHECK-NEXT: CXXBoolLiteralExpr
424   // CHECK-NEXT: CompoundStmt
425 
426 #pragma acc parallel wait(devnum:u: U::value, u)
427   while (true){}
428   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
429   // CHECK-NEXT: wait clause has devnum
430   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
431   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
432   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
433   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
434   // CHECK-NEXT: WhileStmt
435   // CHECK-NEXT: CXXBoolLiteralExpr
436   // CHECK-NEXT: CompoundStmt
437 
438   // CHECK-NEXT: DeclStmt
439   // CHECK-NEXT: VarDecl{{.*}}EndMarker
440   int EndMarker;
441 
442   // Check the instantiated versions of the above.
443   // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation
444   // CHECK-NEXT: TemplateArgument type 'CorrectConvert'
445   // CHECK-NEXT: RecordType{{.*}} 'CorrectConvert'
446   // CHECK-NEXT: CXXRecord{{.*}} 'CorrectConvert'
447   // CHECK-NEXT: TemplateArgument type 'HasInt'
448   // CHECK-NEXT: RecordType{{.*}} 'HasInt'
449   // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'
450   // CHECK-NEXT: ParmVarDecl{{.*}} used t 'CorrectConvert'
451   // CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'
452   // CHECK-NEXT: CompoundStmt
453 
454   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
455   // CHECK-NEXT: num_workers clause
456   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
457   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
458   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
459   // CHECK-NEXT: DeclRefExpr{{.*}} 'CorrectConvert' lvalue ParmVar
460   // CHECK-NEXT: WhileStmt
461   // CHECK-NEXT: CXXBoolLiteralExpr
462   // CHECK-NEXT: CompoundStmt
463 
464   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
465   // CHECK-NEXT: num_workers clause
466   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
467   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
468   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
469   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
470   // CHECK-NEXT: WhileStmt
471   // CHECK-NEXT: CXXBoolLiteralExpr
472   // CHECK-NEXT: CompoundStmt
473 
474   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
475   // CHECK-NEXT: num_workers clause
476   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
477   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
478   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
479   // CHECK-NEXT: WhileStmt
480   // CHECK-NEXT: CXXBoolLiteralExpr
481   // CHECK-NEXT: CompoundStmt
482 
483   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
484   // CHECK-NEXT: num_workers clause
485   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
486   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
487   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
488   // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'CorrectConvert' lvalue
489   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'CorrectConvert' functional cast to struct CorrectConvert <NoOp>
490   // CHECK-NEXT: InitListExpr{{.*}}'CorrectConvert'
491   // CHECK-NEXT: WhileStmt
492   // CHECK-NEXT: CXXBoolLiteralExpr
493   // CHECK-NEXT: CompoundStmt
494 
495   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
496   // CHECK-NEXT: num_workers clause
497   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
498   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
499   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
500   // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'HasInt' lvalue
501   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'HasInt' functional cast to struct HasInt <NoOp>
502   // CHECK-NEXT: InitListExpr{{.*}}'HasInt'
503   // CHECK-NEXT: WhileStmt
504   // CHECK-NEXT: CXXBoolLiteralExpr
505   // CHECK-NEXT: CompoundStmt
506 
507   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
508   // CHECK-NEXT: num_workers clause
509   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::IntTy':'int' functional cast to typename struct HasInt::IntTy <NoOp>
510   // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'
511   // CHECK-NEXT: WhileStmt
512   // CHECK-NEXT: CXXBoolLiteralExpr
513   // CHECK-NEXT: CompoundStmt
514 
515   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
516   // CHECK-NEXT: num_workers clause
517   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::ShortTy':'short' functional cast to typename struct HasInt::ShortTy <NoOp>
518   // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'
519   // CHECK-NEXT: WhileStmt
520   // CHECK-NEXT: CXXBoolLiteralExpr
521   // CHECK-NEXT: CompoundStmt
522 
523   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
524   // CHECK-NEXT: vector_length clause
525   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
526   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
527   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
528   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
529   // CHECK-NEXT: WhileStmt
530   // CHECK-NEXT: CXXBoolLiteralExpr
531   // CHECK-NEXT: CompoundStmt
532 
533   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
534   // CHECK-NEXT: vector_length clause
535   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
536   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
537   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
538   // CHECK-NEXT: WhileStmt
539   // CHECK-NEXT: CXXBoolLiteralExpr
540   // CHECK-NEXT: CompoundStmt
541 
542   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
543   // CHECK-NEXT: num_gangs clause
544   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
545   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
546   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
547   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
548   // CHECK-NEXT: WhileStmt
549   // CHECK-NEXT: CXXBoolLiteralExpr
550   // CHECK-NEXT: CompoundStmt
551 
552   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
553   // CHECK-NEXT: num_gangs clause
554   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
555   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
556   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
557   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
558   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
559   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
560   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
561   // CHECK-NEXT: WhileStmt
562   // CHECK-NEXT: CXXBoolLiteralExpr
563   // CHECK-NEXT: CompoundStmt
564 
565   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
566   // CHECK-NEXT: async clause
567   // CHECK-NEXT: WhileStmt
568   // CHECK-NEXT: CXXBoolLiteralExpr
569   // CHECK-NEXT: CompoundStmt
570 
571   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels
572   // CHECK-NEXT: async clause
573   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
574   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
575   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
576   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
577   // CHECK-NEXT: WhileStmt
578   // CHECK-NEXT: CXXBoolLiteralExpr
579   // CHECK-NEXT: CompoundStmt
580 
581   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
582   // CHECK-NEXT: async clause
583   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
584   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
585   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
586   // CHECK-NEXT: WhileStmt
587   // CHECK-NEXT: CXXBoolLiteralExpr
588   // CHECK-NEXT: CompoundStmt
589 
590   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
591   // CHECK-NEXT: wait clause
592   // CHECK-NEXT: <<<NULL>>>
593   // CHECK-NEXT: WhileStmt
594   // CHECK-NEXT: CXXBoolLiteralExpr
595   // CHECK-NEXT: CompoundStmt
596 
597   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
598   // CHECK-NEXT: wait clause
599   // CHECK-NEXT: <<<NULL>>>
600   // CHECK-NEXT: WhileStmt
601   // CHECK-NEXT: CXXBoolLiteralExpr
602   // CHECK-NEXT: CompoundStmt
603 
604   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
605   // CHECK-NEXT: wait clause
606   // CHECK-NEXT: <<<NULL>>>
607   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
608   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
609   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
610   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
611   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
612   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
613   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
614   // CHECK-NEXT: WhileStmt
615   // CHECK-NEXT: CXXBoolLiteralExpr
616   // CHECK-NEXT: CompoundStmt
617 
618   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
619   // CHECK-NEXT: wait clause has queues tag
620   // CHECK-NEXT: <<<NULL>>>
621   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
622   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
623   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
624   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
625   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
626   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
627   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
628   // CHECK-NEXT: WhileStmt
629   // CHECK-NEXT: CXXBoolLiteralExpr
630   // CHECK-NEXT: CompoundStmt
631 
632   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
633   // CHECK-NEXT: wait clause has devnum has queues tag
634   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
635   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
636   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
637   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
638   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
639   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
640   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
641   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
642   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
643   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
644   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
645   // CHECK-NEXT: WhileStmt
646   // CHECK-NEXT: CXXBoolLiteralExpr
647   // CHECK-NEXT: CompoundStmt
648 
649   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
650   // CHECK-NEXT: wait clause has devnum
651   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
652   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
653   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
654   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
655   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
656   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
657   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
658   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
659   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
660   // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
661   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
662   // CHECK-NEXT: WhileStmt
663   // CHECK-NEXT: CXXBoolLiteralExpr
664   // CHECK-NEXT: CompoundStmt
665 
666   // CHECK-NEXT: DeclStmt
667   // CHECK-NEXT: VarDecl{{.*}}EndMarker
668 }
669 
670 struct HasInt {
671   using IntTy = int;
672   using ShortTy = short;
673   static constexpr int value = 1;
674 
675   operator char();
676 };
677 
678 void Inst() {
679   TemplUses<CorrectConvert, HasInt>({}, {});
680 }
681 #endif // PCH_HELPER
682