245 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 10void NormalFunc() {11 // CHECK-LABEL: NormalFunc12 // CHECK-NEXT: CompoundStmt13 14#pragma acc parallel loop15 for(int i = 0; i < 5;++i);16 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop17 // CHECK-NEXT: ForStmt18 // CHECK-NEXT: DeclStmt19 // CHECK-NEXT: VarDecl{{.*}}i20 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 021 // CHECK-NEXT: <<<NULL>>>22 // CHECK-NEXT: BinaryOperator {{.*}} 'bool' '<'23 // CHECK-NEXT: ImplicitCastExpr24 // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'25 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 526 // CHECK-NEXT: UnaryOperator{{.*}} '++'27 // CHECK-NEXT: DeclRefExpr{{.*}}'i'28 // CHECK-NEXT: NullStmt29 30_Pragma("acc parallel loop")31 for(int i = 0; i < 5;++i);32 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop33 // CHECK-NEXT: ForStmt34 // CHECK-NEXT: DeclStmt35 // CHECK-NEXT: VarDecl{{.*}}i36 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 037 // CHECK-NEXT: <<<NULL>>>38 // CHECK-NEXT: BinaryOperator {{.*}} 'bool' '<'39 // CHECK-NEXT: ImplicitCastExpr40 // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'41 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 542 // CHECK-NEXT: UnaryOperator{{.*}} '++'43 // CHECK-NEXT: DeclRefExpr{{.*}}'i'44 // CHECK-NEXT: NullStmt45 46#pragma acc serial loop47 for(int i = 0; i < 5;++i);48 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop49 // CHECK-NEXT: ForStmt50 // CHECK-NEXT: DeclStmt51 // CHECK-NEXT: VarDecl{{.*}}i52 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 053 // CHECK-NEXT: <<<NULL>>>54 // CHECK-NEXT: BinaryOperator {{.*}} 'bool' '<'55 // CHECK-NEXT: ImplicitCastExpr56 // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'57 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 558 // CHECK-NEXT: UnaryOperator{{.*}} '++'59 // CHECK-NEXT: DeclRefExpr{{.*}}'i'60 // CHECK-NEXT: NullStmt61 62#pragma acc kernels loop63 for(int i = 0; i < 5;++i);64 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop65 // CHECK-NEXT: ForStmt66 // CHECK-NEXT: DeclStmt67 // CHECK-NEXT: VarDecl{{.*}}i68 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 069 // CHECK-NEXT: <<<NULL>>>70 // CHECK-NEXT: BinaryOperator {{.*}} 'bool' '<'71 // CHECK-NEXT: ImplicitCastExpr72 // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'73 // CHECK-NEXT: IntegerLiteral {{.*}}'int' 574 // CHECK-NEXT: UnaryOperator{{.*}} '++'75 // CHECK-NEXT: DeclRefExpr{{.*}}'i'76 // CHECK-NEXT: NullStmt77 78 79 int array[5];80 // CHECK-NEXT: DeclStmt81 // CHECK-NEXT: VarDecl82#pragma acc parallel loop83 for(auto x : array){}84 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop85 // CHECK-NEXT: CXXForRangeStmt86 // CHECK: CompoundStmt87 88#pragma acc parallel89 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel90 // CHECK-NEXT: CompoundStmt91 {92#pragma acc serial loop93 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}}serial loop94 // CHECK-NEXT: CXXForRangeStmt95 // CHECK: CompoundStmt96 for(auto x: array) {97#pragma acc loop98 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: serial loop99 // CHECK-NEXT: CXXForRangeStmt100 // CHECK: CompoundStmt101 for(auto y: array) { }102 }103 }104}105template<typename T>106void TemplFunc() {107 // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc108 // CHECK-NEXT: TemplateTypeParmDecl109 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc110 // CHECK-NEXT: CompoundStmt111 112#pragma acc serial loop113 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}} serial loop114 for(typename T::type t = 0; t < 5;++t) {115 // CHECK-NEXT: ForStmt116 // CHECK-NEXT: DeclStmt117 // CHECK-NEXT: VarDecl{{.*}} referenced t 'typename T::type'118 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0119 // CHECK-NEXT: <<<NULL>>120 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'121 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var122 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5123 // CHECK-NEXT: UnaryOperator{{.*}} '<dependent type>' lvalue prefix '++'124 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var125 // CHECK-NEXT: CompoundStmt126 typename T::type I;127 // CHECK-NEXT: DeclStmt128 // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'129 130 }131 132#pragma acc parallel loop133 for(int a = 0; a < 5; ++a) {134 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}} parallel loop135 // CHECK-NEXT: ForStmt136 // CHECK: CompoundStmt137#pragma acc kernels loop138 for(int b = 0; b < 5; ++b) {139 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}} kernels loop140 // CHECK-NEXT: ForStmt141 // CHECK: CompoundStmt142#pragma acc loop143 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: kernels loop144 // CHECK-NEXT: ForStmt145 // CHECK-NEXT: DeclStmt146 // CHECK-NEXT: VarDecl {{.*}} i 'int'147 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0148 // CHECK-NEXT: <<<NULL>>>149 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'150 // CHECK-NEXT: ImplicitCastExpr151 // CHECK-NEXT: DeclRefExpr152 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5153 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'154 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'155 // CHECK-NEXT: NullStmt156 for(int i = 0; i < 5;++i);157 158#pragma acc loop159 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: kernels loop160 // CHECK-NEXT: ForStmt161 // CHECK-NEXT: DeclStmt162 // CHECK-NEXT: VarDecl {{.*}} i 'int'163 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0164 // CHECK-NEXT: <<<NULL>>>165 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'166 // CHECK-NEXT: ImplicitCastExpr167 // CHECK-NEXT: DeclRefExpr168 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5169 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'170 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'171 // CHECK-NEXT: NullStmt172 for(int i = 0; i < 5;++i);173 }174 }175 176 // Instantiation:177 // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation178 // CHECK-NEXT: TemplateArgument type 'S'179 // CHECK-NEXT: RecordType{{.*}} 'S'180 // CHECK-NEXT: CXXRecord{{.*}} 'S'181 // CHECK-NEXT: CompoundStmt182 183 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}} serial loop184 // CHECK-NEXT: ForStmt185 // CHECK-NEXT: DeclStmt186 // CHECK-NEXT: VarDecl{{.*}} t 'typename S::type':'int'187 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0188 // CHECK-NEXT: <<<NULL>>189 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'190 // CHECK-NEXT: ImplicitCastExpr191 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var192 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5193 // CHECK-NEXT: UnaryOperator{{.*}} 'typename S::type':'int' lvalue prefix '++'194 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var195 // CHECK-NEXT: CompoundStmt196 // CHECK-NEXT: DeclStmt197 // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'198 199 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}} parallel loop200 // CHECK-NEXT: ForStmt201 // CHECK: CompoundStmt202 203 // CHECK-NEXT: OpenACCCombinedConstruct {{.*}} kernels loop204 // CHECK-NEXT: ForStmt205 // CHECK: CompoundStmt206 207 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: kernels loop208 // CHECK-NEXT: ForStmt209 // CHECK-NEXT: DeclStmt210 // CHECK-NEXT: VarDecl {{.*}} i 'int'211 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0212 // CHECK-NEXT: <<<NULL>>>213 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'214 // CHECK-NEXT: ImplicitCastExpr215 // CHECK-NEXT: DeclRefExpr216 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5217 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'218 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'219 // CHECK-NEXT: NullStmt220 221 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: kernels loop222 // CHECK-NEXT: ForStmt223 // CHECK-NEXT: DeclStmt224 // CHECK-NEXT: VarDecl {{.*}} i 'int'225 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0226 // CHECK-NEXT: <<<NULL>>>227 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'228 // CHECK-NEXT: ImplicitCastExpr229 // CHECK-NEXT: DeclRefExpr230 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5231 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'232 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'233 // CHECK-NEXT: NullStmt234 235}236 237struct S {238 using type = int;239};240 241void use() {242 TemplFunc<S>();243}244#endif245