682 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s2 3// Test this with PCH.4// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s5// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s6 7#ifndef PCH_HELPER8#define PCH_HELPER9 10int some_int();11short some_short();12long some_long();13enum E{};14E some_enum();15 16struct CorrectConvert {17 operator int();18} Convert;19 20 21void NormalUses() {22 // CHECK: FunctionDecl{{.*}}NormalUses23 // CHECK-NEXT: CompoundStmt24 25#pragma acc parallel num_workers(some_int())26 while(true){}27 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel28 // CHECK-NEXT: num_workers clause29 // CHECK-NEXT: CallExpr{{.*}}'int'30 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>31 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'32 // CHECK-NEXT: WhileStmt33 // CHECK-NEXT: CXXBoolLiteralExpr34 // CHECK-NEXT: CompoundStmt35 36#pragma acc kernels num_workers(some_short())37 while(true){}38 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels39 // CHECK-NEXT: num_workers clause40 // CHECK-NEXT: CallExpr{{.*}}'short'41 // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>42 // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'43 // CHECK-NEXT: WhileStmt44 // CHECK-NEXT: CXXBoolLiteralExpr45 // CHECK-NEXT: CompoundStmt46 47#pragma acc parallel num_workers(some_long())48 while(true){}49 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel50 // CHECK-NEXT: num_workers clause51 // CHECK-NEXT: CallExpr{{.*}}'long'52 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>53 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'54 // CHECK-NEXT: WhileStmt55 // CHECK-NEXT: CXXBoolLiteralExpr56 // CHECK-NEXT: CompoundStmt57 58#pragma acc parallel num_workers(some_enum())59 while(true){}60 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel61 // CHECK-NEXT: num_workers clause62 // CHECK-NEXT: CallExpr{{.*}}'E'63 // CHECK-NEXT: ImplicitCastExpr{{.*}}'E (*)()' <FunctionToPointerDecay>64 // CHECK-NEXT: DeclRefExpr{{.*}}'E ()' lvalue Function{{.*}} 'some_enum' 'E ()'65 // CHECK-NEXT: WhileStmt66 // CHECK-NEXT: CXXBoolLiteralExpr67 // CHECK-NEXT: CompoundStmt68 69#pragma acc kernels num_workers(Convert)70 while(true){}71 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels72 // CHECK-NEXT: num_workers clause73 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>74 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'75 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int76 // CHECK-NEXT: DeclRefExpr{{.*}} 'struct CorrectConvert' lvalue Var77 // CHECK-NEXT: WhileStmt78 // CHECK-NEXT: CXXBoolLiteralExpr79 // CHECK-NEXT: CompoundStmt80 81#pragma acc kernels vector_length(some_short())82 while(true){}83 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels84 // CHECK-NEXT: vector_length clause85 // CHECK-NEXT: CallExpr{{.*}}'short'86 // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>87 // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'88 // CHECK-NEXT: WhileStmt89 // CHECK-NEXT: CXXBoolLiteralExpr90 // CHECK-NEXT: CompoundStmt91 92#pragma acc parallel num_gangs(some_int(), some_long(), some_short())93 while(true){}94 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel95 // CHECK-NEXT: num_gangs clause96 // 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: WhileStmt106 // CHECK-NEXT: CXXBoolLiteralExpr107 // CHECK-NEXT: CompoundStmt108 109#pragma acc kernels num_gangs(some_int())110 while(true){}111 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels112 // CHECK-NEXT: num_gangs clause113 // CHECK-NEXT: CallExpr{{.*}}'int'114 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>115 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'116 // CHECK-NEXT: WhileStmt117 // CHECK-NEXT: CXXBoolLiteralExpr118 // CHECK-NEXT: CompoundStmt119 120#pragma acc kernels async(some_int())121 while(true){}122 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels123 // CHECK-NEXT: async clause124 // CHECK-NEXT: CallExpr{{.*}}'int'125 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>126 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'127 // CHECK-NEXT: WhileStmt128 // CHECK-NEXT: CXXBoolLiteralExpr129 // CHECK-NEXT: CompoundStmt130 131#pragma acc kernels async132 while(true){}133 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels134 // CHECK-NEXT: async clause135 // CHECK-NEXT: WhileStmt136 // CHECK-NEXT: CXXBoolLiteralExpr137 // CHECK-NEXT: CompoundStmt138 139#pragma acc parallel wait140 while (true){}141 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel142 // CHECK-NEXT: wait clause143 // CHECK-NEXT: <<<NULL>>>144 // CHECK-NEXT: WhileStmt145 // CHECK-NEXT: CXXBoolLiteralExpr146 // CHECK-NEXT: CompoundStmt147#pragma acc parallel wait148 while (true){}149 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel150 // CHECK-NEXT: wait clause151 // CHECK-NEXT: <<<NULL>>>152 // CHECK-NEXT: WhileStmt153 // CHECK-NEXT: CXXBoolLiteralExpr154 // CHECK-NEXT: CompoundStmt155#pragma acc parallel wait(some_int(), some_long())156 while (true){}157 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel158 // CHECK-NEXT: wait clause159 // 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: WhileStmt167 // CHECK-NEXT: CXXBoolLiteralExpr168 // CHECK-NEXT: CompoundStmt169#pragma acc parallel wait(queues:some_int(), some_long())170 while (true){}171 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel172 // CHECK-NEXT: wait clause has queues tag173 // 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: WhileStmt181 // CHECK-NEXT: CXXBoolLiteralExpr182 // CHECK-NEXT: CompoundStmt183#pragma acc parallel wait(devnum: some_int() :some_int(), some_long())184 while (true){}185 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel186 // CHECK-NEXT: wait clause has devnum187 // 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: WhileStmt197 // CHECK-NEXT: CXXBoolLiteralExpr198 // CHECK-NEXT: CompoundStmt199#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{{.*}}parallel202 // CHECK-NEXT: wait clause has devnum has queues tag203 // 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 tag213 // 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: WhileStmt223 // CHECK-NEXT: CXXBoolLiteralExpr224 // CHECK-NEXT: CompoundStmt225}226 227 228template<typename T, typename U>229void TemplUses(T t, U u) {230 // CHECK-NEXT: FunctionTemplateDecl231 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T232 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U233 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'234 // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'235 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'236 // CHECK-NEXT: CompoundStmt237 238#pragma acc parallel num_workers(t)239 while(true){}240 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel241 // CHECK-NEXT: num_workers clause242 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'243 // CHECK-NEXT: WhileStmt244 // CHECK-NEXT: CXXBoolLiteralExpr245 // CHECK-NEXT: CompoundStmt246 247#pragma acc kernels num_workers(u)248 while(true){}249 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels250 // CHECK-NEXT: num_workers clause251 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'252 // CHECK-NEXT: WhileStmt253 // CHECK-NEXT: CXXBoolLiteralExpr254 // CHECK-NEXT: CompoundStmt255 256#pragma acc parallel num_workers(U::value)257 while(true){}258 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel259 // CHECK-NEXT: num_workers clause260 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue261 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'262 // CHECK-NEXT: WhileStmt263 // CHECK-NEXT: CXXBoolLiteralExpr264 // CHECK-NEXT: CompoundStmt265 266#pragma acc kernels num_workers(T{})267 while(true){}268 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels269 // CHECK-NEXT: num_workers clause270 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'T' 'T' list271 // CHECK-NEXT: InitListExpr{{.*}} 'void'272 // CHECK-NEXT: WhileStmt273 // CHECK-NEXT: CXXBoolLiteralExpr274 // CHECK-NEXT: CompoundStmt275 276#pragma acc parallel num_workers(U{})277 while(true){}278 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel279 // CHECK-NEXT: num_workers clause280 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'U' 'U' list281 // CHECK-NEXT: InitListExpr{{.*}} 'void'282 // CHECK-NEXT: WhileStmt283 // CHECK-NEXT: CXXBoolLiteralExpr284 // CHECK-NEXT: CompoundStmt285 286#pragma acc kernels num_workers(typename U::IntTy{})287 while(true){}288 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels289 // CHECK-NEXT: num_workers clause290 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::IntTy' 'typename U::IntTy' list291 // CHECK-NEXT: InitListExpr{{.*}} 'void'292 // CHECK-NEXT: WhileStmt293 // CHECK-NEXT: CXXBoolLiteralExpr294 // CHECK-NEXT: CompoundStmt295 296#pragma acc parallel num_workers(typename U::ShortTy{})297 while(true){}298 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel299 // CHECK-NEXT: num_workers clause300 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::ShortTy' 'typename U::ShortTy' list301 // CHECK-NEXT: InitListExpr{{.*}} 'void'302 // CHECK-NEXT: WhileStmt303 // CHECK-NEXT: CXXBoolLiteralExpr304 // CHECK-NEXT: CompoundStmt305 306#pragma acc kernels vector_length(u)307 while(true){}308 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels309 // CHECK-NEXT: vector_length clause310 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'311 // CHECK-NEXT: WhileStmt312 // CHECK-NEXT: CXXBoolLiteralExpr313 // CHECK-NEXT: CompoundStmt314 315#pragma acc parallel vector_length(U::value)316 while(true){}317 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel318 // CHECK-NEXT: vector_length clause319 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue320 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'321 // CHECK-NEXT: WhileStmt322 // CHECK-NEXT: CXXBoolLiteralExpr323 // CHECK-NEXT: CompoundStmt324 325#pragma acc kernels num_gangs(u)326 while(true){}327 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels328 // CHECK-NEXT: num_gangs clause329 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'330 // CHECK-NEXT: WhileStmt331 // CHECK-NEXT: CXXBoolLiteralExpr332 // CHECK-NEXT: CompoundStmt333 334#pragma acc parallel num_gangs(u, U::value)335 while(true){}336 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel337 // CHECK-NEXT: num_gangs clause338 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'339 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue340 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'341 // CHECK-NEXT: WhileStmt342 // CHECK-NEXT: CXXBoolLiteralExpr343 // CHECK-NEXT: CompoundStmt344 345#pragma acc kernels async346 while(true){}347 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels348 // CHECK-NEXT: async clause349 // CHECK-NEXT: WhileStmt350 // CHECK-NEXT: CXXBoolLiteralExpr351 // CHECK-NEXT: CompoundStmt352 353#pragma acc kernels async(u)354 while(true){}355 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels356 // CHECK-NEXT: async clause357 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'358 // CHECK-NEXT: WhileStmt359 // CHECK-NEXT: CXXBoolLiteralExpr360 // CHECK-NEXT: CompoundStmt361 362#pragma acc parallel async (U::value)363 while(true){}364 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel365 // CHECK-NEXT: async clause366 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue367 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'368 // CHECK-NEXT: WhileStmt369 // CHECK-NEXT: CXXBoolLiteralExpr370 // CHECK-NEXT: CompoundStmt371 372#pragma acc parallel wait373 while (true){}374 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel375 // CHECK-NEXT: wait clause376 // CHECK-NEXT: <<<NULL>>>377 // CHECK-NEXT: WhileStmt378 // CHECK-NEXT: CXXBoolLiteralExpr379 // CHECK-NEXT: CompoundStmt380 381#pragma acc parallel wait382 while (true){}383 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel384 // CHECK-NEXT: wait clause385 // CHECK-NEXT: <<<NULL>>>386 // CHECK-NEXT: WhileStmt387 // CHECK-NEXT: CXXBoolLiteralExpr388 // CHECK-NEXT: CompoundStmt389 390#pragma acc parallel wait(U::value, u)391 while (true){}392 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel393 // CHECK-NEXT: wait clause394 // CHECK-NEXT: <<<NULL>>>395 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue396 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'397 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'398 // CHECK-NEXT: WhileStmt399 // CHECK-NEXT: CXXBoolLiteralExpr400 // CHECK-NEXT: CompoundStmt401 402#pragma acc parallel wait(queues: U::value, u)403 while (true){}404 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel405 // CHECK-NEXT: wait clause has queues tag406 // CHECK-NEXT: <<<NULL>>>407 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue408 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'409 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'410 // CHECK-NEXT: WhileStmt411 // CHECK-NEXT: CXXBoolLiteralExpr412 // CHECK-NEXT: CompoundStmt413 414#pragma acc parallel wait(devnum:u:queues: U::value, u)415 while (true){}416 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel417 // CHECK-NEXT: wait clause has devnum has queues tag418 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'419 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue420 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'421 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'422 // CHECK-NEXT: WhileStmt423 // CHECK-NEXT: CXXBoolLiteralExpr424 // CHECK-NEXT: CompoundStmt425 426#pragma acc parallel wait(devnum:u: U::value, u)427 while (true){}428 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel429 // CHECK-NEXT: wait clause has devnum430 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'431 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue432 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'433 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'434 // CHECK-NEXT: WhileStmt435 // CHECK-NEXT: CXXBoolLiteralExpr436 // CHECK-NEXT: CompoundStmt437 438 // CHECK-NEXT: DeclStmt439 // CHECK-NEXT: VarDecl{{.*}}EndMarker440 int EndMarker;441 442 // Check the instantiated versions of the above.443 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation444 // 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: CompoundStmt453 454 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel455 // CHECK-NEXT: num_workers clause456 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>457 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'458 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int459 // CHECK-NEXT: DeclRefExpr{{.*}} 'CorrectConvert' lvalue ParmVar460 // CHECK-NEXT: WhileStmt461 // CHECK-NEXT: CXXBoolLiteralExpr462 // CHECK-NEXT: CompoundStmt463 464 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels465 // CHECK-NEXT: num_workers clause466 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>467 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'468 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char469 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar470 // CHECK-NEXT: WhileStmt471 // CHECK-NEXT: CXXBoolLiteralExpr472 // CHECK-NEXT: CompoundStmt473 474 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel475 // CHECK-NEXT: num_workers clause476 // 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: WhileStmt480 // CHECK-NEXT: CXXBoolLiteralExpr481 // CHECK-NEXT: CompoundStmt482 483 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels484 // CHECK-NEXT: num_workers clause485 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>486 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'487 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int488 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'CorrectConvert' lvalue489 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'CorrectConvert' functional cast to struct CorrectConvert <NoOp>490 // CHECK-NEXT: InitListExpr{{.*}}'CorrectConvert'491 // CHECK-NEXT: WhileStmt492 // CHECK-NEXT: CXXBoolLiteralExpr493 // CHECK-NEXT: CompoundStmt494 495 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel496 // CHECK-NEXT: num_workers clause497 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>498 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'499 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char500 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'HasInt' lvalue501 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'HasInt' functional cast to struct HasInt <NoOp>502 // CHECK-NEXT: InitListExpr{{.*}}'HasInt'503 // CHECK-NEXT: WhileStmt504 // CHECK-NEXT: CXXBoolLiteralExpr505 // CHECK-NEXT: CompoundStmt506 507 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels508 // CHECK-NEXT: num_workers clause509 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::IntTy':'int' functional cast to typename HasInt::IntTy <NoOp>510 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'511 // CHECK-NEXT: WhileStmt512 // CHECK-NEXT: CXXBoolLiteralExpr513 // CHECK-NEXT: CompoundStmt514 515 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel516 // CHECK-NEXT: num_workers clause517 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::ShortTy':'short' functional cast to typename HasInt::ShortTy <NoOp>518 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'519 // CHECK-NEXT: WhileStmt520 // CHECK-NEXT: CXXBoolLiteralExpr521 // CHECK-NEXT: CompoundStmt522 523 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels524 // CHECK-NEXT: vector_length clause525 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>526 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'527 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char528 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar529 // CHECK-NEXT: WhileStmt530 // CHECK-NEXT: CXXBoolLiteralExpr531 // CHECK-NEXT: CompoundStmt532 533 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel534 // CHECK-NEXT: vector_length clause535 // 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: WhileStmt539 // CHECK-NEXT: CXXBoolLiteralExpr540 // CHECK-NEXT: CompoundStmt541 542 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels543 // CHECK-NEXT: num_gangs clause544 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>545 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'546 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char547 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar548 // CHECK-NEXT: WhileStmt549 // CHECK-NEXT: CXXBoolLiteralExpr550 // CHECK-NEXT: CompoundStmt551 552 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel553 // CHECK-NEXT: num_gangs clause554 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>555 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'556 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char557 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar558 // 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: WhileStmt562 // CHECK-NEXT: CXXBoolLiteralExpr563 // CHECK-NEXT: CompoundStmt564 565 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels566 // CHECK-NEXT: async clause567 // CHECK-NEXT: WhileStmt568 // CHECK-NEXT: CXXBoolLiteralExpr569 // CHECK-NEXT: CompoundStmt570 571 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels572 // CHECK-NEXT: async clause573 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>574 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'575 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char576 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar577 // CHECK-NEXT: WhileStmt578 // CHECK-NEXT: CXXBoolLiteralExpr579 // CHECK-NEXT: CompoundStmt580 581 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel582 // CHECK-NEXT: async clause583 // 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: WhileStmt587 // CHECK-NEXT: CXXBoolLiteralExpr588 // CHECK-NEXT: CompoundStmt589 590 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel591 // CHECK-NEXT: wait clause592 // CHECK-NEXT: <<<NULL>>>593 // CHECK-NEXT: WhileStmt594 // CHECK-NEXT: CXXBoolLiteralExpr595 // CHECK-NEXT: CompoundStmt596 597 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel598 // CHECK-NEXT: wait clause599 // CHECK-NEXT: <<<NULL>>>600 // CHECK-NEXT: WhileStmt601 // CHECK-NEXT: CXXBoolLiteralExpr602 // CHECK-NEXT: CompoundStmt603 604 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel605 // CHECK-NEXT: wait clause606 // 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 char613 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar614 // CHECK-NEXT: WhileStmt615 // CHECK-NEXT: CXXBoolLiteralExpr616 // CHECK-NEXT: CompoundStmt617 618 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel619 // CHECK-NEXT: wait clause has queues tag620 // 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 char627 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar628 // CHECK-NEXT: WhileStmt629 // CHECK-NEXT: CXXBoolLiteralExpr630 // CHECK-NEXT: CompoundStmt631 632 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel633 // CHECK-NEXT: wait clause has devnum has queues tag634 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>635 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'636 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char637 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar638 // 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 char644 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar645 // CHECK-NEXT: WhileStmt646 // CHECK-NEXT: CXXBoolLiteralExpr647 // CHECK-NEXT: CompoundStmt648 649 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel650 // CHECK-NEXT: wait clause has devnum651 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>652 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'653 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char654 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar655 // 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 char661 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar662 // CHECK-NEXT: WhileStmt663 // CHECK-NEXT: CXXBoolLiteralExpr664 // CHECK-NEXT: CompoundStmt665 666 // CHECK-NEXT: DeclStmt667 // CHECK-NEXT: VarDecl{{.*}}EndMarker668}669 670struct HasInt {671 using IntTy = int;672 using ShortTy = short;673 static constexpr int value = 1;674 675 operator char();676};677 678void Inst() {679 TemplUses<CorrectConvert, HasInt>({}, {});680}681#endif // PCH_HELPER682