10c7b92a4SErich Keane // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s 20c7b92a4SErich Keane 30c7b92a4SErich Keane // Test this with PCH. 40c7b92a4SErich Keane // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s 50c7b92a4SErich Keane // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s 60c7b92a4SErich Keane 70c7b92a4SErich Keane #ifndef PCH_HELPER 80c7b92a4SErich Keane #define PCH_HELPER 9daa88364SErich Keane void NormalFunc(int i, float f) { 100c7b92a4SErich Keane // CHECK: FunctionDecl{{.*}}NormalFunc 11daa88364SErich Keane // CHECK-NEXT: ParmVarDecl 12daa88364SErich Keane // CHECK-NEXT: ParmVarDecl 130c7b92a4SErich Keane // CHECK-NEXT: CompoundStmt 140c7b92a4SErich Keane #pragma acc parallel default(none) 150c7b92a4SErich Keane while(true); 160c7b92a4SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 170c7b92a4SErich Keane // CHECK-NEXT: default(none) 180c7b92a4SErich Keane // CHECK-NEXT: WhileStmt 190c7b92a4SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 200c7b92a4SErich Keane // CHECK-NEXT: NullStmt 210c7b92a4SErich Keane 220c7b92a4SErich Keane #pragma acc serial default(present) 230c7b92a4SErich Keane while(true); 240c7b92a4SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 250c7b92a4SErich Keane // CHECK-NEXT: default(present) 260c7b92a4SErich Keane // CHECK-NEXT: WhileStmt 270c7b92a4SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 280c7b92a4SErich Keane // CHECK-NEXT: NullStmt 29daa88364SErich Keane 30daa88364SErich Keane #pragma acc kernels if( i < f) 31daa88364SErich Keane while(true); 32daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 33daa88364SErich Keane // CHECK-NEXT: if clause 34daa88364SErich Keane // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' 35daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating> 36daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue> 37daa88364SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 38daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue> 39daa88364SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 40daa88364SErich Keane // CHECK-NEXT: WhileStmt 41daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 42daa88364SErich Keane // CHECK-NEXT: NullStmt 43a15b685cSErich Keane 44a15b685cSErich Keane #pragma acc parallel reduction(+: i) 45a15b685cSErich Keane while(true); 46a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 47a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: + 48a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 49a15b685cSErich Keane // CHECK-NEXT: WhileStmt 50a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 51a15b685cSErich Keane // CHECK-NEXT: NullStmt 52a15b685cSErich Keane 53a15b685cSErich Keane #pragma acc serial reduction(*: f) 54a15b685cSErich Keane while(true); 55a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 56a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: * 57a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 58a15b685cSErich Keane // CHECK-NEXT: WhileStmt 59a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 60a15b685cSErich Keane // CHECK-NEXT: NullStmt 61a15b685cSErich Keane 62a15b685cSErich Keane #pragma acc parallel reduction(max: i) 63a15b685cSErich Keane while(true); 64a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 65a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: max 66a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 67a15b685cSErich Keane // CHECK-NEXT: WhileStmt 68a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 69a15b685cSErich Keane // CHECK-NEXT: NullStmt 70a15b685cSErich Keane 71a15b685cSErich Keane #pragma acc serial reduction(min: f) 72a15b685cSErich Keane while(true); 73a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 74a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: min 75a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 76a15b685cSErich Keane // CHECK-NEXT: WhileStmt 77a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 78a15b685cSErich Keane // CHECK-NEXT: NullStmt 79a15b685cSErich Keane 80a15b685cSErich Keane #pragma acc parallel reduction(&: i) 81a15b685cSErich Keane while(true); 82a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 83a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: & 84a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 85a15b685cSErich Keane // CHECK-NEXT: WhileStmt 86a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 87a15b685cSErich Keane // CHECK-NEXT: NullStmt 88a15b685cSErich Keane 89a15b685cSErich Keane #pragma acc serial reduction(|: f) 90a15b685cSErich Keane while(true); 91a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 92a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: | 93a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 94a15b685cSErich Keane // CHECK-NEXT: WhileStmt 95a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 96a15b685cSErich Keane // CHECK-NEXT: NullStmt 97a15b685cSErich Keane 98a15b685cSErich Keane 99a15b685cSErich Keane #pragma acc parallel reduction(^: i) 100a15b685cSErich Keane while(true); 101a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 102a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: ^ 103a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 104a15b685cSErich Keane // CHECK-NEXT: WhileStmt 105a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 106a15b685cSErich Keane // CHECK-NEXT: NullStmt 107a15b685cSErich Keane 108a15b685cSErich Keane #pragma acc serial reduction(&&: f) 109a15b685cSErich Keane while(true); 110a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 111a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: && 112a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' 113a15b685cSErich Keane // CHECK-NEXT: WhileStmt 114a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 115a15b685cSErich Keane // CHECK-NEXT: NullStmt 116a15b685cSErich Keane 117a15b685cSErich Keane 118a15b685cSErich Keane #pragma acc parallel reduction(||: i) 119a15b685cSErich Keane while(true); 120a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 121a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: || 122a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'i' 'int' 123a15b685cSErich Keane // CHECK-NEXT: WhileStmt 124a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 125a15b685cSErich Keane // CHECK-NEXT: NullStmt 1260c7b92a4SErich Keane } 1270c7b92a4SErich Keane 1280c7b92a4SErich Keane template<typename T> 1290c7b92a4SErich Keane void TemplFunc() { 1300c7b92a4SErich Keane // CHECK: FunctionTemplateDecl{{.*}}TemplFunc 1310c7b92a4SErich Keane // CHECK-NEXT: TemplateTypeParmDecl 1320c7b92a4SErich Keane 1330c7b92a4SErich Keane // Match the prototype: 1340c7b92a4SErich Keane // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc 1350c7b92a4SErich Keane // CHECK-NEXT: CompoundStmt 1360c7b92a4SErich Keane 1370c7b92a4SErich Keane #pragma acc kernels default(none) 1380c7b92a4SErich Keane while(true); 1390c7b92a4SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 1400c7b92a4SErich Keane // CHECK-NEXT: default(none) 1410c7b92a4SErich Keane // CHECK-NEXT: WhileStmt 1420c7b92a4SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 1430c7b92a4SErich Keane // CHECK-NEXT: NullStmt 1440c7b92a4SErich Keane 1450c7b92a4SErich Keane #pragma acc parallel default(present) 1460c7b92a4SErich Keane while(true); 1470c7b92a4SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 1480c7b92a4SErich Keane // CHECK-NEXT: default(present) 1490c7b92a4SErich Keane // CHECK-NEXT: WhileStmt 1500c7b92a4SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 1510c7b92a4SErich Keane // CHECK-NEXT: NullStmt 1520c7b92a4SErich Keane 153daa88364SErich Keane #pragma acc parallel if(T::SomeFloat < typename T::IntTy{}) 154daa88364SErich Keane while(true); 155daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 156daa88364SErich Keane // CHECK-NEXT: if clause 157daa88364SErich Keane // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<' 158daa88364SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 159daa88364SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 160daa88364SErich Keane // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy' 161daa88364SErich Keane // CHECK-NEXT: InitListExpr{{.*}} 'void' 162daa88364SErich Keane // CHECK-NEXT: WhileStmt 163daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 164daa88364SErich Keane // CHECK-NEXT: NullStmt 165daa88364SErich Keane 166daa88364SErich Keane #pragma acc serial if(typename T::IntTy{}) 167daa88364SErich Keane while(true); 168daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 169daa88364SErich Keane // CHECK-NEXT: if clause 170daa88364SErich Keane // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy' 171daa88364SErich Keane // CHECK-NEXT: InitListExpr{{.*}} 'void' 172daa88364SErich Keane // CHECK-NEXT: WhileStmt 173daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 174daa88364SErich Keane // CHECK-NEXT: NullStmt 175daa88364SErich Keane 176daa88364SErich Keane #pragma acc kernels if(T::SomeFloat) 177daa88364SErich Keane while(true); 178daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 179daa88364SErich Keane // CHECK-NEXT: if clause 180daa88364SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 181daa88364SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 182daa88364SErich Keane // CHECK-NEXT: WhileStmt 183daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 184daa88364SErich Keane // CHECK-NEXT: NullStmt 185daa88364SErich Keane 186daa88364SErich Keane #pragma acc parallel if(T::BC) 187daa88364SErich Keane while(true); 188daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 189daa88364SErich Keane // CHECK-NEXT: if clause 190daa88364SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 191daa88364SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 192daa88364SErich Keane // CHECK-NEXT: WhileStmt 193daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 194daa88364SErich Keane // CHECK-NEXT: NullStmt 195daa88364SErich Keane 19661338782SErich Keane #pragma acc serial self 19761338782SErich Keane while(true); 19861338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 19961338782SErich Keane // CHECK-NEXT: self clause 200*2c2accbcSerichkeane // CHECK-NEXT: <<<NULL>> 20161338782SErich Keane // CHECK-NEXT: WhileStmt 20261338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 20361338782SErich Keane // CHECK-NEXT: NullStmt 20461338782SErich Keane 20561338782SErich Keane #pragma acc kernels self(T::SomeFloat) 20661338782SErich Keane while(true); 20761338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 20861338782SErich Keane // CHECK-NEXT: self clause 20961338782SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 21061338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 21161338782SErich Keane // CHECK-NEXT: WhileStmt 21261338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 21361338782SErich Keane // CHECK-NEXT: NullStmt 21461338782SErich Keane 21561338782SErich Keane #pragma acc parallel self(T::SomeFloat) if (T::SomeFloat) 21661338782SErich Keane while(true); 21761338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 21861338782SErich Keane // CHECK-NEXT: self clause 21961338782SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 22061338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 22161338782SErich Keane // CHECK-NEXT: if clause 22261338782SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 22361338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 22461338782SErich Keane // CHECK-NEXT: WhileStmt 22561338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 22661338782SErich Keane // CHECK-NEXT: NullStmt 22761338782SErich Keane 22861338782SErich Keane #pragma acc serial if(T::SomeFloat) self(T::SomeFloat) 22961338782SErich Keane while(true); 23061338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 23161338782SErich Keane // CHECK-NEXT: if clause 23261338782SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 23361338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 23461338782SErich Keane // CHECK-NEXT: self clause 23561338782SErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 23661338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 23761338782SErich Keane // CHECK-NEXT: WhileStmt 23861338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 23961338782SErich Keane // CHECK-NEXT: NullStmt 24061338782SErich Keane 241a15b685cSErich Keane T t; 242a15b685cSErich Keane // CHECK-NEXT: DeclStmt 243a15b685cSErich Keane // CHECK-NEXT: VarDecl{{.*}} t 'T' 244a15b685cSErich Keane 245a15b685cSErich Keane #pragma acc parallel reduction(+: t) 246a15b685cSErich Keane while(true); 247a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 248a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: + 249a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T' 250a15b685cSErich Keane // CHECK-NEXT: WhileStmt 251a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 252a15b685cSErich Keane // CHECK-NEXT: NullStmt 253a15b685cSErich Keane 254a15b685cSErich Keane #pragma acc serial reduction(*: T::SomeFloat) 255a15b685cSErich Keane while(true); 256a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 257a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: * 258a15b685cSErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 259a15b685cSErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 260a15b685cSErich Keane // CHECK-NEXT: WhileStmt 261a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 262a15b685cSErich Keane // CHECK-NEXT: NullStmt 263a15b685cSErich Keane 264a15b685cSErich Keane typename T::IntTy i; 265a15b685cSErich Keane // CHECK-NEXT: DeclStmt 266a15b685cSErich Keane // CHECK-NEXT: VarDecl{{.*}} i 'typename T::IntTy' 267a15b685cSErich Keane 268a15b685cSErich Keane #pragma acc parallel reduction(max: i) 269a15b685cSErich Keane while(true); 270a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 271a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: max 272a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy' 273a15b685cSErich Keane // CHECK-NEXT: WhileStmt 274a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 275a15b685cSErich Keane // CHECK-NEXT: NullStmt 276a15b685cSErich Keane 277a15b685cSErich Keane #pragma acc serial reduction(min: t) 278a15b685cSErich Keane while(true); 279a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 280a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: min 281a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T' 282a15b685cSErich Keane // CHECK-NEXT: WhileStmt 283a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 284a15b685cSErich Keane // CHECK-NEXT: NullStmt 285a15b685cSErich Keane 286a15b685cSErich Keane #pragma acc parallel reduction(&: T::SomeFloat) 287a15b685cSErich Keane while(true); 288a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 289a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: & 290a15b685cSErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 291a15b685cSErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 292a15b685cSErich Keane // CHECK-NEXT: WhileStmt 293a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 294a15b685cSErich Keane // CHECK-NEXT: NullStmt 295a15b685cSErich Keane 296a15b685cSErich Keane #pragma acc serial reduction(|: i) 297a15b685cSErich Keane while(true); 298a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 299a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: | 300a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy' 301a15b685cSErich Keane // CHECK-NEXT: WhileStmt 302a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 303a15b685cSErich Keane // CHECK-NEXT: NullStmt 304a15b685cSErich Keane 305a15b685cSErich Keane #pragma acc parallel reduction(^: t) 306a15b685cSErich Keane while(true); 307a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 308a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: ^ 309a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue Var{{.*}} 't' 'T' 310a15b685cSErich Keane // CHECK-NEXT: WhileStmt 311a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 312a15b685cSErich Keane // CHECK-NEXT: NullStmt 313a15b685cSErich Keane 314a15b685cSErich Keane #pragma acc serial reduction(&&: T::SomeFloat) 315a15b685cSErich Keane while(true); 316a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 317a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: && 318a15b685cSErich Keane // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 319a15b685cSErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 320a15b685cSErich Keane // CHECK-NEXT: WhileStmt 321a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 322a15b685cSErich Keane // CHECK-NEXT: NullStmt 323a15b685cSErich Keane 324a15b685cSErich Keane #pragma acc parallel reduction(||: i) 325a15b685cSErich Keane while(true); 326a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 327a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: || 328a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'typename T::IntTy' lvalue Var{{.*}} 'i' 'typename T::IntTy' 329a15b685cSErich Keane // CHECK-NEXT: WhileStmt 330a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 331a15b685cSErich Keane // CHECK-NEXT: NullStmt 332a15b685cSErich Keane 3330c7b92a4SErich Keane // Match the instantiation: 3340c7b92a4SErich Keane // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation 335daa88364SErich Keane // CHECK-NEXT: TemplateArgument type 'InstTy' 336daa88364SErich Keane // CHECK-NEXT: RecordType{{.*}} 'InstTy' 337daa88364SErich Keane // CHECK-NEXT: CXXRecord{{.*}} 'InstTy' 3380c7b92a4SErich Keane // CHECK-NEXT: CompoundStmt 339daa88364SErich Keane 3400c7b92a4SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 3410c7b92a4SErich Keane // CHECK-NEXT: default(none) 3420c7b92a4SErich Keane // CHECK-NEXT: WhileStmt 3430c7b92a4SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 3440c7b92a4SErich Keane // CHECK-NEXT: NullStmt 345daa88364SErich Keane 3460c7b92a4SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 3470c7b92a4SErich Keane // CHECK-NEXT: default(present) 3480c7b92a4SErich Keane // CHECK-NEXT: WhileStmt 3490c7b92a4SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 3500c7b92a4SErich Keane // CHECK-NEXT: NullStmt 351daa88364SErich Keane 352daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 353daa88364SErich Keane // CHECK-NEXT: if clause 354daa88364SErich Keane // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' 355daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue> 356daa88364SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 357daa88364SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 358daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating> 359daa88364SErich Keane // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp> 360daa88364SErich Keane // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int' 361daa88364SErich Keane // CHECK-NEXT: WhileStmt 362daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 363daa88364SErich Keane // CHECK-NEXT: NullStmt 364daa88364SErich Keane 365daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 366daa88364SErich Keane // CHECK-NEXT: if clause 367daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean> 368daa88364SErich Keane // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp> 369daa88364SErich Keane // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int' 370daa88364SErich Keane // CHECK-NEXT: WhileStmt 371daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 372daa88364SErich Keane // CHECK-NEXT: NullStmt 373daa88364SErich Keane 374daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 375daa88364SErich Keane // CHECK-NEXT: if clause 376daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 377daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 378daa88364SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 379daa88364SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 380daa88364SErich Keane // CHECK-NEXT: WhileStmt 381daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 382daa88364SErich Keane // CHECK-NEXT: NullStmt 383daa88364SErich Keane 384daa88364SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 385daa88364SErich Keane // CHECK-NEXT: if clause 386daa88364SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion> 387daa88364SErich Keane // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool' 388daa88364SErich Keane // CHECK-NEXT: MemberExpr{{.*}} .operator bool 389daa88364SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion' 390daa88364SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 391daa88364SErich Keane // CHECK-NEXT: WhileStmt 392daa88364SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 393daa88364SErich Keane // CHECK-NEXT: NullStmt 39461338782SErich Keane 39561338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 39661338782SErich Keane // CHECK-NEXT: self clause 397*2c2accbcSerichkeane // CHECK-NEXT: <<<NULL>> 39861338782SErich Keane // CHECK-NEXT: WhileStmt 39961338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 40061338782SErich Keane // CHECK-NEXT: NullStmt 40161338782SErich Keane 40261338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}kernels 40361338782SErich Keane // CHECK-NEXT: self clause 40461338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 40561338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 40661338782SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 40761338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 40861338782SErich Keane // CHECK-NEXT: WhileStmt 40961338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 41061338782SErich Keane // CHECK-NEXT: NullStmt 41161338782SErich Keane 41261338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 41361338782SErich Keane // CHECK-NEXT: self clause 41461338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 41561338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 41661338782SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 41761338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 41861338782SErich Keane // CHECK-NEXT: if clause 41961338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 42061338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 42161338782SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 42261338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 42361338782SErich Keane // CHECK-NEXT: WhileStmt 42461338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 42561338782SErich Keane // CHECK-NEXT: NullStmt 42661338782SErich Keane 42761338782SErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 42861338782SErich Keane // CHECK-NEXT: if clause 42961338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 43061338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 43161338782SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 43261338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 43361338782SErich Keane // CHECK-NEXT: self clause 43461338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean> 43561338782SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue> 43661338782SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 43761338782SErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 43861338782SErich Keane // CHECK-NEXT: WhileStmt 43961338782SErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 44061338782SErich Keane // CHECK-NEXT: NullStmt 44161338782SErich Keane 442a15b685cSErich Keane // CHECK-NEXT: DeclStmt 443a15b685cSErich Keane // CHECK-NEXT: VarDecl{{.*}} t 'InstTy' 444a15b685cSErich Keane // CHECK-NEXT: CXXConstructExpr 445a15b685cSErich Keane 446a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 447a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: + 448a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy' 449a15b685cSErich Keane // CHECK-NEXT: WhileStmt 450a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 451a15b685cSErich Keane // CHECK-NEXT: NullStmt 452a15b685cSErich Keane 453a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 454a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: * 455a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 456a15b685cSErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 457a15b685cSErich Keane // CHECK-NEXT: WhileStmt 458a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 459a15b685cSErich Keane // CHECK-NEXT: NullStmt 460a15b685cSErich Keane 461a15b685cSErich Keane // CHECK-NEXT: DeclStmt 462a15b685cSErich Keane // CHECK-NEXT: VarDecl{{.*}} i 'typename InstTy::IntTy':'int' 463a15b685cSErich Keane 464a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 465a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: max 466a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int' 467a15b685cSErich Keane // CHECK-NEXT: WhileStmt 468a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 469a15b685cSErich Keane // CHECK-NEXT: NullStmt 470a15b685cSErich Keane 471a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 472a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: min 473a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy' 474a15b685cSErich Keane // CHECK-NEXT: WhileStmt 475a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 476a15b685cSErich Keane // CHECK-NEXT: NullStmt 477a15b685cSErich Keane 478a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 479a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: & 480a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 481a15b685cSErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 482a15b685cSErich Keane // CHECK-NEXT: WhileStmt 483a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 484a15b685cSErich Keane // CHECK-NEXT: NullStmt 485a15b685cSErich Keane 486a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 487a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: | 488a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int' 489a15b685cSErich Keane // CHECK-NEXT: WhileStmt 490a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 491a15b685cSErich Keane // CHECK-NEXT: NullStmt 492a15b685cSErich Keane 493a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 494a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: ^ 495a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'InstTy' lvalue Var{{.*}} 't' 'InstTy' 496a15b685cSErich Keane // CHECK-NEXT: WhileStmt 497a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 498a15b685cSErich Keane // CHECK-NEXT: NullStmt 499a15b685cSErich Keane 500a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}serial 501a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: && 502a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float' 503a15b685cSErich Keane // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 504a15b685cSErich Keane // CHECK-NEXT: WhileStmt 505a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 506a15b685cSErich Keane // CHECK-NEXT: NullStmt 507a15b685cSErich Keane 508a15b685cSErich Keane // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel 509a15b685cSErich Keane // CHECK-NEXT: reduction clause Operator: || 510a15b685cSErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'typename InstTy::IntTy':'int' lvalue Var{{.*}} 'i' 'typename InstTy::IntTy':'int' 511a15b685cSErich Keane // CHECK-NEXT: WhileStmt 512a15b685cSErich Keane // CHECK-NEXT: CXXBoolLiteralExpr 513a15b685cSErich Keane // CHECK-NEXT: NullStmt 514a15b685cSErich Keane 5150c7b92a4SErich Keane } 5160c7b92a4SErich Keane 517daa88364SErich Keane struct BoolConversion{ operator bool() const;}; 518daa88364SErich Keane struct InstTy { 519daa88364SErich Keane using IntTy = int; 520daa88364SErich Keane static constexpr float SomeFloat = 5.0; 521daa88364SErich Keane static constexpr BoolConversion BC; 522daa88364SErich Keane }; 523daa88364SErich Keane 5240c7b92a4SErich Keane void Instantiate() { 525daa88364SErich Keane TemplFunc<InstTy>(); 5260c7b92a4SErich Keane } 5270c7b92a4SErich Keane #endif 528