1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s 2 3 // Test this with PCH. 4 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s 5 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s 6 7 #ifndef PCH_HELPER 8 #define PCH_HELPER 9 void NormalFunc(int i, float f) { 10 // CHECK: FunctionDecl{{.*}}NormalFunc 11 // CHECK-NEXT: ParmVarDecl 12 // CHECK-NEXT: ParmVarDecl 13 // CHECK-NEXT: CompoundStmt 14 #pragma acc parallel default(none) 15 while(true); 16 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 17 // CHECK-NEXT: default(none) 18 // CHECK-NEXT: WhileStmt 19 // CHECK-NEXT: CXXBoolLiteralExpr 20 // CHECK-NEXT: NullStmt 21 22 #pragma acc serial default(present) 23 while(true); 24 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 25 // CHECK-NEXT: default(present) 26 // CHECK-NEXT: WhileStmt 27 // CHECK-NEXT: CXXBoolLiteralExpr 28 // CHECK-NEXT: NullStmt 29 30 #pragma acc kernels if( i < f) 31 while(true); 32 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 33 // CHECK-NEXT: if clause 34 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' 35 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating> 36 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue> 37 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 38 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue> 39 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 40 // CHECK-NEXT: WhileStmt 41 // CHECK-NEXT: CXXBoolLiteralExpr 42 // CHECK-NEXT: NullStmt 43 44 #pragma acc parallel reduction(+: i) 45 while(true); 46 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 47 // CHECK-NEXT: reduction clause Operator: + 48 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 49 // CHECK-NEXT: WhileStmt 50 // CHECK-NEXT: CXXBoolLiteralExpr 51 // CHECK-NEXT: NullStmt 52 53 #pragma acc serial reduction(*: f) 54 while(true); 55 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 56 // CHECK-NEXT: reduction clause Operator: * 57 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 58 // CHECK-NEXT: WhileStmt 59 // CHECK-NEXT: CXXBoolLiteralExpr 60 // CHECK-NEXT: NullStmt 61 62 #pragma acc parallel reduction(max: i) 63 while(true); 64 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 65 // CHECK-NEXT: reduction clause Operator: max 66 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 67 // CHECK-NEXT: WhileStmt 68 // CHECK-NEXT: CXXBoolLiteralExpr 69 // CHECK-NEXT: NullStmt 70 71 #pragma acc serial reduction(min: f) 72 while(true); 73 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 74 // CHECK-NEXT: reduction clause Operator: min 75 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 76 // CHECK-NEXT: WhileStmt 77 // CHECK-NEXT: CXXBoolLiteralExpr 78 // CHECK-NEXT: NullStmt 79 80 #pragma acc parallel reduction(&: i) 81 while(true); 82 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 83 // CHECK-NEXT: reduction clause Operator: & 84 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 85 // CHECK-NEXT: WhileStmt 86 // CHECK-NEXT: CXXBoolLiteralExpr 87 // CHECK-NEXT: NullStmt 88 89 #pragma acc serial reduction(|: f) 90 while(true); 91 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 92 // CHECK-NEXT: reduction clause Operator: | 93 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 94 // CHECK-NEXT: WhileStmt 95 // CHECK-NEXT: CXXBoolLiteralExpr 96 // CHECK-NEXT: NullStmt 97 98 99 #pragma acc parallel reduction(^: i) 100 while(true); 101 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 102 // CHECK-NEXT: reduction clause Operator: ^ 103 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 104 // CHECK-NEXT: WhileStmt 105 // CHECK-NEXT: CXXBoolLiteralExpr 106 // CHECK-NEXT: NullStmt 107 108 #pragma acc serial reduction(&&: f) 109 while(true); 110 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 111 // CHECK-NEXT: reduction clause Operator: && 112 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 113 // CHECK-NEXT: WhileStmt 114 // CHECK-NEXT: CXXBoolLiteralExpr 115 // CHECK-NEXT: NullStmt 116 117 118 #pragma acc parallel reduction(||: i) 119 while(true); 120 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 121 // CHECK-NEXT: reduction clause Operator: || 122 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 123 // CHECK-NEXT: WhileStmt 124 // CHECK-NEXT: CXXBoolLiteralExpr 125 // CHECK-NEXT: NullStmt 126 } 127 128 template<typename T> 129 void TemplFunc() { 130 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc 131 // CHECK-NEXT: TemplateTypeParmDecl 132 133 // Match the prototype: 134 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc 135 // CHECK-NEXT: CompoundStmt 136 137 #pragma acc kernels default(none) 138 while(true); 139 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 140 // CHECK-NEXT: default(none) 141 // CHECK-NEXT: WhileStmt 142 // CHECK-NEXT: CXXBoolLiteralExpr 143 // CHECK-NEXT: NullStmt 144 145 #pragma acc parallel default(present) 146 while(true); 147 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 148 // CHECK-NEXT: default(present) 149 // CHECK-NEXT: WhileStmt 150 // CHECK-NEXT: CXXBoolLiteralExpr 151 // CHECK-NEXT: NullStmt 152 153 #pragma acc parallel if(T::SomeFloat < typename T::IntTy{}) 154 while(true); 155 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 156 // CHECK-NEXT: if clause 157 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<' 158 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 159 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 160 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy' 161 // CHECK-NEXT: InitListExpr{{.*}} 'void' 162 // CHECK-NEXT: WhileStmt 163 // CHECK-NEXT: CXXBoolLiteralExpr 164 // CHECK-NEXT: NullStmt 165 166 #pragma acc serial if(typename T::IntTy{}) 167 while(true); 168 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 169 // CHECK-NEXT: if clause 170 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy' 171 // CHECK-NEXT: InitListExpr{{.*}} 'void' 172 // CHECK-NEXT: WhileStmt 173 // CHECK-NEXT: CXXBoolLiteralExpr 174 // CHECK-NEXT: NullStmt 175 176 #pragma acc kernels if(T::SomeFloat) 177 while(true); 178 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 179 // CHECK-NEXT: if clause 180 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 181 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 182 // CHECK-NEXT: WhileStmt 183 // CHECK-NEXT: CXXBoolLiteralExpr 184 // CHECK-NEXT: NullStmt 185 186 #pragma acc parallel if(T::BC) 187 while(true); 188 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 189 // CHECK-NEXT: if clause 190 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 191 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 192 // CHECK-NEXT: WhileStmt 193 // CHECK-NEXT: CXXBoolLiteralExpr 194 // CHECK-NEXT: NullStmt 195 196 #pragma acc serial self 197 while(true); 198 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 199 // CHECK-NEXT: self clause 200 // CHECK-NEXT: <<<NULL>> 201 // CHECK-NEXT: WhileStmt 202 // CHECK-NEXT: CXXBoolLiteralExpr 203 // CHECK-NEXT: NullStmt 204 205 #pragma acc kernels self(T::SomeFloat) 206 while(true); 207 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 208 // CHECK-NEXT: self clause 209 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 210 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 211 // CHECK-NEXT: WhileStmt 212 // CHECK-NEXT: CXXBoolLiteralExpr 213 // CHECK-NEXT: NullStmt 214 215 #pragma acc parallel self(T::SomeFloat) if (T::SomeFloat) 216 while(true); 217 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 218 // CHECK-NEXT: self clause 219 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 220 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 221 // CHECK-NEXT: if clause 222 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 223 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 224 // CHECK-NEXT: WhileStmt 225 // CHECK-NEXT: CXXBoolLiteralExpr 226 // CHECK-NEXT: NullStmt 227 228 #pragma acc serial if(T::SomeFloat) self(T::SomeFloat) 229 while(true); 230 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 231 // CHECK-NEXT: if clause 232 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 233 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 234 // CHECK-NEXT: self clause 235 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 236 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 237 // CHECK-NEXT: WhileStmt 238 // CHECK-NEXT: CXXBoolLiteralExpr 239 // CHECK-NEXT: NullStmt 240 241 T t; 242 // CHECK-NEXT: DeclStmt 243 // CHECK-NEXT: VarDecl{{.*}} t 'T' 244 245 #pragma acc parallel reduction(+: t) 246 while(true); 247 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 248 // CHECK-NEXT: reduction clause Operator: + 249 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T' 250 // CHECK-NEXT: WhileStmt 251 // CHECK-NEXT: CXXBoolLiteralExpr 252 // CHECK-NEXT: NullStmt 253 254 #pragma acc serial reduction(*: T::SomeFloat) 255 while(true); 256 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 257 // CHECK-NEXT: reduction clause Operator: * 258 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 259 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 260 // CHECK-NEXT: WhileStmt 261 // CHECK-NEXT: CXXBoolLiteralExpr 262 // CHECK-NEXT: NullStmt 263 264 typename T::IntTy i; 265 // CHECK-NEXT: DeclStmt 266 // CHECK-NEXT: VarDecl{{.*}} i 'typename T::IntTy' 267 268 #pragma acc parallel reduction(max: i) 269 while(true); 270 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 271 // CHECK-NEXT: reduction clause Operator: max 272 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy' 273 // CHECK-NEXT: WhileStmt 274 // CHECK-NEXT: CXXBoolLiteralExpr 275 // CHECK-NEXT: NullStmt 276 277 #pragma acc serial reduction(min: t) 278 while(true); 279 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 280 // CHECK-NEXT: reduction clause Operator: min 281 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T' 282 // CHECK-NEXT: WhileStmt 283 // CHECK-NEXT: CXXBoolLiteralExpr 284 // CHECK-NEXT: NullStmt 285 286 #pragma acc parallel reduction(&: T::SomeFloat) 287 while(true); 288 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 289 // CHECK-NEXT: reduction clause Operator: & 290 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 291 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 292 // CHECK-NEXT: WhileStmt 293 // CHECK-NEXT: CXXBoolLiteralExpr 294 // CHECK-NEXT: NullStmt 295 296 #pragma acc serial reduction(|: i) 297 while(true); 298 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 299 // CHECK-NEXT: reduction clause Operator: | 300 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy' 301 // CHECK-NEXT: WhileStmt 302 // CHECK-NEXT: CXXBoolLiteralExpr 303 // CHECK-NEXT: NullStmt 304 305 #pragma acc parallel reduction(^: t) 306 while(true); 307 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 308 // CHECK-NEXT: reduction clause Operator: ^ 309 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T' 310 // CHECK-NEXT: WhileStmt 311 // CHECK-NEXT: CXXBoolLiteralExpr 312 // CHECK-NEXT: NullStmt 313 314 #pragma acc serial reduction(&&: T::SomeFloat) 315 while(true); 316 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 317 // CHECK-NEXT: reduction clause Operator: && 318 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 319 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 320 // CHECK-NEXT: WhileStmt 321 // CHECK-NEXT: CXXBoolLiteralExpr 322 // CHECK-NEXT: NullStmt 323 324 #pragma acc parallel reduction(||: i) 325 while(true); 326 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 327 // CHECK-NEXT: reduction clause Operator: || 328 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy' 329 // CHECK-NEXT: WhileStmt 330 // CHECK-NEXT: CXXBoolLiteralExpr 331 // CHECK-NEXT: NullStmt 332 333 // Match the instantiation: 334 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation 335 // CHECK-NEXT: TemplateArgument type 'InstTy' 336 // CHECK-NEXT: RecordType{{.*}} 'InstTy' 337 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy' 338 // CHECK-NEXT: CompoundStmt 339 340 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 341 // CHECK-NEXT: default(none) 342 // CHECK-NEXT: WhileStmt 343 // CHECK-NEXT: CXXBoolLiteralExpr 344 // CHECK-NEXT: NullStmt 345 346 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 347 // CHECK-NEXT: default(present) 348 // CHECK-NEXT: WhileStmt 349 // CHECK-NEXT: CXXBoolLiteralExpr 350 // CHECK-NEXT: NullStmt 351 352 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 353 // CHECK-NEXT: if clause 354 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' 355 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue> 356 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 357 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 358 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating> 359 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp> 360 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int' 361 // CHECK-NEXT: WhileStmt 362 // CHECK-NEXT: CXXBoolLiteralExpr 363 // CHECK-NEXT: NullStmt 364 365 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 366 // CHECK-NEXT: if clause 367 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean> 368 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp> 369 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int' 370 // CHECK-NEXT: WhileStmt 371 // CHECK-NEXT: CXXBoolLiteralExpr 372 // CHECK-NEXT: NullStmt 373 374 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 375 // CHECK-NEXT: if clause 376 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 377 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 378 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 379 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 380 // CHECK-NEXT: WhileStmt 381 // CHECK-NEXT: CXXBoolLiteralExpr 382 // CHECK-NEXT: NullStmt 383 384 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 385 // CHECK-NEXT: if clause 386 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion> 387 // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool' 388 // CHECK-NEXT: MemberExpr{{.*}} .operator bool 389 // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion' 390 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 391 // CHECK-NEXT: WhileStmt 392 // CHECK-NEXT: CXXBoolLiteralExpr 393 // CHECK-NEXT: NullStmt 394 395 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 396 // CHECK-NEXT: self clause 397 // CHECK-NEXT: <<<NULL>> 398 // CHECK-NEXT: WhileStmt 399 // CHECK-NEXT: CXXBoolLiteralExpr 400 // CHECK-NEXT: NullStmt 401 402 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 403 // CHECK-NEXT: self clause 404 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 405 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 406 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 407 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 408 // CHECK-NEXT: WhileStmt 409 // CHECK-NEXT: CXXBoolLiteralExpr 410 // CHECK-NEXT: NullStmt 411 412 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 413 // CHECK-NEXT: self clause 414 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 415 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 416 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 417 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 418 // CHECK-NEXT: if clause 419 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 420 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 421 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 422 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 423 // CHECK-NEXT: WhileStmt 424 // CHECK-NEXT: CXXBoolLiteralExpr 425 // CHECK-NEXT: NullStmt 426 427 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 428 // CHECK-NEXT: if clause 429 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 430 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 431 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 432 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 433 // CHECK-NEXT: self clause 434 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 435 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 436 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 437 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 438 // CHECK-NEXT: WhileStmt 439 // CHECK-NEXT: CXXBoolLiteralExpr 440 // CHECK-NEXT: NullStmt 441 442 // CHECK-NEXT: DeclStmt 443 // CHECK-NEXT: VarDecl{{.*}} t 'InstTy' 444 // CHECK-NEXT: CXXConstructExpr 445 446 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 447 // CHECK-NEXT: reduction clause Operator: + 448 // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy' 449 // CHECK-NEXT: WhileStmt 450 // CHECK-NEXT: CXXBoolLiteralExpr 451 // CHECK-NEXT: NullStmt 452 453 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 454 // CHECK-NEXT: reduction clause Operator: * 455 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 456 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 457 // CHECK-NEXT: WhileStmt 458 // CHECK-NEXT: CXXBoolLiteralExpr 459 // CHECK-NEXT: NullStmt 460 461 // CHECK-NEXT: DeclStmt 462 // CHECK-NEXT: VarDecl{{.*}} i 'typename InstTy::IntTy':'int' 463 464 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 465 // CHECK-NEXT: reduction clause Operator: max 466 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int' 467 // CHECK-NEXT: WhileStmt 468 // CHECK-NEXT: CXXBoolLiteralExpr 469 // CHECK-NEXT: NullStmt 470 471 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 472 // CHECK-NEXT: reduction clause Operator: min 473 // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy' 474 // CHECK-NEXT: WhileStmt 475 // CHECK-NEXT: CXXBoolLiteralExpr 476 // CHECK-NEXT: NullStmt 477 478 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 479 // CHECK-NEXT: reduction clause Operator: & 480 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 481 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 482 // CHECK-NEXT: WhileStmt 483 // CHECK-NEXT: CXXBoolLiteralExpr 484 // CHECK-NEXT: NullStmt 485 486 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 487 // CHECK-NEXT: reduction clause Operator: | 488 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int' 489 // CHECK-NEXT: WhileStmt 490 // CHECK-NEXT: CXXBoolLiteralExpr 491 // CHECK-NEXT: NullStmt 492 493 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 494 // CHECK-NEXT: reduction clause Operator: ^ 495 // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy' 496 // CHECK-NEXT: WhileStmt 497 // CHECK-NEXT: CXXBoolLiteralExpr 498 // CHECK-NEXT: NullStmt 499 500 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 501 // CHECK-NEXT: reduction clause Operator: && 502 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 503 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 504 // CHECK-NEXT: WhileStmt 505 // CHECK-NEXT: CXXBoolLiteralExpr 506 // CHECK-NEXT: NullStmt 507 508 // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 509 // CHECK-NEXT: reduction clause Operator: || 510 // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int' 511 // CHECK-NEXT: WhileStmt 512 // CHECK-NEXT: CXXBoolLiteralExpr 513 // CHECK-NEXT: NullStmt 514 515 } 516 517 struct BoolConversion{ operator bool() const;}; 518 struct InstTy { 519 using IntTy = int; 520 static constexpr float SomeFloat = 5.0; 521 static constexpr BoolConversion BC; 522 }; 523 524 void Instantiate() { 525 TemplFunc<InstTy>(); 526 } 527 #endif 528