235 lines · cpp
1 2// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s3 4// Test this with PCH.5// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s6// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s7 8#ifndef PCH_HELPER9#define PCH_HELPER10 11void NormalFunc() {12 // CHECK-LABEL: NormalFunc13 // CHECK-NEXT: CompoundStmt14 15#pragma acc loop16 for(int i = 0; i < 5;++i);17 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>18 // CHECK-NEXT: ForStmt19 // CHECK-NEXT: DeclStmt20 // CHECK-NEXT: VarDecl {{.*}} used i 'int'21 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 022 // CHECK-NEXT: <<<NULL>>23 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'24 // CHECK-NEXT: ImplicitCastExpr25 // CHECK-NEXT: DeclRefExpr26 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 527 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'28 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'29 // CHECK-NEXT: NullStmt30 31_Pragma("acc loop")32 for(int i = 0; i < 5;++i);33 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>34 // CHECK-NEXT: ForStmt35 // CHECK-NEXT: DeclStmt36 // CHECK-NEXT: VarDecl {{.*}} used i 'int'37 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 038 // CHECK-NEXT: <<<NULL>>39 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'40 // CHECK-NEXT: ImplicitCastExpr41 // CHECK-NEXT: DeclRefExpr42 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 543 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'44 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'45 // CHECK-NEXT: NullStmt46 47 int array[5];48 // CHECK-NEXT: DeclStmt49 // CHECK-NEXT: VarDecl50#pragma acc loop51 for(auto x : array){}52 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>53 // CHECK-NEXT: CXXForRangeStmt54 // CHECK: CompoundStmt55 56#pragma acc parallel57 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel58 // CHECK-NEXT: CompoundStmt59 {60#pragma acc parallel61 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel62 // CHECK-NEXT: CompoundStmt63 {64#pragma acc loop65 for(int i = 0; i < 5;++i);66 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel67 // CHECK-NEXT: ForStmt68 // CHECK-NEXT: DeclStmt69 // CHECK-NEXT: VarDecl {{.*}} used i 'int'70 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 071 // CHECK-NEXT: <<<NULL>>>72 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'73 // CHECK-NEXT: ImplicitCastExpr74 // CHECK-NEXT: DeclRefExpr75 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 576 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'77 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'78 // CHECK-NEXT: NullStmt79 }80 }81}82 83template<typename T>84void TemplFunc() {85 // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc86 // CHECK-NEXT: TemplateTypeParmDecl87 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc88 // CHECK-NEXT: CompoundStmt89 90#pragma acc loop91 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>92 for(typename T::type t = 0; t < 5;++t) {93 // CHECK-NEXT: ForStmt94 // CHECK-NEXT: DeclStmt95 // CHECK-NEXT: VarDecl{{.*}} referenced t 'typename T::type'96 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 097 // CHECK-NEXT: <<<NULL>>98 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'99 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var100 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5101 // CHECK-NEXT: UnaryOperator{{.*}} '<dependent type>' lvalue prefix '++'102 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var103 // CHECK-NEXT: CompoundStmt104 typename T::type I;105 // CHECK-NEXT: DeclStmt106 // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'107 108 }109 110#pragma acc serial111 {112 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial113 // CHECK-NEXT: CompoundStmt114#pragma acc parallel115 {116 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel117 // CHECK-NEXT: CompoundStmt118#pragma acc loop119 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel120 // CHECK-NEXT: ForStmt121 // CHECK-NEXT: DeclStmt122 // CHECK-NEXT: VarDecl {{.*}} i 'int'123 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0124 // CHECK-NEXT: <<<NULL>>>125 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'126 // CHECK-NEXT: ImplicitCastExpr127 // CHECK-NEXT: DeclRefExpr128 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5129 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'130 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'131 // CHECK-NEXT: NullStmt132 for(int i = 0; i < 5;++i);133 134#pragma acc loop135 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel136 // CHECK-NEXT: ForStmt137 // CHECK-NEXT: DeclStmt138 // CHECK-NEXT: VarDecl {{.*}} i 'int'139 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0140 // CHECK-NEXT: <<<NULL>>>141 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'142 // CHECK-NEXT: ImplicitCastExpr143 // CHECK-NEXT: DeclRefExpr144 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5145 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'146 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'147 // CHECK-NEXT: NullStmt148 for(int i = 0; i < 5;++i);149 }150 }151 152 typename T::type array[5];153 // CHECK-NEXT: DeclStmt154 // CHECK-NEXT: VarDecl155 156#pragma acc loop157 for(auto x : array){}158 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>159 // CHECK-NEXT: CXXForRangeStmt160 // CHECK: CompoundStmt161 162 // Instantiation:163 // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation164 // CHECK-NEXT: TemplateArgument type 'S'165 // CHECK-NEXT: RecordType{{.*}} 'S'166 // CHECK-NEXT: CXXRecord{{.*}} 'S'167 // CHECK-NEXT: CompoundStmt168 169 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>170 // CHECK-NEXT: ForStmt171 // CHECK-NEXT: DeclStmt172 // CHECK-NEXT: VarDecl{{.*}} used t 'typename S::type':'int'173 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0174 // CHECK-NEXT: <<<NULL>>175 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'176 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'typename S::type':'int' <LValueToRValue>177 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var178 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5179 // CHECK-NEXT: UnaryOperator{{.*}} 'typename S::type':'int' lvalue prefix '++'180 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var181 // CHECK-NEXT: CompoundStmt182 // CHECK-NEXT: DeclStmt183 // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'184 185 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial186 // CHECK-NEXT: CompoundStmt187 //188 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel189 // CHECK-NEXT: CompoundStmt190 191 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel192 // CHECK-NEXT: ForStmt193 // CHECK-NEXT: DeclStmt194 // CHECK-NEXT: VarDecl {{.*}} i 'int'195 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0196 // CHECK-NEXT: <<<NULL>>>197 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'198 // CHECK-NEXT: ImplicitCastExpr199 // CHECK-NEXT: DeclRefExpr200 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5201 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'202 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'203 // CHECK-NEXT: NullStmt204 205 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel206 // CHECK-NEXT: ForStmt207 // CHECK-NEXT: DeclStmt208 // CHECK-NEXT: VarDecl {{.*}} i 'int'209 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0210 // CHECK-NEXT: <<<NULL>>>211 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'212 // CHECK-NEXT: ImplicitCastExpr213 // CHECK-NEXT: DeclRefExpr214 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5215 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'216 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'217 // CHECK-NEXT: NullStmt218 219 // CHECK-NEXT: DeclStmt220 // CHECK-NEXT: VarDecl221 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>222 // CHECK-NEXT: CXXForRangeStmt223 // CHECK: CompoundStmt224}225 226struct S {227 using type = int;228};229 230void use() {231 TemplFunc<S>();232}233#endif234 235