217 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-cache-var-inside-loop -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 10void use() {11 // CHECK: FunctionDecl{{.*}} use 'void ()'12 // CHECK-NEXT: CompoundStmt13 int Array[5];14 // CHECK-NEXT: DeclStmt15 // CHECK-NEXT: VarDecl{{.*}}Array 'int[5]'16 17#pragma acc loop18 // CHECK-NEXT: OpenACCLoopConstruct19 for (int i = 0; i < 5; ++i) {20 // CHECK-NEXT: ForStmt21 // CHECK-NEXT: DeclStmt22 // CHECK-NEXT: VarDecl{{.*}}i 'int'23 // CHECK-NEXT: IntegerLiteral24 // CHECK-NEXT: <<<NULL>>>25 // CHECK-NEXT: BinaryOperator26 // CHECK-NEXT: ImplicitCastExpr27 // CHECK-NEXT: DeclRefExpr28 // CHECK-NEXT: IntegerLiteral29 // CHECK-NEXT: UnaryOperator30 // CHECK-NEXT: DeclRefExpr31 // CHECK-NEXT: CompoundStmt32#pragma acc cache(Array[1])33 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache34 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue35 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>36 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]'37 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 138_Pragma("acc cache(Array[1])")39 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache40 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue41 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>42 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]'43 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 144#pragma acc cache(Array[1:2])45 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache46 // CHECK-NEXT: ArraySectionExpr{{.*}}'<array section type>' lvalue47 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>48 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]'49 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 150 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 251 52 // No vars here, since they are bad references.53#pragma acc cache (Array[i])54 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache55 }56 57 // No vars here, since they are bad references.58#pragma acc cache(Array[1:2])59 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache60 61 return;62 // CHECK-NEXT: ReturnStmt63}64 65struct S {66 int Array[5];67 int Array2D[5][5];68 69 void StructUse() {70 // CHECK: CXXMethodDecl{{.*}}StructUse 'void ()'71 // CHECK-NEXT: CompoundStmt72#pragma acc loop73 // CHECK-NEXT: OpenACCLoopConstruct74 for (int i = 0; i < 5; ++i) {75 // CHECK-NEXT: ForStmt76 // CHECK-NEXT: DeclStmt77 // CHECK-NEXT: VarDecl{{.*}}i 'int'78 // CHECK-NEXT: IntegerLiteral79 // CHECK-NEXT: <<<NULL>>>80 // CHECK-NEXT: BinaryOperator81 // CHECK-NEXT: ImplicitCastExpr82 // CHECK-NEXT: DeclRefExpr83 // CHECK-NEXT: IntegerLiteral84 // CHECK-NEXT: UnaryOperator85 // CHECK-NEXT: DeclRefExpr86 // CHECK-NEXT: CompoundStmt87#pragma acc cache(Array[1])88 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache89 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue90 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>91 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->Array92 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *'93 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 194#pragma acc cache(Array[1:2])95 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache96 // CHECK-NEXT: ArraySectionExpr{{.*}}'<array section type>' lvalue97 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>98 // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->Array99 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *'100 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1101 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2102#pragma acc cache(Array2D[1][1])103 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache104 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue105 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>106 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int[5]' lvalue107 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)[5]' <ArrayToPointerDecay>108 // CHECK-NEXT: MemberExpr{{.*}} 'int[5][5]' lvalue ->Array2D109 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *'110 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1111 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1112#pragma acc cache(Array2D[1][1:2])113 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache114 // CHECK-NEXT: ArraySectionExpr{{.*}}'<array section type>' lvalue115 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>116 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int[5]' lvalue117 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)[5]' <ArrayToPointerDecay>118 // CHECK-NEXT: MemberExpr{{.*}} 'int[5][5]' lvalue ->Array2D119 // CHECK-NEXT: CXXThisExpr{{.*}} 'S *'120 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1121 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1122 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2123 }124 }125};126 127template<typename T>128void templ_use() {129 // CHECK: FunctionDecl{{.*}} templ_use 'void ()'130 // CHECK-NEXT: CompoundStmt131 T Array[5];132 // CHECK-NEXT: DeclStmt133 // CHECK-NEXT: VarDecl{{.*}}Array 'T[5]'134 135#pragma acc loop136 // CHECK-NEXT: OpenACCLoopConstruct137 for (int i = 0; i < 5; ++i) {138 // CHECK-NEXT: ForStmt139 // CHECK-NEXT: DeclStmt140 // CHECK-NEXT: VarDecl{{.*}}i 'int'141 // CHECK-NEXT: IntegerLiteral142 // CHECK-NEXT: <<<NULL>>>143 // CHECK-NEXT: BinaryOperator144 // CHECK-NEXT: ImplicitCastExpr145 // CHECK-NEXT: DeclRefExpr146 // CHECK-NEXT: IntegerLiteral147 // CHECK-NEXT: UnaryOperator148 // CHECK-NEXT: DeclRefExpr149 // CHECK-NEXT: CompoundStmt150#pragma acc cache(Array[1])151 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache152 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'T' lvalue153 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'T[5]'154 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1155#pragma acc cache(Array[1:2])156 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache157 // CHECK-NEXT: ArraySectionExpr{{.*}}'<dependent type>' lvalue158 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'T[5]'159 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1160 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2161 162 // No vars here, since they are bad references.163#pragma acc cache(Array[i])164 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache165 }166 // No vars here, since they are bad references.167#pragma acc cache(Array[1])168 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache169 170 return;171 // CHECK-NEXT: ReturnStmt172 173 // Instantiation:174 // CHECK: FunctionDecl{{.*}} templ_use 'void ()' implicit_instantiation175 // CHECK-NEXT: TemplateArgument type 'int'176 // CHECK-NEXT: BuiltinType{{.*}} 'int'177 // CHECK-NEXT: CompoundStmt178 // CHECK-NEXT: DeclStmt179 // CHECK-NEXT: VarDecl{{.*}}Array 'int[5]'180 181 // CHECK-NEXT: OpenACCLoopConstruct182 // CHECK-NEXT: ForStmt183 // CHECK-NEXT: DeclStmt184 // CHECK-NEXT: VarDecl{{.*}}i 'int'185 // CHECK-NEXT: IntegerLiteral186 // CHECK-NEXT: <<<NULL>>>187 // CHECK-NEXT: BinaryOperator188 // CHECK-NEXT: ImplicitCastExpr189 // CHECK-NEXT: DeclRefExpr190 // CHECK-NEXT: IntegerLiteral191 // CHECK-NEXT: UnaryOperator192 // CHECK-NEXT: DeclRefExpr193 // CHECK-NEXT: CompoundStmt194 //195 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache196 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue197 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>198 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]'199 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1200 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache201 // CHECK-NEXT: ArraySectionExpr{{.*}}'<array section type>' lvalue202 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' <ArrayToPointerDecay>203 // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]'204 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1205 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2206 207 // No vars here, since they are bad references.208 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache209 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache210 // CHECK-NEXT: ReturnStmt211}212 213void foo() {214 templ_use<int>();215}216#endif217