408 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 *Global;11// CHECK: VarDecl{{.*}}Global 'int *'12int GlobalArray[5];13// CHECK-NEXT: VarDecl{{.*}}GlobalArray 'int[5]'14#pragma acc declare deviceptr(Global), copyin(readonly, always: GlobalArray)15// CHECK-NEXT: OpenACCDeclareDecl16// CHECK-NEXT: deviceptr clause17// CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int *'18// CHECK-NEXT: copyin clause modifiers: always, readonly19// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'int[5]'20 21int *Global1;22// CHECK-NEXT: VarDecl{{.*}}Global1 'int *'23int GlobalArray1[5];24// CHECK-NEXT: VarDecl{{.*}}GlobalArray1 'int[5]'25_Pragma("acc declare deviceptr(Global1), copyin(GlobalArray1)")26// CHECK-NEXT: OpenACCDeclareDecl27// CHECK-NEXT: deviceptr clause28// CHECK-NEXT: DeclRefExpr{{.*}}'Global1' 'int *'29// CHECK-NEXT: copyin clause30// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray1' 'int[5]'31 32int *Global2;33// CHECK: VarDecl{{.*}}Global2 'int *'34int GlobalArray2[5];35// CHECK-NEXT: VarDecl{{.*}}GlobalArray2 'int[5]'36#pragma acc declare create(Global2, GlobalArray2)37// CHECK-NEXT: OpenACCDeclareDecl38// CHECK-NEXT: create clause39// CHECK-NEXT: DeclRefExpr{{.*}}'Global2' 'int *'40// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray2' 'int[5]'41 42int Global3;43// CHECK: VarDecl{{.*}}Global3 'int'44int GlobalArray3[5];45// CHECK-NEXT: VarDecl{{.*}}GlobalArray3 'int[5]'46#pragma acc declare link(Global3) device_resident(GlobalArray3)47// CHECK-NEXT: OpenACCDeclareDecl48// CHECK-NEXT: link clause49// CHECK-NEXT: DeclRefExpr{{.*}}'Global3' 'int'50// CHECK-NEXT: device_resident clause51// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray3' 'int[5]'52int GlobalArray4[5];53// CHECK-NEXT: VarDecl{{.*}}GlobalArray4 'int[5]'54#pragma acc declare link(GlobalArray4[1:1])55// CHECK-NEXT: OpenACCDeclareDecl56// CHECK-NEXT: link clause57// CHECK-NEXT: ArraySectionExpr58 59namespace NS {60int NSVar;61// CHECK: VarDecl{{.*}}NSVar 'int'62int NSArray[5];63// CHECK-NEXT: VarDecl{{.*}}NSArray 'int[5]'64#pragma acc declare create(NSVar, NSArray)65// CHECK-NEXT: OpenACCDeclareDecl66// CHECK-NEXT: create clause67// CHECK-NEXT: DeclRefExpr{{.*}}'NSVar' 'int'68// CHECK-NEXT: DeclRefExpr{{.*}}'NSArray' 'int[5]'69}70 71struct Struct {72 // CHECK-NEXT: CXXRecordDecl{{.*}} Struct definition73 // Skip DefinitionData and go right to the definition.74 // CHECK: CXXRecordDecl{{.*}} implicit struct Struct75 static const int StaticMem = 5;76 // CHECK-NEXT: VarDecl {{.*}} StaticMem 'const int' static cinit77 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 578 static const int StaticMem2 = 5;79 // CHECK-NEXT: VarDecl {{.*}} StaticMem2 'const int' static cinit80 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 581 static const int StaticMemArray[5];82 // CHECK-NEXT: VarDecl {{.*}} StaticMemArray 'const int[5]' static83 static const int StaticMemArray2[5];84 // CHECK-NEXT: VarDecl {{.*}} StaticMemArray2 'const int[5]' static85#pragma acc declare copyin(StaticMem, StaticMemArray) create(StaticMem2, StaticMemArray2)86 // CHECK-NEXT: OpenACCDeclareDecl87 // CHECK-NEXT: copyin clause88 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem' 'const int'89 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray' 'const int[5]'90 // CHECK-NEXT: create clause91 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem2' 'const int'92 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray2' 'const int[5]'93 94 void MemFunc1(int Arg) {95 // CHECK-NEXT: CXXMethodDecl{{.*}}MemFunc1 'void (int)'96 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'97 // CHECK-NEXT: CompoundStmt98 int Local;99 // CHECK-NEXT: DeclStmt100 // CHECK-NEXT: VarDecl{{.*}} Local 'int'101 int LocalArray[5];102 // CHECK-NEXT: DeclStmt103 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'104#pragma acc declare present(Arg, Local, LocalArray)105 // CHECK-NEXT: DeclStmt106 // CHECK-NEXT: OpenACCDeclareDecl107 // CHECK-NEXT: present clause108 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'109 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'110 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'111 }112 void MemFunc2(int Arg);113 // CHECK: CXXMethodDecl{{.*}}MemFunc2114};115void Struct::MemFunc2(int Arg) {116 // CHECK: CXXMethodDecl{{.*}}MemFunc2 'void (int)'117 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'118 // CHECK-NEXT: CompoundStmt119 int Local;120 // CHECK-NEXT: DeclStmt121 // CHECK-NEXT: VarDecl{{.*}} Local 'int'122 int LocalArray[5];123 // CHECK-NEXT: DeclStmt124 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'125#pragma acc declare present(Arg, Local, LocalArray)126 // CHECK-NEXT: DeclStmt127 // CHECK-NEXT: OpenACCDeclareDecl128 // CHECK-NEXT: present clause129 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'130 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'131 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'132}133 134void NormalFunc(int Arg) {135 // CHECK-NEXT: FunctionDecl{{.*}}NormalFunc 'void (int)'136 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'137 // CHECK-NEXT: CompoundStmt138 int Local;139 // CHECK-NEXT: DeclStmt140 // CHECK-NEXT: VarDecl{{.*}} Local 'int'141 int LocalArray[5];142 // CHECK-NEXT: DeclStmt143 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'144#pragma acc declare present(Arg, Local, LocalArray)145 // CHECK-NEXT: DeclStmt146 // CHECK-NEXT: OpenACCDeclareDecl147 // CHECK-NEXT: present clause148 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'149 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'150 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'151}152 153template<typename T>154struct DependentStruct {155 // CHECK: ClassTemplateDecl{{.*}}DependentStruct156 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 T157 // CHECK-NEXT: CXXRecordDecl{{.*}}DependentStruct definition158 // CHECK: CXXRecordDecl{{.*}}implicit struct DependentStruct159 static const T StaticMem = 5;160 // CHECK-NEXT: VarDecl{{.*}} StaticMem 'const T' static cinit161 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 5162 static const T StaticMem2 = 5;163 // CHECK-NEXT: VarDecl{{.*}} StaticMem2 'const T' static cinit164 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 5165 static constexpr T StaticMemArray[5] = {};166 // CHECK-NEXT: VarDecl{{.*}} StaticMemArray 'const T[5]'167 // CHECK-NEXT: InitListExpr{{.*}}'void'168 static constexpr T StaticMemArray2[5] = {};169 // CHECK-NEXT: VarDecl{{.*}} StaticMemArray2 'const T[5]'170 // CHECK-NEXT: InitListExpr{{.*}}'void'171#pragma acc declare copyin(StaticMem, StaticMemArray) create(zero: StaticMem2, StaticMemArray2)172 // CHECK-NEXT: OpenACCDeclareDecl173 // CHECK-NEXT: copyin clause174 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem' 'const T'175 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray' 'const T[5]'176 // CHECK-NEXT: create clause modifiers: zero177 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem2' 'const T'178 // CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray2' 'const T[5]'179 180 template<typename U>181 void DepMemFunc1(U Arg, U Arg2) {182 // CHECK-NEXT: FunctionTemplateDecl{{.*}}DepMemFunc1183 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 1 index 0 U184 // CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc1 'void (U, U)'185 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'186 // CHECK-NEXT: ParmVarDecl{{.*}} Arg2 'U'187 // CHECK-NEXT: CompoundStmt188 T Local, Local2;189 // CHECK-NEXT: DeclStmt190 // CHECK-NEXT: VarDecl{{.*}} Local 'T'191 // CHECK-NEXT: VarDecl{{.*}} Local2 'T'192 U LocalArray[5];193 // CHECK-NEXT: DeclStmt194 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'U[5]'195 U LocalArray2[5];196 // CHECK-NEXT: DeclStmt197 // CHECK-NEXT: VarDecl{{.*}} LocalArray2 'U[5]'198#pragma acc declare copy(always, alwaysin: Arg, Local, LocalArray) copyout(zero: Arg2, Local2, LocalArray2)199 // CHECK-NEXT: DeclStmt200 // CHECK-NEXT: OpenACCDeclareDecl201 // CHECK-NEXT: copy clause modifiers: always, alwaysin202 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'U'203 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'T'204 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'U[5]'205 // CHECK-NEXT: copyout clause modifiers: zero206 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg2' 'U'207 // CHECK-NEXT: DeclRefExpr{{.*}}'Local2' 'T'208 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray2' 'U[5]'209 210 extern T Local3;211 // CHECK-NEXT: DeclStmt212 // CHECK-NEXT: VarDecl{{.*}} Local3 'T' extern213 T Local4;214 // CHECK-NEXT: DeclStmt215 // CHECK-NEXT: VarDecl{{.*}} Local4 'T'216#pragma acc declare link(Local3) device_resident(Local4)217 // CHECK-NEXT: DeclStmt218 // CHECK-NEXT: OpenACCDeclareDecl219 // CHECK-NEXT: link clause220 // CHECK-NEXT: DeclRefExpr{{.*}}'Local3' 'T'221 // CHECK-NEXT: device_resident clause222 // CHECK-NEXT: DeclRefExpr{{.*}}'Local4' 'T'223 }224 template<typename U>225 void DepMemFunc2(U Arg);226 // CHECK-NEXT: FunctionTemplateDecl{{.*}}DepMemFunc2227 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 1 index 0 U228 // CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (U)'229 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'230};231 232// Instantiation of class.233// CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}}DependentStruct definition234// CHECK: TemplateArgument type 'int'235// CHECK-NEXT: BuiltinType{{.*}}'int'236// CHECK-NEXT: CXXRecordDecl{{.*}} struct DependentStruct237 238// CHECK-NEXT: VarDecl{{.*}} StaticMem 'const int' 239// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5240 241// CHECK-NEXT: VarDecl{{.*}} StaticMem2 'const int' 242// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5243//244// CHECK-NEXT: VarDecl{{.*}} StaticMemArray 'const int[5]'245// CHECK-NEXT: value: Array size=5246// CHECK-NEXT: filler: 5 x Int 0247// CHECK-NEXT: InitListExpr{{.*}} 'const int[5]'248// CHECK-NEXT: array_filler249 250// CHECK-NEXT: VarDecl{{.*}} StaticMemArray2 'const int[5]'251// CHECK-NEXT: value: Array size=5252// CHECK-NEXT: filler: 5 x Int 0253// CHECK-NEXT: InitListExpr{{.*}} 'const int[5]'254// CHECK-NEXT: array_filler255 256// CHECK-NEXT: OpenACCDeclareDecl257// CHECK-NEXT: copyin clause258// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem' 'const int'259// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray' 'const int[5]'260// CHECK-NEXT: create clause modifiers: zero261// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem2' 'const int'262// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray2' 'const int[5]'263 264// CHECK-NEXT: FunctionTemplateDecl{{.*}} DepMemFunc1265// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 U266// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc1 'void (U, U)'267// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'268// CHECK-NEXT: ParmVarDecl{{.*}} Arg2 'U'269// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc1 'void (float, float)'270// CHECK-NEXT: TemplateArgument type 'float'271// CHECK-NEXT: BuiltinType{{.*}}'float'272// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'float'273// CHECK-NEXT: ParmVarDecl{{.*}} Arg2 'float'274// CHECK-NEXT: CompoundStmt275 276// CHECK-NEXT: DeclStmt277// CHECK-NEXT: VarDecl{{.*}} Local 'int'278// CHECK-NEXT: VarDecl{{.*}} Local2 'int'279 280// CHECK-NEXT: DeclStmt281// CHECK-NEXT: VarDecl{{.*}} LocalArray 'float[5]'282 283// CHECK-NEXT: DeclStmt284// CHECK-NEXT: VarDecl{{.*}} LocalArray2 'float[5]'285 286// CHECK-NEXT: DeclStmt287// CHECK-NEXT: OpenACCDeclareDecl288// CHECK-NEXT: copy clause modifiers: always, alwaysin289// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'float'290// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'291// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'float[5]'292// CHECK-NEXT: copyout clause modifiers: zero293// CHECK-NEXT: DeclRefExpr{{.*}}'Arg2' 'float'294// CHECK-NEXT: DeclRefExpr{{.*}}'Local2' 'int'295// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray2' 'float[5]'296 297// CHECK-NEXT: DeclStmt298// CHECK-NEXT: VarDecl{{.*}} Local3 'int' extern299// CHECK-NEXT: DeclStmt300// CHECK-NEXT: VarDecl{{.*}} Local4 'int'301// CHECK-NEXT: DeclStmt302// CHECK-NEXT: OpenACCDeclareDecl303// CHECK-NEXT: link clause304// CHECK-NEXT: DeclRefExpr{{.*}}'Local3' 'int'305// CHECK-NEXT: device_resident clause306// CHECK-NEXT: DeclRefExpr{{.*}}'Local4' 'int'307 308// CHECK-NEXT: FunctionTemplateDecl{{.*}}DepMemFunc2309// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 U310// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (U)'311// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'312// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (float)'313// CHECK-NEXT: TemplateArgument type 'float'314// CHECK-NEXT: BuiltinType{{.*}}'float'315// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'float'316// CHECK-NEXT: CompoundStmt317 318// CHECK-NEXT: DeclStmt319// CHECK-NEXT: VarDecl{{.*}} Local 'int'320 321// CHECK-NEXT: DeclStmt322// CHECK-NEXT: VarDecl{{.*}} LocalArray 'float[5]'323 324// CHECK-NEXT: DeclStmt325// CHECK-NEXT: OpenACCDeclareDecl326// CHECK-NEXT: present clause327// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'float'328// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'329// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'float[5]'330 331template<typename T>332template<typename U>333void DependentStruct<T>::DepMemFunc2(U Arg) {334 // CHECK: FunctionTemplateDecl{{.*}} DepMemFunc2335 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 1 index 0 U336 // CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (U)'337 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'338 // CHECK-NEXT: CompoundStmt339 T Local;340 // CHECK-NEXT: DeclStmt341 // CHECK-NEXT: VarDecl{{.*}} Local 'T'342 U LocalArray[5];343 // CHECK-NEXT: DeclStmt344 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'U[5]'345#pragma acc declare present(Arg, Local, LocalArray)346 // CHECK-NEXT: DeclStmt347 // CHECK-NEXT: OpenACCDeclareDecl348 // CHECK-NEXT: present clause349 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'U'350 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'T'351 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'U[5]'352}353 354template<typename T, unsigned Size>355void DependentFunc(T Arg) {356 // CHECK: FunctionTemplateDecl{{.*}} DependentFunc357 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 T358 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} depth 0 index 1 Size359 // CHECK-NEXT: FunctionDecl{{.*}}DependentFunc 'void (T)'360 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'T'361 // CHECK-NEXT: CompoundStmt362 T Local;363 // CHECK-NEXT: DeclStmt364 // CHECK-NEXT: VarDecl{{.*}} Local 'T'365 T LocalArray[Size];366 // CHECK-NEXT: DeclStmt367 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'T[Size]'368 369#pragma acc declare present(Arg, Local, LocalArray)370 // CHECK-NEXT: DeclStmt371 // CHECK-NEXT: OpenACCDeclareDecl372 // CHECK-NEXT: present clause373 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'T'374 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'T'375 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'T[Size]'376 377 // Instantiation:378 // CHECK-NEXT: FunctionDecl{{.*}} DependentFunc 'void (int)'379 // CHECK-NEXT: TemplateArgument type 'int'380 // CHECK-NEXT: BuiltinType{{.*}}'int'381 // CHECK-NEXT: TemplateArgument integral '5U'382 // CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'383 // CHECK-NEXT: CompoundStmt384 385 // CHECK-NEXT: DeclStmt386 // CHECK-NEXT: VarDecl{{.*}} Local 'int'387 388 // CHECK-NEXT: DeclStmt389 // CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'390 391 // CHECK-NEXT: DeclStmt392 // CHECK-NEXT: OpenACCDeclareDecl393 // CHECK-NEXT: present clause394 // CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'395 // CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'396 // CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'397}398 399void use() {400 float i;401 DependentStruct<int> S;402 S.DepMemFunc1(i, i);403 S.DepMemFunc2(i);404 DependentFunc<int, 5>(i);405}406 407#endif // PCH_HELPER408