xref: /llvm-project/clang/test/SemaOpenACC/sub-array-ast.cpp (revision 1a2f3309765fdc143fdc3809211fb85d2e2ca341)
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 
returns_3()10 constexpr int returns_3() { return 3; }
11 
Func(int i,int j)12 void Func(int i, int j) {
13   // CHECK: FunctionDecl{{.*}}Func
14   // CHECK-NEXT: ParmVarDecl{{.*}} i 'int'
15   // CHECK-NEXT: ParmVarDecl{{.*}} j 'int'
16   // CHECK-NEXT: CompoundStmt
17   int array[5];
18   // CHECK-NEXT: DeclStmt
19   // CHECK-NEXT: VarDecl{{.*}} array 'int[5]'
20   int VLA[i];
21   // CHECK-NEXT: DeclStmt
22   // CHECK-NEXT: VarDecl{{.*}} VLA 'int[i]'
23   int *ptr;
24   // CHECK-NEXT: DeclStmt
25   // CHECK-NEXT: VarDecl{{.*}} ptr 'int *'
26 
27 #pragma acc parallel private(array[returns_3():])
28   while (true);
29   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
30   // CHECK-NEXT: private clause
31   // CHECK-NEXT: ArraySectionExpr
32   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
33   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
34   // CHECK-NEXT: CallExpr{{.*}} 'int'
35   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
36   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
37   // CHECK-NEXT: <<<NULL>>>
38   // CHECK-NEXT: WhileStmt
39   // CHECK-NEXT: CXXBoolLiteralExpr
40   // CHECK-NEXT: NullStmt
41 
42 #pragma acc parallel private(array[:1])
43   while (true);
44   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
45   // CHECK-NEXT: private clause
46   // CHECK-NEXT: ArraySectionExpr
47   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
48   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
49   // CHECK-NEXT: <<<NULL>>>
50   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
51   // CHECK-NEXT: WhileStmt
52   // CHECK-NEXT: CXXBoolLiteralExpr
53   // CHECK-NEXT: NullStmt
54 
55 #pragma acc parallel private(array[returns_3():1])
56   while (true);
57   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
58   // CHECK-NEXT: private clause
59   // CHECK-NEXT: ArraySectionExpr
60   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
61   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
62   // CHECK-NEXT: CallExpr{{.*}} 'int'
63   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
64   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
65   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
66   // CHECK-NEXT: WhileStmt
67   // CHECK-NEXT: CXXBoolLiteralExpr
68   // CHECK-NEXT: NullStmt
69 
70 #pragma acc parallel private(array[i:j])
71   while (true);
72   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
73   // CHECK-NEXT: private clause
74   // CHECK-NEXT: ArraySectionExpr
75   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
76   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
77   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
78   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
79   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
80   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int'
81   // CHECK-NEXT: WhileStmt
82   // CHECK-NEXT: CXXBoolLiteralExpr
83   // CHECK-NEXT: NullStmt
84 
85 #pragma acc parallel private(VLA[:1])
86   while (true);
87   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
88   // CHECK-NEXT: private clause
89   // CHECK-NEXT: ArraySectionExpr
90   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
91   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[i]' lvalue Var{{.*}} 'VLA' 'int[i]'
92   // CHECK-NEXT: <<<NULL>>>
93   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
94   // CHECK-NEXT: WhileStmt
95   // CHECK-NEXT: CXXBoolLiteralExpr
96   // CHECK-NEXT: NullStmt
97 
98 #pragma acc parallel private(VLA[returns_3():1])
99   while (true);
100   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
101   // CHECK-NEXT: private clause
102   // CHECK-NEXT: ArraySectionExpr
103   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
104   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[i]' lvalue Var{{.*}} 'VLA' 'int[i]'
105   // CHECK-NEXT: CallExpr{{.*}}'int'
106   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
107   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
108   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
109   // CHECK-NEXT: WhileStmt
110   // CHECK-NEXT: CXXBoolLiteralExpr
111   // CHECK-NEXT: NullStmt
112 
113 #pragma acc parallel private(VLA[i:j])
114   while (true);
115   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
116   // CHECK-NEXT: private clause
117   // CHECK-NEXT: ArraySectionExpr
118   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
119   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[i]' lvalue Var{{.*}} 'VLA' 'int[i]'
120   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
121   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
122   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
123   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int'
124   // CHECK-NEXT: WhileStmt
125   // CHECK-NEXT: CXXBoolLiteralExpr
126   // CHECK-NEXT: NullStmt
127 
128 #pragma acc parallel private(ptr[:1])
129   while (true);
130   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
131   // CHECK-NEXT: private clause
132   // CHECK-NEXT: ArraySectionExpr
133   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
134   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue Var{{.*}} 'ptr' 'int *'
135   // CHECK-NEXT: <<<NULL>>>
136   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
137   // CHECK-NEXT: WhileStmt
138   // CHECK-NEXT: CXXBoolLiteralExpr
139   // CHECK-NEXT: NullStmt
140 
141 #pragma acc parallel private(ptr[returns_3():1])
142   while (true);
143   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
144   // CHECK-NEXT: private clause
145   // CHECK-NEXT: ArraySectionExpr
146   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
147   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue Var{{.*}} 'ptr' 'int *'
148   // CHECK-NEXT: CallExpr{{.*}}'int'
149   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
150   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
151   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
152   // CHECK-NEXT: WhileStmt
153   // CHECK-NEXT: CXXBoolLiteralExpr
154   // CHECK-NEXT: NullStmt
155 
156 #pragma acc parallel private(ptr[i:j])
157   while (true);
158   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
159   // CHECK-NEXT: private clause
160   // CHECK-NEXT: ArraySectionExpr
161   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
162   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue Var{{.*}} 'ptr' 'int *'
163   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
164   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
165   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
166   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int'
167   // CHECK-NEXT: WhileStmt
168   // CHECK-NEXT: CXXBoolLiteralExpr
169   // CHECK-NEXT: NullStmt
170 }
171 
172 template<typename T, unsigned I, auto &CEArray>
Templ(int i)173 void Templ(int i){
174   // CHECK-NEXT: FunctionTemplateDecl{{.*}}Templ
175   // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 T
176   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
177   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'auto &' depth 0 index 2 CEArray
178   // CHECK-NEXT: FunctionDecl{{.*}}Templ 'void (int)'
179   // CHECK-NEXT: ParmVarDecl{{.*}} i 'int'
180   // CHECK-NEXT: CompoundStmt
181   T array[I+2];
182   // CHECK-NEXT: DeclStmt
183   // CHECK-NEXT: VarDecl{{.*}} array 'T[I + 2]'
184   T VLA[i];
185   // CHECK-NEXT: DeclStmt
186   // CHECK-NEXT: VarDecl{{.*}} VLA 'T[i]'
187   T *ptr;
188   // CHECK-NEXT: DeclStmt
189   // CHECK-NEXT: VarDecl{{.*}} ptr 'T *'
190 
191 #pragma acc parallel private(array[returns_3():])
192   while (true);
193   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
194   // CHECK-NEXT: private clause
195   // CHECK-NEXT: ArraySectionExpr
196   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[I + 2]' lvalue Var{{.*}} 'array' 'T[I + 2]'
197   // CHECK-NEXT: CallExpr{{.*}} 'int'
198   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
199   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}}'returns_3' 'int ()'
200   // CHECK-NEXT: <<<NULL>>>
201   // CHECK-NEXT: WhileStmt
202   // CHECK-NEXT: CXXBoolLiteralExpr
203   // CHECK-NEXT: NullStmt
204 
205 #pragma acc parallel private(array[:I])
206   while (true);
207   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
208   // CHECK-NEXT: private clause
209   // CHECK-NEXT: ArraySectionExpr
210   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[I + 2]' lvalue Var{{.*}} 'array' 'T[I + 2]'
211   // CHECK-NEXT: <<<NULL>>>
212   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
213   // CHECK-NEXT: WhileStmt
214   // CHECK-NEXT: CXXBoolLiteralExpr
215   // CHECK-NEXT: NullStmt
216 
217 #pragma acc parallel private(array[returns_3()-2:I])
218   while (true);
219   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
220   // CHECK-NEXT: private clause
221   // CHECK-NEXT: ArraySectionExpr
222   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[I + 2]' lvalue Var{{.*}} 'array' 'T[I + 2]'
223   // CHECK-NEXT: BinaryOperator{{.*}} 'int' '-'
224   // CHECK-NEXT: CallExpr{{.*}} 'int'
225   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
226   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
227   // CHECK-NEXT: IntegerLiteral{{.*}} 2
228   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
229   // CHECK-NEXT: WhileStmt
230   // CHECK-NEXT: CXXBoolLiteralExpr
231   // CHECK-NEXT: NullStmt
232 
233 #pragma acc parallel private(array[i:i])
234   while (true);
235   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
236   // CHECK-NEXT: private clause
237   // CHECK-NEXT: ArraySectionExpr
238   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[I + 2]' lvalue Var{{.*}} 'array' 'T[I + 2]'
239   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
240   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
241   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
242   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
243   // CHECK-NEXT: WhileStmt
244   // CHECK-NEXT: CXXBoolLiteralExpr
245   // CHECK-NEXT: NullStmt
246 
247 #pragma acc parallel private(VLA[:I])
248   while (true);
249   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
250   // CHECK-NEXT: private clause
251   // CHECK-NEXT: ArraySectionExpr
252   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[i]' lvalue Var{{.*}} 'VLA' 'T[i]'
253   // CHECK-NEXT: <<<NULL>>>
254   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
255   // CHECK-NEXT: WhileStmt
256   // CHECK-NEXT: CXXBoolLiteralExpr
257   // CHECK-NEXT: NullStmt
258 
259 #pragma acc parallel private(VLA[returns_3():I])
260   while (true);
261   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
262   // CHECK-NEXT: private clause
263   // CHECK-NEXT: ArraySectionExpr
264   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[i]' lvalue Var{{.*}} 'VLA' 'T[i]'
265   // CHECK-NEXT: CallExpr{{.*}}'int'
266   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
267   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
268   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
269   // CHECK-NEXT: WhileStmt
270   // CHECK-NEXT: CXXBoolLiteralExpr
271   // CHECK-NEXT: NullStmt
272 
273 #pragma acc parallel private(VLA[i:i])
274   while (true);
275   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
276   // CHECK-NEXT: private clause
277   // CHECK-NEXT: ArraySectionExpr
278   // CHECK-NEXT: DeclRefExpr{{.*}} 'T[i]' lvalue Var{{.*}} 'VLA' 'T[i]'
279   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
280   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
281   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
282   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
283   // CHECK-NEXT: WhileStmt
284   // CHECK-NEXT: CXXBoolLiteralExpr
285   // CHECK-NEXT: NullStmt
286 
287 #pragma acc parallel private(ptr[:I])
288   while (true);
289   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
290   // CHECK-NEXT: private clause
291   // CHECK-NEXT: ArraySectionExpr
292   // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue Var{{.*}} 'ptr' 'T *'
293   // CHECK-NEXT: <<<NULL>>>
294   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
295   // CHECK-NEXT: WhileStmt
296   // CHECK-NEXT: CXXBoolLiteralExpr
297   // CHECK-NEXT: NullStmt
298 
299 #pragma acc parallel private(ptr[returns_3():I])
300   while (true);
301   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
302   // CHECK-NEXT: private clause
303   // CHECK-NEXT: ArraySectionExpr
304   // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue Var{{.*}} 'ptr' 'T *'
305   // CHECK-NEXT: CallExpr{{.*}} 'int'
306   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
307   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
308   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
309   // CHECK-NEXT: WhileStmt
310   // CHECK-NEXT: CXXBoolLiteralExpr
311   // CHECK-NEXT: NullStmt
312 
313 #pragma acc parallel private(ptr[i:i])
314   while (true);
315   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
316   // CHECK-NEXT: private clause
317   // CHECK-NEXT: ArraySectionExpr
318   // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue Var{{.*}} 'ptr' 'T *'
319   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
320   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
321   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
322   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
323   // CHECK-NEXT: WhileStmt
324   // CHECK-NEXT: CXXBoolLiteralExpr
325   // CHECK-NEXT: NullStmt
326 
327 #pragma acc parallel private(CEArray[returns_3() - 2: I])
328   while (true);
329   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
330   // CHECK-NEXT: private clause
331   // CHECK-NEXT: ArraySectionExpr
332   // CHECK-NEXT: DeclRefExpr{{.*}} 'auto' lvalue NonTypeTemplateParm{{.*}} 'CEArray' 'auto &'
333   // CHECK-NEXT: BinaryOperator{{.*}} 'int' '-'
334   // CHECK-NEXT: CallExpr{{.*}} 'int'
335   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
336   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
337   // CHECK-NEXT: IntegerLiteral{{.*}} 2
338   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
339   // CHECK-NEXT: WhileStmt
340   // CHECK-NEXT: CXXBoolLiteralExpr
341   // CHECK-NEXT: NullStmt
342 
343 #pragma acc parallel private(CEArray[: I])
344   while (true);
345   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
346   // CHECK-NEXT: private clause
347   // CHECK-NEXT: ArraySectionExpr
348   // CHECK-NEXT: DeclRefExpr{{.*}} 'auto' lvalue NonTypeTemplateParm{{.*}} 'CEArray' 'auto &'
349   // CHECK-NEXT: <<<NULL>>>
350   // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'I' 'unsigned int'
351   // CHECK-NEXT: WhileStmt
352   // CHECK-NEXT: CXXBoolLiteralExpr
353   // CHECK-NEXT: NullStmt
354 
355 
356   // Instantiation:
357   // CHECK-NEXT: FunctionDecl{{.*}} Templ 'void (int)' implicit_instantiation
358   // CHECK-NEXT: TemplateArgument{{.*}} 'int'
359   // CHECK-NEXT: BuiltinType{{.*}} 'int'
360   // CHECK-NEXT: TemplateArgument integral '3U'
361   // CHECK-NEXT: TemplateArgument decl
362   // CHECK-NEXT: Var{{.*}} 'CEArray' 'const int[5]'
363   // CHECK-NEXT: ParmVarDecl{{.*}} i 'int'
364   // CHECK-NEXT: CompoundStmt
365 
366   // T array[I+2];
367   // CHECK-NEXT: DeclStmt
368   // CHECK-NEXT: VarDecl{{.*}} array 'int[5]'
369   // T VLA[i];
370   // CHECK-NEXT: DeclStmt
371   // CHECK-NEXT: VarDecl{{.*}} VLA 'int[i]'
372   // T *ptr;
373   // CHECK-NEXT: DeclStmt
374   // CHECK-NEXT: VarDecl{{.*}} ptr 'int *'
375 
376 //#pragma acc parallel private(array[returns_3():])
377   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
378   // CHECK-NEXT: private clause
379   // CHECK-NEXT: ArraySectionExpr
380   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
381   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
382   // CHECK-NEXT: CallExpr{{.*}} 'int'
383   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
384   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}}'returns_3' 'int ()'
385   // CHECK-NEXT: <<<NULL>>>
386   // CHECK-NEXT: WhileStmt
387   // CHECK-NEXT: CXXBoolLiteralExpr
388   // CHECK-NEXT: NullStmt
389 
390 //#pragma acc parallel private(array[:I])
391   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
392   // CHECK-NEXT: private clause
393   // CHECK-NEXT: ArraySectionExpr
394   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
395   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
396   // CHECK-NEXT: <<<NULL>>>
397   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
398   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
399   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
400   // CHECK-NEXT: WhileStmt
401   // CHECK-NEXT: CXXBoolLiteralExpr
402   // CHECK-NEXT: NullStmt
403 
404 //#pragma acc parallel private(array[returns_3()-2:I])
405   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
406   // CHECK-NEXT: private clause
407   // CHECK-NEXT: ArraySectionExpr
408   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
409   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
410   // CHECK-NEXT: BinaryOperator{{.*}} 'int' '-'
411   // CHECK-NEXT: CallExpr{{.*}} 'int'
412   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
413   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
414   // CHECK-NEXT: IntegerLiteral{{.*}} 2
415   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
416   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
417   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
418   // CHECK-NEXT: WhileStmt
419   // CHECK-NEXT: CXXBoolLiteralExpr
420   // CHECK-NEXT: NullStmt
421 
422 //#pragma acc parallel private(array[i:i])
423   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
424   // CHECK-NEXT: private clause
425   // CHECK-NEXT: ArraySectionExpr
426   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
427   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[5]' lvalue Var{{.*}} 'array' 'int[5]'
428   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
429   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
430   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
431   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
432   // CHECK-NEXT: WhileStmt
433   // CHECK-NEXT: CXXBoolLiteralExpr
434   // CHECK-NEXT: NullStmt
435 
436 //#pragma acc parallel private(VLA[:I])
437   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
438   // CHECK-NEXT: private clause
439   // CHECK-NEXT: ArraySectionExpr
440   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
441   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[i]' lvalue Var{{.*}} 'VLA' 'int[i]'
442   // CHECK-NEXT: <<<NULL>>>
443   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
444   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
445   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
446   // CHECK-NEXT: WhileStmt
447   // CHECK-NEXT: CXXBoolLiteralExpr
448   // CHECK-NEXT: NullStmt
449 
450 //#pragma acc parallel private(VLA[returns_3():I])
451   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
452   // CHECK-NEXT: private clause
453   // CHECK-NEXT: ArraySectionExpr
454   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
455   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[i]' lvalue Var{{.*}} 'VLA' 'int[i]'
456   // CHECK-NEXT: CallExpr{{.*}}'int'
457   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
458   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
459   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
460   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
461   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
462   // CHECK-NEXT: WhileStmt
463   // CHECK-NEXT: CXXBoolLiteralExpr
464   // CHECK-NEXT: NullStmt
465 
466 //#pragma acc parallel private(VLA[i:i])
467   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
468   // CHECK-NEXT: private clause
469   // CHECK-NEXT: ArraySectionExpr
470   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
471   // CHECK-NEXT: DeclRefExpr{{.*}} 'int[i]' lvalue Var{{.*}} 'VLA' 'int[i]'
472   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
473   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
474   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
475   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
476   // CHECK-NEXT: WhileStmt
477   // CHECK-NEXT: CXXBoolLiteralExpr
478   // CHECK-NEXT: NullStmt
479 
480 //#pragma acc parallel private(ptr[:I])
481   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
482   // CHECK-NEXT: private clause
483   // CHECK-NEXT: ArraySectionExpr
484   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
485   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue Var{{.*}} 'ptr' 'int *'
486   // CHECK-NEXT: <<<NULL>>>
487   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
488   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
489   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
490   // CHECK-NEXT: WhileStmt
491   // CHECK-NEXT: CXXBoolLiteralExpr
492   // CHECK-NEXT: NullStmt
493 
494 //#pragma acc parallel private(ptr[returns_3():I])
495   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
496   // CHECK-NEXT: private clause
497   // CHECK-NEXT: ArraySectionExpr
498   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
499   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue Var{{.*}} 'ptr' 'int *'
500   // CHECK-NEXT: CallExpr{{.*}} 'int'
501   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
502   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
503   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
504   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
505   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
506   // CHECK-NEXT: WhileStmt
507   // CHECK-NEXT: CXXBoolLiteralExpr
508   // CHECK-NEXT: NullStmt
509 
510 //#pragma acc parallel private(ptr[i:i])
511   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
512   // CHECK-NEXT: private clause
513   // CHECK-NEXT: ArraySectionExpr
514   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
515   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue Var{{.*}} 'ptr' 'int *'
516   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
517   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
518   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
519   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int'
520   // CHECK-NEXT: WhileStmt
521   // CHECK-NEXT: CXXBoolLiteralExpr
522   // CHECK-NEXT: NullStmt
523 
524 //#pragma acc parallel private(CEArray[returns_3() - 2: I])
525   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
526   // CHECK-NEXT: private clause
527   // CHECK-NEXT: ArraySectionExpr
528   // CHECK-NEXT: ImplicitCastExpr{{.*}}'const int *' <ArrayToPointerDecay>
529   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'const int[5]' lvalue
530   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'auto &' depth 0 index 2 CEArray
531   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int[5]' lvalue Var{{.*}}'CEArray' 'const int[5]'
532   // CHECK-NEXT: BinaryOperator{{.*}} 'int' '-'
533   // CHECK-NEXT: CallExpr{{.*}} 'int'
534   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int (*)()' <FunctionToPointerDecay>
535   // CHECK-NEXT: DeclRefExpr{{.*}} 'int ()' lvalue Function{{.*}} 'returns_3' 'int ()'
536   // CHECK-NEXT: IntegerLiteral{{.*}} 2
537   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
538   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
539   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
540   // CHECK-NEXT: WhileStmt
541   // CHECK-NEXT: CXXBoolLiteralExpr
542   // CHECK-NEXT: NullStmt
543 
544 //#pragma acc parallel private(CEArray[: I])
545   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
546   // CHECK-NEXT: private clause
547   // CHECK-NEXT: ArraySectionExpr
548   // CHECK-NEXT: ImplicitCastExpr{{.*}}'const int *' <ArrayToPointerDecay>
549   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'const int[5]' lvalue
550   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'auto &' depth 0 index 2 CEArray
551   // CHECK-NEXT: DeclRefExpr{{.*}} 'const int[5]' lvalue Var{{.*}}'CEArray' 'const int[5]'
552   // CHECK-NEXT: <<<NULL>>>
553   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int'
554   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'unsigned int' depth 0 index 1 I
555   // CHECK-NEXT: IntegerLiteral{{.*}} 'unsigned int' 3
556   // CHECK-NEXT: WhileStmt
557   // CHECK-NEXT: CXXBoolLiteralExpr
558   // CHECK-NEXT: NullStmt
559 }
560 
561 // CHECK-NEXT: FunctionDecl{{.*}}inst
inst()562 void inst() {
563   static constexpr int CEArray[5]={1,2,3,4,5};
564   Templ<int, 3, CEArray>(5);
565 }
566 #endif
567