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