brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.9 KiB · 2d2b20f Raw
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