990 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -ast-dump | FileCheck %s2 3// Test this with PCH.4// RUN: %clang_cc1 %s -fopenacc -emit-pch -Wno-openacc-deprecated-clause-alias -o %t %s5// RUN: %clang_cc1 %s -fopenacc -include-pch %t -Wno-openacc-deprecated-clause-alias -ast-dump-all | FileCheck %s6 7#ifndef PCH_HELPER8#define PCH_HELPER9 10int Global;11short GlobalArray[5];12 13void NormalUses(float *PointerParam) {14 // CHECK: FunctionDecl{{.*}}NormalUses15 // CHECK: ParmVarDecl16 // CHECK-NEXT: CompoundStmt17 18#pragma acc parallel private(Global, GlobalArray[2])19 while(true);20 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel21 // CHECK-NEXT: private clause22 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'23 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'short' lvalue24 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'short *' <ArrayToPointerDecay>25 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'26 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 227 // CHECK-NEXT: WhileStmt28 // CHECK-NEXT: CXXBoolLiteralExpr29 // CHECK-NEXT: NullStmt30 31#pragma acc parallel private(GlobalArray, PointerParam[Global])32 while(true);33 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel34 // CHECK-NEXT: private clause35 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'36 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue37 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>38 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'39 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>40 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'41 // CHECK-NEXT: WhileStmt42 // CHECK-NEXT: CXXBoolLiteralExpr43 // CHECK-NEXT: NullStmt44 45#pragma acc parallel firstprivate(GlobalArray, PointerParam[Global])46 while(true);47 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel48 // CHECK-NEXT: firstprivate clause49 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'50 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue51 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>52 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'53 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>54 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'55 // CHECK-NEXT: WhileStmt56 // CHECK-NEXT: CXXBoolLiteralExpr57 // CHECK-NEXT: NullStmt58 59#pragma acc parallel present(GlobalArray, PointerParam[Global])60 while(true);61 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel62 // CHECK-NEXT: present clause63 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'64 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue65 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>66 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'67 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>68 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'69 // CHECK-NEXT: WhileStmt70 // CHECK-NEXT: CXXBoolLiteralExpr71 // CHECK-NEXT: NullStmt72 73#pragma acc parallel no_create(GlobalArray, PointerParam[Global])74 while(true);75 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel76 // CHECK-NEXT: no_create clause77 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'78 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue79 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>80 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'81 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>82 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'83 // CHECK-NEXT: WhileStmt84 // CHECK-NEXT: CXXBoolLiteralExpr85 // CHECK-NEXT: NullStmt86 87#pragma acc parallel private(GlobalArray) private(PointerParam[Global])88 while(true);89 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel90 // CHECK-NEXT: private clause91 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'92 // CHECK-NEXT: private clause93 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue94 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>95 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'96 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>97 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'98 // CHECK-NEXT: WhileStmt99 // CHECK-NEXT: CXXBoolLiteralExpr100 // CHECK-NEXT: NullStmt101 102#pragma acc parallel copy(GlobalArray) pcopy(always: PointerParam[Global]) present_or_copy(alwaysin, alwaysout: Global)103 while(true);104 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel105 // CHECK-NEXT: copy clause106 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'107 // CHECK-NEXT: pcopy clause modifiers: always108 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue109 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>110 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'111 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>112 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'113 // CHECK-NEXT: present_or_copy clause modifiers: alwaysin, alwaysout114 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'115 // CHECK-NEXT: WhileStmt116 // CHECK-NEXT: CXXBoolLiteralExpr117 // CHECK-NEXT: NullStmt118 119#pragma acc parallel copyin(GlobalArray) pcopyin(readonly: PointerParam[Global]) present_or_copyin(always, alwaysin: Global)120 while(true);121 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel122 // CHECK-NEXT: copyin clause123 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'124 // CHECK-NEXT: pcopyin clause modifiers: readonly125 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue126 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>127 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'128 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>129 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'130 // CHECK-NEXT: present_or_copyin clause modifiers: always, alwaysin131 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'132 // CHECK-NEXT: WhileStmt133 // CHECK-NEXT: CXXBoolLiteralExpr134 // CHECK-NEXT: NullStmt135 136#pragma acc parallel copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(always, alwaysout: Global)137 while(true);138 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel139 // CHECK-NEXT: copyout clause140 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'141 // CHECK-NEXT: pcopyout clause modifiers: zero142 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue143 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>144 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'145 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>146 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'147 // CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout148 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'149 // CHECK-NEXT: WhileStmt150 // CHECK-NEXT: CXXBoolLiteralExpr151 // CHECK-NEXT: NullStmt152 153#pragma acc parallel create(GlobalArray) pcreate(zero:PointerParam[Global]) present_or_create(Global)154 while(true);155 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel156 // CHECK-NEXT: create clause157 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'158 // CHECK-NEXT: pcreate clause modifiers: zero159 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue160 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>161 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'162 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>163 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'164 // CHECK-NEXT: present_or_create clause165 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'166 // CHECK-NEXT: WhileStmt167 // CHECK-NEXT: CXXBoolLiteralExpr168 // CHECK-NEXT: NullStmt169 170#pragma acc parallel private(GlobalArray, PointerParam[Global : Global])171 while(true);172 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel173 // CHECK-NEXT: private clause174 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'175 // CHECK-NEXT: ArraySectionExpr176 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>177 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'178 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>179 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'180 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>181 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'182 // CHECK-NEXT: WhileStmt183 // CHECK-NEXT: CXXBoolLiteralExpr184 // CHECK-NEXT: NullStmt185 186#pragma acc parallel firstprivate(GlobalArray, PointerParam[Global : Global])187 while(true);188 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel189 // CHECK-NEXT: firstprivate clause190 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'191 // CHECK-NEXT: ArraySectionExpr192 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>193 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'194 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>195 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'196 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>197 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'198 // CHECK-NEXT: WhileStmt199 // CHECK-NEXT: CXXBoolLiteralExpr200 // CHECK-NEXT: NullStmt201 202#pragma acc parallel attach(PointerParam) deviceptr(PointerParam)203 while (true);204 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel205 // CHECK-NEXT: attach clause206 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'207 // CHECK-NEXT: deviceptr clause208 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'209 // CHECK-NEXT: WhileStmt210 // CHECK-NEXT: CXXBoolLiteralExpr211 // CHECK-NEXT: NullStmt212}213 214// This example is an error typically, but we want to make sure we're properly215// capturing NTTPs until instantiation time.216template<unsigned I>217void UnInstTempl() {218 // CHECK-NEXT: FunctionTemplateDecl{{.*}} UnInstTempl219 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}}referenced 'unsigned int' depth 0 index 0 I220 // CHECK-NEXT: FunctionDecl{{.*}} UnInstTempl 'void ()'221 // CHECK-NEXT: CompoundStmt222#pragma acc parallel private(I)223 while(true);224 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel225 // CHECK-NEXT: private clause226 // CHECK-NEXT: DeclRefExpr{{.*}}'unsigned int' NonTypeTemplateParm{{.*}}'I' 'unsigned int'227 // CHECK-NEXT: WhileStmt228 // CHECK-NEXT: CXXBoolLiteralExpr229 // CHECK-NEXT: NullStmt230#pragma acc parallel firstprivate(I)231 while(true);232 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel233 // CHECK-NEXT: firstprivate clause234 // CHECK-NEXT: DeclRefExpr{{.*}}'unsigned int' NonTypeTemplateParm{{.*}}'I' 'unsigned int'235 // CHECK-NEXT: WhileStmt236 // CHECK-NEXT: CXXBoolLiteralExpr237 // CHECK-NEXT: NullStmt238}239 240template<auto &NTTP, typename T, typename U>241void TemplUses(T t, U u, T*PointerParam) {242 // CHECK-NEXT: FunctionTemplateDecl243 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP244 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T245 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U246 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U, T *)'247 // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'248 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'249 // CHECK-NEXT: ParmVarDecl{{.*}} referenced PointerParam 'T *'250 // CHECK-NEXT: CompoundStmt251 252 253#pragma acc parallel private(GlobalArray, PointerParam[Global])254 while(true);255 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel256 // CHECK-NEXT: private clause257 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'258 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'T' lvalue259 // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}}'PointerParam' 'T *'260 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'261 // CHECK-NEXT: WhileStmt262 // CHECK-NEXT: CXXBoolLiteralExpr263 // CHECK-NEXT: NullStmt264 265#pragma acc parallel private(t, u)266 while(true);267 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel268 // CHECK-NEXT: private clause269 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'270 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'271 // CHECK-NEXT: WhileStmt272 // CHECK-NEXT: CXXBoolLiteralExpr273 // CHECK-NEXT: NullStmt274 275#pragma acc parallel firstprivate(t, u)276 while(true);277 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel278 // CHECK-NEXT: firstprivate clause279 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'280 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'281 // CHECK-NEXT: WhileStmt282 // CHECK-NEXT: CXXBoolLiteralExpr283 // CHECK-NEXT: NullStmt284 285#pragma acc parallel private(t) private(u)286 while(true);287 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel288 // CHECK-NEXT: private clause289 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'290 // CHECK-NEXT: private clause291 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'292 // CHECK-NEXT: WhileStmt293 // CHECK-NEXT: CXXBoolLiteralExpr294 // CHECK-NEXT: NullStmt295 296#pragma acc parallel private(t) private(NTTP, u)297 while(true);298 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel299 // CHECK-NEXT: private clause300 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'301 // CHECK-NEXT: private clause302 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'303 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'304 // CHECK-NEXT: WhileStmt305 // CHECK-NEXT: CXXBoolLiteralExpr306 // CHECK-NEXT: NullStmt307 308#pragma acc parallel private(t) firstprivate(NTTP, u)309 while(true);310 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel311 // CHECK-NEXT: private clause312 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'313 // CHECK-NEXT: firstprivate clause314 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'315 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'316 // CHECK-NEXT: WhileStmt317 // CHECK-NEXT: CXXBoolLiteralExpr318 // CHECK-NEXT: NullStmt319 320#pragma acc parallel no_create(t) present(NTTP, u)321 while(true);322 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel323 // CHECK-NEXT: no_create clause324 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'325 // CHECK-NEXT: present clause326 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'327 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'328 // CHECK-NEXT: WhileStmt329 // CHECK-NEXT: CXXBoolLiteralExpr330 // CHECK-NEXT: NullStmt331 332#pragma acc parallel copy(t) pcopy(always: NTTP, u) present_or_copy(alwaysin, alwaysout: u[0:t])333 while(true);334 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel335 // CHECK-NEXT: copy clause336 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'337 // CHECK-NEXT: pcopy clause modifiers: always338 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'339 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'340 // CHECK-NEXT: present_or_copy clause modifiers: alwaysin, alwaysout341 // CHECK-NEXT: ArraySectionExpr342 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'343 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0344 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'345 // CHECK-NEXT: WhileStmt346 // CHECK-NEXT: CXXBoolLiteralExpr347 // CHECK-NEXT: NullStmt348 349#pragma acc parallel copyin(t) pcopyin(readonly:NTTP, u) present_or_copyin(always, alwaysin: u[0:t])350 while(true);351 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel352 // CHECK-NEXT: copyin clause353 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'354 // CHECK-NEXT: pcopyin clause modifiers: readonly355 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'356 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'357 // CHECK-NEXT: present_or_copyin clause modifiers: always, alwaysin358 // CHECK-NEXT: ArraySectionExpr359 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'360 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0361 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'362 // CHECK-NEXT: WhileStmt363 // CHECK-NEXT: CXXBoolLiteralExpr364 // CHECK-NEXT: NullStmt365 366#pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(always, alwaysout: u[0:t])367 while(true);368 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel369 // CHECK-NEXT: copyout clause370 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'371 // CHECK-NEXT: pcopyout clause modifiers: zero372 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'373 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'374 // CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout375 // CHECK-NEXT: ArraySectionExpr376 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'377 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0378 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'379 // CHECK-NEXT: WhileStmt380 // CHECK-NEXT: CXXBoolLiteralExpr381 // CHECK-NEXT: NullStmt382 383#pragma acc parallel create(t) pcreate(zero: NTTP, u) present_or_create(u[0:t])384 while(true);385 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel386 // CHECK-NEXT: create clause387 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'388 // CHECK-NEXT: pcreate clause modifiers: zero389 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'390 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'391 // CHECK-NEXT: present_or_create clause392 // CHECK-NEXT: ArraySectionExpr393 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'394 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0395 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'396 // CHECK-NEXT: WhileStmt397 // CHECK-NEXT: CXXBoolLiteralExpr398 // CHECK-NEXT: NullStmt399 400#pragma acc parallel private(u[0])401 while(true);402 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel403 // CHECK-NEXT: private clause404 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'<dependent type>' lvalue405 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'406 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0407 // CHECK-NEXT: WhileStmt408 // CHECK-NEXT: CXXBoolLiteralExpr409 // CHECK-NEXT: NullStmt410 411#pragma acc parallel private(u[0:t])412 while(true);413 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel414 // CHECK-NEXT: private clause415 // CHECK-NEXT: ArraySectionExpr416 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'417 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0418 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'419 // CHECK-NEXT: WhileStmt420 // CHECK-NEXT: CXXBoolLiteralExpr421 // CHECK-NEXT: NullStmt422 423#pragma acc parallel attach(PointerParam) deviceptr(PointerParam)424 while (true);425 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel426 // CHECK-NEXT: attach clause427 // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'428 // CHECK-NEXT: deviceptr clause429 // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'430 // CHECK-NEXT: WhileStmt431 // CHECK-NEXT: CXXBoolLiteralExpr432 // CHECK-NEXT: NullStmt433 434 // CHECK-NEXT: DeclStmt435 // CHECK-NEXT: VarDecl{{.*}}EndMarker436 int EndMarker;437 438 // Check the instantiated versions of the above.439 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *, int *)' implicit_instantiation440 // CHECK-NEXT: TemplateArgument decl441 // CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'442 // CHECK-NEXT: TemplateArgument type 'int'443 // CHECK-NEXT: BuiltinType{{.*}} 'int'444 // CHECK-NEXT: TemplateArgument type 'int[1]'445 // CHECK-NEXT: ConstantArrayType{{.*}} 'int[1]'{{.*}} 1446 // CHECK-NEXT: BuiltinType{{.*}} 'int'447 // CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'448 // CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *'449 // CHECK-NEXT: ParmVarDecl{{.*}} used PointerParam 'int *'450 // CHECK-NEXT: CompoundStmt451 452// #pragma acc parallel private(GlobalArray, PointerParam[Global])453 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel454 // CHECK-NEXT: private clause455 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'456 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue457 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>458 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}}'PointerParam' 'int *'459 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>460 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'461 // CHECK-NEXT: WhileStmt462 // CHECK-NEXT: CXXBoolLiteralExpr463 // CHECK-NEXT: NullStmt464 465// #pragma acc parallel private(t, u)466 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel467 // CHECK-NEXT: private clause468 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'469 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'470 // CHECK-NEXT: WhileStmt471 // CHECK-NEXT: CXXBoolLiteralExpr472 // CHECK-NEXT: NullStmt473 474// #pragma acc parallel firstprivate(t, u)475 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel476 // CHECK-NEXT: firstprivate clause477 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'478 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'479 // CHECK-NEXT: WhileStmt480 // CHECK-NEXT: CXXBoolLiteralExpr481 // CHECK-NEXT: NullStmt482 483// #pragma acc parallel private(t) private(u)484 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel485 // CHECK-NEXT: private clause486 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'487 // CHECK-NEXT: private clause488 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'489 // CHECK-NEXT: WhileStmt490 // CHECK-NEXT: CXXBoolLiteralExpr491 // CHECK-NEXT: NullStmt492 493// #pragma acc parallel private(t) private(NTTP, u)494 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel495 // CHECK-NEXT: private clause496 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'497 // CHECK-NEXT: private clause498 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue499 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP500 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'501 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'502 // CHECK-NEXT: WhileStmt503 // CHECK-NEXT: CXXBoolLiteralExpr504 // CHECK-NEXT: NullStmt505 506// #pragma acc parallel private(t) firstprivate(NTTP, u)507 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel508 // CHECK-NEXT: private clause509 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'510 // CHECK-NEXT: firstprivate clause511 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue512 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP513 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'514 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'515 // CHECK-NEXT: WhileStmt516 // CHECK-NEXT: CXXBoolLiteralExpr517 // CHECK-NEXT: NullStmt518 519// #pragma acc parallel no_create(t) present(NTTP, u)520 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel521 // CHECK-NEXT: no_create clause522 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'523 // CHECK-NEXT: present clause524 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue525 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP526 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'527 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'528 // CHECK-NEXT: WhileStmt529 // CHECK-NEXT: CXXBoolLiteralExpr530 // CHECK-NEXT: NullStmt531 532//#pragma acc parallel copy(t) pcopy(always: NTTP, u) present_or_copy(alwaysin, alwaysout: u[0:t])533 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel534 // CHECK-NEXT: copy clause535 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'536 // CHECK-NEXT: pcopy clause modifiers: always537 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue538 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP539 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'540 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'541 // CHECK-NEXT: present_or_copy clause modifiers: alwaysin, alwaysout542 // CHECK-NEXT: ArraySectionExpr543 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>544 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'545 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0546 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>547 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'548 // CHECK-NEXT: WhileStmt549 // CHECK-NEXT: CXXBoolLiteralExpr550 // CHECK-NEXT: NullStmt551 552//#pragma acc parallel copyin(t) pcopyin(readonly:NTTP, u) present_or_copyin(always, alwaysin: u[0:t])553 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel554 // CHECK-NEXT: copyin clause555 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'556 // CHECK-NEXT: pcopyin clause modifiers: readonly557 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue558 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP559 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'560 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'561 // CHECK-NEXT: present_or_copyin clause modifiers: always, alwaysin562 // CHECK-NEXT: ArraySectionExpr563 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>564 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'565 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0566 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>567 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'568 // CHECK-NEXT: WhileStmt569 // CHECK-NEXT: CXXBoolLiteralExpr570 // CHECK-NEXT: NullStmt571 572// #pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(always, alwaysout: u[0:t])573 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel574 // CHECK-NEXT: copyout clause575 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'576 // CHECK-NEXT: pcopyout clause modifiers: zero577 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue578 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP579 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'580 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'581 // CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout582 // CHECK-NEXT: ArraySectionExpr583 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>584 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'585 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0586 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>587 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'588 // CHECK-NEXT: WhileStmt589 // CHECK-NEXT: CXXBoolLiteralExpr590 // CHECK-NEXT: NullStmt591 592//#pragma acc parallel create(t) pcreate(zero: NTTP, u) present_or_create(u[0:t])593 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel594 // CHECK-NEXT: create clause595 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'596 // CHECK-NEXT: pcreate clause modifiers: zero597 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue598 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP599 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'600 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'601 // CHECK-NEXT: present_or_create clause602 // CHECK-NEXT: ArraySectionExpr603 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>604 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'605 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0606 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>607 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'608 // CHECK-NEXT: WhileStmt609 // CHECK-NEXT: CXXBoolLiteralExpr610 // CHECK-NEXT: NullStmt611 612// #pragma acc parallel private(u[0])613 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel614 // CHECK-NEXT: private clause615 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue616 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>617 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'618 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0619 // CHECK-NEXT: WhileStmt620 // CHECK-NEXT: CXXBoolLiteralExpr621 // CHECK-NEXT: NullStmt622 623// #pragma acc parallel private(u[0:t])624 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel625 // CHECK-NEXT: private clause626 // CHECK-NEXT: ArraySectionExpr627 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>628 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'629 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0630 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>631 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'632 // CHECK-NEXT: WhileStmt633 // CHECK-NEXT: CXXBoolLiteralExpr634 // CHECK-NEXT: NullStmt635 636//#pragma acc parallel attach(PointerParam) deviceptr(PointerParam)637 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel638 // CHECK-NEXT: attach clause639 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'640 // CHECK-NEXT: deviceptr clause641 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'642 // CHECK-NEXT: WhileStmt643 // CHECK-NEXT: CXXBoolLiteralExpr644 // CHECK-NEXT: NullStmt645 646 // CHECK-NEXT: DeclStmt647 // CHECK-NEXT: VarDecl{{.*}}EndMarker648}649 650struct S {651 // CHECK-NEXT: CXXRecordDecl{{.*}} struct S definition652 // CHECK: CXXRecordDecl{{.*}} implicit {{.*}}struct S{{$}}653 int ThisMember;654 // CHECK-NEXT: FieldDecl{{.*}} ThisMember 'int'655 int *ThisMemberPtr;656 // CHECK-NEXT: FieldDecl{{.*}} ThisMemberPtr 'int *'657 int ThisMemberArray[5];658 // CHECK-NEXT: FieldDecl{{.*}} ThisMemberArray 'int[5]'659 660 void foo();661 // CHECK-NEXT: CXXMethodDecl{{.*}} foo 'void ()'662 663 template<typename T>664 void bar(T *PointerParam) {665 // CHECK-NEXT: FunctionTemplateDecl{{.*}}bar666 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T667 // CHECK-NEXT: CXXMethodDecl{{.*}} bar 'void (T *)' implicit-inline668 // CHECK-NEXT: ParmVarDecl{{.*}} PointerParam 'T *'669 // CHECK-NEXT: CompoundStmt670 671#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])672 while(true);673 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel674 // CHECK-NEXT: private clause675 // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember676 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this677 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue678 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>679 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray680 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this681 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1682 // CHECK-NEXT: WhileStmt683 // CHECK-NEXT: CXXBoolLiteralExpr684 // CHECK-NEXT: NullStmt685 686#pragma acc parallel private(ThisMemberArray[1:2])687 while(true);688 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel689 // CHECK-NEXT: private clause690 // CHECK-NEXT: ArraySectionExpr{{.*}}691 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>692 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray693 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this694 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1695 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2696 // CHECK-NEXT: WhileStmt697 // CHECK-NEXT: CXXBoolLiteralExpr698 // CHECK-NEXT: NullStmt699 700#pragma acc parallel private(this)701 while(true);702 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel703 // CHECK-NEXT: private clause704 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this705 // CHECK-NEXT: WhileStmt706 // CHECK-NEXT: CXXBoolLiteralExpr707 // CHECK-NEXT: NullStmt708 709#pragma acc parallel attach(PointerParam, this, this->ThisMemberPtr) deviceptr(PointerParam, this, ThisMemberPtr)710 while (true);711 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel712 // CHECK-NEXT: attach clause713 // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'714 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this715 // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr716 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this717 // CHECK-NEXT: deviceptr clause718 // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'719 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this720 // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr721 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this722 // CHECK-NEXT: WhileStmt723 // CHECK-NEXT: CXXBoolLiteralExpr724 // CHECK-NEXT: NullStmt725 726 // Check Instantiations:727 // CHECK-NEXT: CXXMethodDecl{{.*}} used bar 'void (int *)' implicit_instantiation implicit-inline728 // CHECK-NEXT: TemplateArgument type 'int'729 // CHECK-NEXT: BuiltinType{{.*}} 'int'730 // CHECK-NEXT: ParmVarDecl{{.*}} PointerParam 'int *'731 // CHECK-NEXT: CompoundStmt732 733// #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])734 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel735 // CHECK-NEXT: private clause736 // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember737 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this738 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue739 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>740 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray741 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this742 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1743 // CHECK-NEXT: WhileStmt744 // CHECK-NEXT: CXXBoolLiteralExpr745 // CHECK-NEXT: NullStmt746 747// #pragma acc parallel private(ThisMemberArray[1:2])748 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel749 // CHECK-NEXT: private clause750 // CHECK-NEXT: ArraySectionExpr{{.*}}751 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>752 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray753 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this754 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1755 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2756 // CHECK-NEXT: WhileStmt757 // CHECK-NEXT: CXXBoolLiteralExpr758 // CHECK-NEXT: NullStmt759 760// #pragma acc parallel private(this)761 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel762 // CHECK-NEXT: private clause763 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this764 // CHECK-NEXT: WhileStmt765 // CHECK-NEXT: CXXBoolLiteralExpr766 // CHECK-NEXT: NullStmt767 768//#pragma acc parallel attach(PointerParam, this, this->ThisMemberPtr) deviceptr(PointerParam, this, ThisMemberPtr)769 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel770 // CHECK-NEXT: attach clause771 // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'772 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this773 // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr774 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this775 // CHECK-NEXT: deviceptr clause776 // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'777 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this778 // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr779 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this780 // CHECK-NEXT: WhileStmt781 // CHECK-NEXT: CXXBoolLiteralExpr782 // CHECK-NEXT: NullStmt783}784};785 786void S::foo() {787 // CHECK: CXXMethodDecl{{.*}} foo 'void ()'788 // CHECK-NEXT: CompoundStmt789#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])790 while(true);791 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel792 // CHECK-NEXT: private clause793 // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember794 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this795 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue796 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>797 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray798 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this799 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1800 // CHECK-NEXT: WhileStmt801 // CHECK-NEXT: CXXBoolLiteralExpr802 // CHECK-NEXT: NullStmt803 804#pragma acc parallel private(ThisMemberArray[1:2])805 while(true);806 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel807 // CHECK-NEXT: private clause808 // CHECK-NEXT: ArraySectionExpr{{.*}}809 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>810 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray811 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this812 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1813 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2814 // CHECK-NEXT: WhileStmt815 // CHECK-NEXT: CXXBoolLiteralExpr816 // CHECK-NEXT: NullStmt817 818#pragma acc parallel private(this)819 while(true);820 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel821 // CHECK-NEXT: private clause822 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this823 // CHECK-NEXT: WhileStmt824 // CHECK-NEXT: CXXBoolLiteralExpr825 // CHECK-NEXT: NullStmt826}827 828template<typename U>829struct STempl {830 // CHECK-NEXT: ClassTemplateDecl{{.*}} STempl831 // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 U832 // CHECK-NEXT: CXXRecordDecl{{.*}} struct STempl definition833 // CHECK: CXXRecordDecl{{.*}} implicit struct STempl834 U ThisMember;835 // CHECK-NEXT: FieldDecl{{.*}} ThisMember 'U'836 U ThisMemberArray[5];837 // CHECK-NEXT: FieldDecl{{.*}} ThisMemberArray 'U[5]'838 839 void foo() {840 // CHECK-NEXT: CXXMethodDecl {{.*}} foo 'void ()'841 // CHECK-NEXT: CompoundStmt842 843#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])844 while(true);845 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel846 // CHECK-NEXT: private clause847 // CHECK-NEXT: MemberExpr{{.*}} 'U' lvalue ->ThisMember848 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this849 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'U' lvalue850 // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray851 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this852 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1853 // CHECK-NEXT: WhileStmt854 // CHECK-NEXT: CXXBoolLiteralExpr855 // CHECK-NEXT: NullStmt856 857#pragma acc parallel private(ThisMemberArray[1:2])858 while(true);859 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel860 // CHECK-NEXT: private clause861 // CHECK-NEXT: ArraySectionExpr{{.*}}862 // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray863 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this864 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1865 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2866 // CHECK-NEXT: WhileStmt867 // CHECK-NEXT: CXXBoolLiteralExpr868 // CHECK-NEXT: NullStmt869 870#pragma acc parallel private(this)871 while(true);872 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel873 // CHECK-NEXT: private clause874 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this875 // CHECK-NEXT: WhileStmt876 // CHECK-NEXT: CXXBoolLiteralExpr877 // CHECK-NEXT: NullStmt878}879 880 template<typename T>881 void bar() {882 // CHECK-NEXT: FunctionTemplateDecl{{.*}} bar883 // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 1 index 0 T884 // CHECK-NEXT: CXXMethodDecl{{.*}} bar 'void ()'885 // CHECK-NEXT: CompoundStmt886 887#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])888 while(true);889 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel890 // CHECK-NEXT: private clause891 // CHECK-NEXT: MemberExpr{{.*}} 'U' lvalue ->ThisMember892 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this893 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'U' lvalue894 // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray895 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this896 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1897 // CHECK-NEXT: WhileStmt898 // CHECK-NEXT: CXXBoolLiteralExpr899 // CHECK-NEXT: NullStmt900 901#pragma acc parallel private(ThisMemberArray[1:2])902 while(true);903 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel904 // CHECK-NEXT: private clause905 // CHECK-NEXT: ArraySectionExpr{{.*}}906 // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray907 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this908 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1909 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2910 // CHECK-NEXT: WhileStmt911 // CHECK-NEXT: CXXBoolLiteralExpr912 // CHECK-NEXT: NullStmt913 914#pragma acc parallel private(this)915 while(true);916 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel917 // CHECK-NEXT: private clause918 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this919 // CHECK-NEXT: WhileStmt920 // CHECK-NEXT: CXXBoolLiteralExpr921 // CHECK-NEXT: NullStmt922}923 924// Instantiation of the class template.925 926// CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}}struct STempl927// CHECK: TemplateArgument type 'int'928// CHECK-NEXT: BuiltinType {{.*}}'int'929// CHECK-NEXT: CXXRecordDecl{{.*}} struct STempl930// CHECK-NEXT: FieldDecl{{.*}}ThisMember 'int'931// CHECK-NEXT: FieldDecl{{.*}} ThisMemberArray 'int[5]'932 933// CHECK-NEXT: CXXMethodDecl{{.*}} foo 'void ()'934// CHECK-NEXT: FunctionTemplateDecl{{.*}}bar935// CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 T936// CHECK-NEXT: CXXMethodDecl{{.*}}bar 'void ()'937// CHECK-NEXT: CXXMethodDecl{{.*}}bar 'void ()'938// CHECK-NEXT: TemplateArgument type 'int'939// CHECK-NEXT: BuiltinType{{.*}} 'int'940// CHECK-NEXT: CompoundStmt941 942//#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])943 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel944 // CHECK-NEXT: private clause945 // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember946 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' implicit this947 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue948 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>949 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray950 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' this951 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1952 // CHECK-NEXT: WhileStmt953 // CHECK-NEXT: CXXBoolLiteralExpr954 // CHECK-NEXT: NullStmt955 956//#pragma acc parallel private(ThisMemberArray[1:2])957 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel958 // CHECK-NEXT: private clause959 // CHECK-NEXT: ArraySectionExpr{{.*}}960 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>961 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray962 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' implicit this963 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1964 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2965 // CHECK-NEXT: WhileStmt966 // CHECK-NEXT: CXXBoolLiteralExpr967 // CHECK-NEXT: NullStmt968 969//#pragma acc parallel private(this)970 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel971 // CHECK-NEXT: private clause972 // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' this973 // CHECK-NEXT: WhileStmt974 // CHECK-NEXT: CXXBoolLiteralExpr975 // CHECK-NEXT: NullStmt976};977 978void Inst() {979 static constexpr unsigned CEVar = 1;980 int i;981 int Arr[5];982 TemplUses<CEVar, int, int[1]>({}, {}, &i);983 984 S s;985 s.bar<int>(&i);986 STempl<int> stempl;987 stempl.bar<int>();988}989#endif990