1 2 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s 3 4 // Test this with PCH. 5 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s 6 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s 7 8 #ifndef PCH_HELPER 9 #define PCH_HELPER 10 11 void NormalFunc() { 12 // CHECK-LABEL: NormalFunc 13 // CHECK-NEXT: CompoundStmt 14 15 #pragma acc loop 16 for(int i = 0; i < 5;++i); 17 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 18 // CHECK-NEXT: ForStmt 19 // CHECK-NEXT: DeclStmt 20 // CHECK-NEXT: VarDecl {{.*}} used i 'int' 21 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 22 // CHECK-NEXT: <<<NULL>> 23 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 24 // CHECK-NEXT: ImplicitCastExpr 25 // CHECK-NEXT: DeclRefExpr 26 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 27 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 28 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 29 // CHECK-NEXT: NullStmt 30 31 int array[5]; 32 // CHECK-NEXT: DeclStmt 33 // CHECK-NEXT: VarDecl 34 #pragma acc loop 35 for(auto x : array){} 36 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 37 // CHECK-NEXT: CXXForRangeStmt 38 // CHECK: CompoundStmt 39 40 #pragma acc parallel 41 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 42 // CHECK-NEXT: CompoundStmt 43 { 44 #pragma acc parallel 45 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 46 // CHECK-NEXT: CompoundStmt 47 { 48 #pragma acc loop 49 for(int i = 0; i < 5;++i); 50 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 51 // CHECK-NEXT: ForStmt 52 // CHECK-NEXT: DeclStmt 53 // CHECK-NEXT: VarDecl {{.*}} used i 'int' 54 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 55 // CHECK-NEXT: <<<NULL>>> 56 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 57 // CHECK-NEXT: ImplicitCastExpr 58 // CHECK-NEXT: DeclRefExpr 59 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 60 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 61 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 62 // CHECK-NEXT: NullStmt 63 } 64 } 65 } 66 67 template<typename T> 68 void TemplFunc() { 69 // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc 70 // CHECK-NEXT: TemplateTypeParmDecl 71 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc 72 // CHECK-NEXT: CompoundStmt 73 74 #pragma acc loop 75 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 76 for(typename T::type t = 0; t < 5;++t) { 77 // CHECK-NEXT: ForStmt 78 // CHECK-NEXT: DeclStmt 79 // CHECK-NEXT: VarDecl{{.*}} referenced t 'typename T::type' 80 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 81 // CHECK-NEXT: <<<NULL>> 82 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<' 83 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var 84 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 85 // CHECK-NEXT: UnaryOperator{{.*}} '<dependent type>' lvalue prefix '++' 86 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var 87 // CHECK-NEXT: CompoundStmt 88 typename T::type I; 89 // CHECK-NEXT: DeclStmt 90 // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type' 91 92 } 93 94 #pragma acc serial 95 { 96 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 97 // CHECK-NEXT: CompoundStmt 98 #pragma acc parallel 99 { 100 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 101 // CHECK-NEXT: CompoundStmt 102 #pragma acc loop 103 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 104 // CHECK-NEXT: ForStmt 105 // CHECK-NEXT: DeclStmt 106 // CHECK-NEXT: VarDecl {{.*}} i 'int' 107 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 108 // CHECK-NEXT: <<<NULL>>> 109 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 110 // CHECK-NEXT: ImplicitCastExpr 111 // CHECK-NEXT: DeclRefExpr 112 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 113 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 114 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 115 // CHECK-NEXT: NullStmt 116 for(int i = 0; i < 5;++i); 117 118 #pragma acc loop 119 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 120 // CHECK-NEXT: ForStmt 121 // CHECK-NEXT: DeclStmt 122 // CHECK-NEXT: VarDecl {{.*}} i 'int' 123 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 124 // CHECK-NEXT: <<<NULL>>> 125 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 126 // CHECK-NEXT: ImplicitCastExpr 127 // CHECK-NEXT: DeclRefExpr 128 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 129 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 130 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 131 // CHECK-NEXT: NullStmt 132 for(int i = 0; i < 5;++i); 133 } 134 } 135 136 typename T::type array[5]; 137 // CHECK-NEXT: DeclStmt 138 // CHECK-NEXT: VarDecl 139 140 #pragma acc loop 141 for(auto x : array){} 142 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 143 // CHECK-NEXT: CXXForRangeStmt 144 // CHECK: CompoundStmt 145 146 // Instantiation: 147 // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation 148 // CHECK-NEXT: TemplateArgument type 'S' 149 // CHECK-NEXT: RecordType{{.*}} 'S' 150 // CHECK-NEXT: CXXRecord{{.*}} 'S' 151 // CHECK-NEXT: CompoundStmt 152 153 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 154 // CHECK-NEXT: ForStmt 155 // CHECK-NEXT: DeclStmt 156 // CHECK-NEXT: VarDecl{{.*}} used t 'typename S::type':'int' 157 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 158 // CHECK-NEXT: <<<NULL>> 159 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' 160 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'typename S::type':'int' <LValueToRValue> 161 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var 162 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 163 // CHECK-NEXT: UnaryOperator{{.*}} 'typename S::type':'int' lvalue prefix '++' 164 // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var 165 // CHECK-NEXT: CompoundStmt 166 // CHECK-NEXT: DeclStmt 167 // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int' 168 169 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 170 // CHECK-NEXT: CompoundStmt 171 // 172 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 173 // CHECK-NEXT: CompoundStmt 174 175 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 176 // CHECK-NEXT: ForStmt 177 // CHECK-NEXT: DeclStmt 178 // CHECK-NEXT: VarDecl {{.*}} i 'int' 179 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 180 // CHECK-NEXT: <<<NULL>>> 181 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 182 // CHECK-NEXT: ImplicitCastExpr 183 // CHECK-NEXT: DeclRefExpr 184 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 185 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 186 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 187 // CHECK-NEXT: NullStmt 188 189 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 190 // CHECK-NEXT: ForStmt 191 // CHECK-NEXT: DeclStmt 192 // CHECK-NEXT: VarDecl {{.*}} i 'int' 193 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 194 // CHECK-NEXT: <<<NULL>>> 195 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 196 // CHECK-NEXT: ImplicitCastExpr 197 // CHECK-NEXT: DeclRefExpr 198 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 199 // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 200 // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 201 // CHECK-NEXT: NullStmt 202 203 // CHECK-NEXT: DeclStmt 204 // CHECK-NEXT: VarDecl 205 // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 206 // CHECK-NEXT: CXXForRangeStmt 207 // CHECK: CompoundStmt 208 } 209 210 struct S { 211 using type = int; 212 }; 213 214 void use() { 215 TemplFunc<S>(); 216 } 217 #endif 218 219