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