xref: /llvm-project/clang/test/SemaOpenACC/update-construct-ast.cpp (revision 553fa204ed5ab4c48bc6080451df24310c00e69c)
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 long some_long();
12 
13 int Global;
14 short GlobalArray[5];
15 
16 
17 void NormalFunc() {
18   // CHECK-LABEL: NormalFunc
19   // CHECK-NEXT: CompoundStmt
20 
21 #pragma acc update self(Global) if_present if (some_int() < some_long())
22   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
23   // CHECK-NEXT: self clause
24   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
25   // CHECK-NEXT: if_present clause
26   // CHECK-NEXT: if clause
27   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
28   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long'
29   // CHECK-NEXT: CallExpr{{.*}}'int'
30   // CHECK-NEXT: ImplicitCastExpr
31   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
32   // CHECK-NEXT: CallExpr{{.*}} 'long'
33   // CHECK-NEXT: ImplicitCastExpr
34   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
35 
36 #pragma acc update self(Global) wait async device_type(A) dtype(B)
37   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
38   // CHECK-NEXT: self clause
39   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
40   // CHECK-NEXT: wait clause
41   // CHECK-NEXT: <<<NULL>>>
42   // CHECK-NEXT: async clause
43   // CHECK-NEXT: device_type(A)
44   // CHECK-NEXT: dtype(B)
45 #pragma acc update self(Global) wait(some_int(), some_long()) async(some_int())
46   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
47   // CHECK-NEXT: self clause
48   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
49   // CHECK-NEXT: wait clause
50   // CHECK-NEXT: <<<NULL>>>
51   // CHECK-NEXT: CallExpr{{.*}}'int'
52   // CHECK-NEXT: ImplicitCastExpr
53   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
54   // CHECK-NEXT: CallExpr{{.*}}'long'
55   // CHECK-NEXT: ImplicitCastExpr
56   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
57   // CHECK-NEXT: async clause
58   // CHECK-NEXT: CallExpr{{.*}}'int'
59   // CHECK-NEXT: ImplicitCastExpr
60   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
61 #pragma acc update self(Global) wait(queues:some_int(), some_long())
62   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
63   // CHECK-NEXT: self clause
64   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
65   // CHECK-NEXT: wait clause
66   // CHECK-NEXT: <<<NULL>>>
67   // CHECK-NEXT: CallExpr{{.*}}'int'
68   // CHECK-NEXT: ImplicitCastExpr
69   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
70   // CHECK-NEXT: CallExpr{{.*}}'long'
71   // CHECK-NEXT: ImplicitCastExpr
72   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
73 #pragma acc update self(Global) wait(devnum: some_int() :some_int(), some_long())
74   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
75   // CHECK-NEXT: self clause
76   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
77   // CHECK-NEXT: wait clause
78   // CHECK-NEXT: CallExpr{{.*}}'int'
79   // CHECK-NEXT: ImplicitCastExpr
80   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
81   // CHECK-NEXT: CallExpr{{.*}}'int'
82   // CHECK-NEXT: ImplicitCastExpr
83   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
84   // CHECK-NEXT: CallExpr{{.*}}'long'
85   // CHECK-NEXT: ImplicitCastExpr
86   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
87 
88 #pragma acc update self(Global, GlobalArray, GlobalArray[0], GlobalArray[0:1])
89   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
90   // CHECK-NEXT: self clause
91   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
92   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
93   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'short' lvalue
94   // CHECK-NEXT: ImplicitCastExpr
95   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
96   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
97   // CHECK-NEXT: ArraySectionExpr
98   // CHECK-NEXT: ImplicitCastExpr
99   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
100   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
101   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
102 
103 #pragma acc update host(Global, GlobalArray, GlobalArray[0], GlobalArray[0:1]) device(Global, GlobalArray, GlobalArray[0], GlobalArray[0:1])
104   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
105   // CHECK-NEXT: host clause
106   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
107   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
108   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'short' lvalue
109   // CHECK-NEXT: ImplicitCastExpr
110   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
111   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
112   // CHECK-NEXT: ArraySectionExpr
113   // CHECK-NEXT: ImplicitCastExpr
114   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
115   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
116   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
117   // CHECK-NEXT: device clause
118   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
119   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
120   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'short' lvalue
121   // CHECK-NEXT: ImplicitCastExpr
122   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
123   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
124   // CHECK-NEXT: ArraySectionExpr
125   // CHECK-NEXT: ImplicitCastExpr
126   // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'
127   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
128   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
129 }
130 
131 template<typename T>
132 void TemplFunc(T t) {
133   // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
134   // CHECK-NEXT: TemplateTypeParmDecl
135   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
136   // CHECK-NEXT: ParmVarDecl{{.*}} t 'T'
137   // CHECK-NEXT: CompoundStmt
138 
139 #pragma acc update self(t) if_present if (T::value < t)
140   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
141   // CHECK-NEXT: self clause
142   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
143   // CHECK-NEXT: if_present clause
144   // CHECK-NEXT: if clause
145   // CHECK-NEXT: BinaryOperator{{.*}}'<dependent type>' '<'
146   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'
147   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
148   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T'
149 
150 #pragma acc update self(t) wait async device_type(T) dtype(U)
151   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
152   // CHECK-NEXT: self clause
153   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
154   // CHECK-NEXT: wait clause
155   // CHECK-NEXT: <<<NULL>>>
156   // CHECK-NEXT: async clause
157   // CHECK-NEXT: device_type(T)
158   // CHECK-NEXT: dtype(U)
159 #pragma acc update self(t) wait(T::value, t) async(T::value)
160   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
161   // CHECK-NEXT: self clause
162   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
163   // CHECK-NEXT: wait clause
164   // CHECK-NEXT: <<<NULL>>>
165   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
166   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
167   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
168   // CHECK-NEXT: async clause
169   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
170   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
171 #pragma acc update self(t) wait(queues:T::value, t) async(t)
172   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
173   // CHECK-NEXT: self clause
174   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
175   // CHECK-NEXT: wait clause
176   // CHECK-NEXT: <<<NULL>>>
177   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
178   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
179   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
180   // CHECK-NEXT: async clause
181   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
182 #pragma acc update self(t) wait(devnum: T::value:t, T::value)
183   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
184   // CHECK-NEXT: self clause
185   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
186   // CHECK-NEXT: wait clause
187   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
188   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
189   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
190   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
191   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
192 
193   decltype(T::value) Local = 0, LocalArray[5] = {};
194   // CHECK-NEXT: DeclStmt
195   // CHECK-NEXT: VarDecl
196   // CHECK-NEXT: IntegerLiteral
197   // CHECK-NEXT: VarDecl
198   // CHECK-NEXT: InitListExpr
199 
200 #pragma acc update self(Local, LocalArray, LocalArray[0], LocalArray[0:1])
201   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
202   // CHECK-NEXT: self clause
203   // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(T::value)'
204   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
205   // CHECK-NEXT: ArraySubscriptExpr
206   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
207   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
208   // CHECK-NEXT: ArraySectionExpr
209   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
210   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
211   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
212 
213 #pragma acc update host(Local, LocalArray, LocalArray[0], LocalArray[0:1]) device(Local, LocalArray, LocalArray[0], LocalArray[0:1])
214   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
215   // CHECK-NEXT: host clause
216   // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(T::value)'
217   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
218   // CHECK-NEXT: ArraySubscriptExpr
219   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
220   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
221   // CHECK-NEXT: ArraySectionExpr
222   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
223   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
224   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
225   // CHECK-NEXT: device clause
226   // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(T::value)'
227   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
228   // CHECK-NEXT: ArraySubscriptExpr
229   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
230   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
231   // CHECK-NEXT: ArraySectionExpr
232   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'
233   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
234   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
235 
236   // Instantiation:
237   // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void (SomeStruct)' implicit_instantiation
238   // CHECK-NEXT: TemplateArgument type 'SomeStruct'
239   // CHECK-NEXT: RecordType{{.*}} 'SomeStruct'
240   // CHECK-NEXT: CXXRecord{{.*}} 'SomeStruct'
241   // CHECK-NEXT: ParmVarDecl{{.*}} t 'SomeStruct'
242   // CHECK-NEXT: CompoundStmt
243 
244   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
245   // CHECK-NEXT: self clause
246   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
247   // CHECK-NEXT: if_present clause
248   // CHECK-NEXT: if clause
249   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
250   // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int'
251   // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'
252   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'
253   // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int'
254   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'
255   // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int
256   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'
257 
258   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
259   // CHECK-NEXT: self clause
260   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
261   // CHECK-NEXT: wait clause
262   // CHECK-NEXT: <<<NULL>>>
263   // CHECK-NEXT: async clause
264   // CHECK-NEXT: device_type(T)
265   // CHECK-NEXT: dtype(U)
266 
267   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
268   // CHECK-NEXT: self clause
269   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
270   // CHECK-NEXT: wait clause
271   // CHECK-NEXT: <<<NULL>>>
272   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
273   // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'
274   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'
275   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
276   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'
277   // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int
278   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'
279   // CHECK-NEXT: async clause
280   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
281   // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'
282   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'
283 
284   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
285   // CHECK-NEXT: self clause
286   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
287   // CHECK-NEXT: wait clause
288   // CHECK-NEXT: <<<NULL>>>
289   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
290   // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'
291   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'
292   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
293   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'
294   // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int
295   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'
296   // CHECK-NEXT: async clause
297   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
298   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'
299   // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int
300   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'
301 
302   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
303   // CHECK-NEXT: self clause
304   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
305   // CHECK-NEXT: wait clause
306   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
307   // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'
308   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'
309   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
310   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'
311   // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int
312   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'
313   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
314   // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'
315   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'
316 
317   // CHECK-NEXT: DeclStmt
318   // CHECK-NEXT: VarDecl
319   // CHECK-NEXT: ImplicitCastExpr
320   // CHECK-NEXT: IntegerLiteral
321   // CHECK-NEXT: VarDecl
322   // CHECK-NEXT: InitListExpr
323   // CHECK-NEXT: array_filler
324 
325   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
326   // CHECK-NEXT: self clause
327   // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(SomeStruct::value)':'const unsigned int'
328   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
329   // CHECK-NEXT: ArraySubscriptExpr
330   // CHECK-NEXT: ImplicitCastExpr
331   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
332   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
333   // CHECK-NEXT: ArraySectionExpr
334   // CHECK-NEXT: ImplicitCastExpr
335   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
336   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
337   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
338 
339   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
340   // CHECK-NEXT: host clause
341   // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(SomeStruct::value)':'const unsigned int'
342   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
343   // CHECK-NEXT: ArraySubscriptExpr
344   // CHECK-NEXT: ImplicitCastExpr
345   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
346   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
347   // CHECK-NEXT: ArraySectionExpr
348   // CHECK-NEXT: ImplicitCastExpr
349   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
350   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
351   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
352   // CHECK-NEXT: device clause
353   // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(SomeStruct::value)':'const unsigned int'
354   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
355   // CHECK-NEXT: ArraySubscriptExpr
356   // CHECK-NEXT: ImplicitCastExpr
357   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
358   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
359   // CHECK-NEXT: ArraySectionExpr
360   // CHECK-NEXT: ImplicitCastExpr
361   // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'
362   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0
363   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
364 }
365 
366 struct SomeStruct{
367   static constexpr unsigned value = 5;
368   operator unsigned();
369 };
370 void use() {
371   TemplFunc(SomeStruct{});
372 }
373 #endif
374