17aa9c393SJennifer Yu // expected-no-diagnostics 27aa9c393SJennifer Yu 37aa9c393SJennifer Yu //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ 47aa9c393SJennifer Yu //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ 57aa9c393SJennifer Yu //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ 67aa9c393SJennifer Yu //RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT 77aa9c393SJennifer Yu 87aa9c393SJennifer Yu //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ 97aa9c393SJennifer Yu //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ 107aa9c393SJennifer Yu //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ 117aa9c393SJennifer Yu //RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP 127aa9c393SJennifer Yu 137aa9c393SJennifer Yu //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ 147aa9c393SJennifer Yu //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ 157aa9c393SJennifer Yu //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ 167aa9c393SJennifer Yu //RUN: -emit-pch -o %t %s 177aa9c393SJennifer Yu 187aa9c393SJennifer Yu //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ 197aa9c393SJennifer Yu //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ 207aa9c393SJennifer Yu //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ 217aa9c393SJennifer Yu //RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT 227aa9c393SJennifer Yu 237aa9c393SJennifer Yu //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ 247aa9c393SJennifer Yu //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ 257aa9c393SJennifer Yu //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ 267aa9c393SJennifer Yu //RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP 277aa9c393SJennifer Yu 287aa9c393SJennifer Yu #ifndef HEADER 297aa9c393SJennifer Yu #define HEADER 307aa9c393SJennifer Yu 317aa9c393SJennifer Yu struct SomeKernel { 327aa9c393SJennifer Yu int targetDev; 337aa9c393SJennifer Yu float devPtr; 347aa9c393SJennifer Yu SomeKernel(); 357aa9c393SJennifer Yu ~SomeKernel(); 367aa9c393SJennifer Yu 377aa9c393SJennifer Yu template <unsigned int nRHS> applySomeKernel387aa9c393SJennifer Yu void apply() { 397aa9c393SJennifer Yu #pragma omp parallel default(firstprivate) 407aa9c393SJennifer Yu { 41*927156a6SJennifer Yu [=]() -> int { 42*927156a6SJennifer Yu return targetDev++; 43*927156a6SJennifer Yu }(); 447aa9c393SJennifer Yu } 457aa9c393SJennifer Yu // PRINT: #pragma omp parallel default(firstprivate) 467aa9c393SJennifer Yu // PRINT-NEXT: { 47*927156a6SJennifer Yu // PRINT-NEXT: [=]() -> int { 48*927156a6SJennifer Yu // PRINT-NEXT: return this->targetDev++; 49*927156a6SJennifer Yu // PRINT-NEXT: }(); 50*927156a6SJennifer Yu // PRINT-NEXT: } 517aa9c393SJennifer Yu // DUMP: -OMPParallelDirective 52*927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 53*927156a6SJennifer Yu // DUMP-NOT: -OMPFirstprivateClause 547aa9c393SJennifer Yu } 557aa9c393SJennifer Yu // PRINT: template<> void apply<32U>() 567aa9c393SJennifer Yu // PRINT: #pragma omp parallel default(firstprivate) 577aa9c393SJennifer Yu // PRINT-NEXT: { 58*927156a6SJennifer Yu // PRINT-NEXT: [=]() -> int { 59*927156a6SJennifer Yu // PRINT-NEXT: return this->targetDev++; 60*927156a6SJennifer Yu // PRINT-NEXT: }(); 617aa9c393SJennifer Yu // CHECK-NEXT: } 627aa9c393SJennifer Yu // DUMP: -OMPParallelDirective 637aa9c393SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 64*927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause 65*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'targetDev' 667aa9c393SJennifer Yu }; 677aa9c393SJennifer Yu use_template()687aa9c393SJennifer Yuvoid use_template() { 697aa9c393SJennifer Yu SomeKernel aKern; 707aa9c393SJennifer Yu aKern.apply<32>(); 717aa9c393SJennifer Yu } 727aa9c393SJennifer Yu foo()737aa9c393SJennifer Yuvoid foo() { 747aa9c393SJennifer Yu int a; 757aa9c393SJennifer Yu #pragma omp parallel default(firstprivate) 767aa9c393SJennifer Yu a++; 777aa9c393SJennifer Yu // PRINT: #pragma omp parallel default(firstprivate) 787aa9c393SJennifer Yu // PRINT-NEXT: a++; 797aa9c393SJennifer Yu // DUMP: -OMPParallelDirective 807aa9c393SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 817aa9c393SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit> 827aa9c393SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'a' 837aa9c393SJennifer Yu } 847aa9c393SJennifer Yu 857aa9c393SJennifer Yu struct St { 867aa9c393SJennifer Yu int a, b; 877aa9c393SJennifer Yu static int y; StSt887aa9c393SJennifer Yu St() : a(0), b(0) {} ~StSt897aa9c393SJennifer Yu ~St() {} 907aa9c393SJennifer Yu }; 917aa9c393SJennifer Yu int St::y = 0; bar()927aa9c393SJennifer Yuvoid bar() { 937aa9c393SJennifer Yu St a = St(); 947aa9c393SJennifer Yu static int yy = 0; 957aa9c393SJennifer Yu #pragma omp parallel default(firstprivate) 967aa9c393SJennifer Yu { 977aa9c393SJennifer Yu a.a += 1; 987aa9c393SJennifer Yu a.b += 1; 997aa9c393SJennifer Yu a.y++; 1007aa9c393SJennifer Yu yy++; 1017aa9c393SJennifer Yu St::y++; 1027aa9c393SJennifer Yu } 1037aa9c393SJennifer Yu // PRINT: #pragma omp parallel default(firstprivate) 1047aa9c393SJennifer Yu // DUMP: -OMPParallelDirective 1057aa9c393SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 1067aa9c393SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit> 1077aa9c393SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'a' 1087aa9c393SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'yy' 1097aa9c393SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'y' 1107aa9c393SJennifer Yu } 111*927156a6SJennifer Yu void zoo(int); 112*927156a6SJennifer Yu struct A { 113*927156a6SJennifer Yu int z; 114*927156a6SJennifer Yu int f; 115*927156a6SJennifer Yu A(); 116*927156a6SJennifer Yu ~A(); fooA117*927156a6SJennifer Yu void foo() { 118*927156a6SJennifer Yu #pragma omp parallel firstprivate(z) default(firstprivate) 119*927156a6SJennifer Yu { 120*927156a6SJennifer Yu z++; 121*927156a6SJennifer Yu f++; 122*927156a6SJennifer Yu zoo(z + f); 123*927156a6SJennifer Yu f++; 124*927156a6SJennifer Yu } 125*927156a6SJennifer Yu } 126*927156a6SJennifer Yu // PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate) 127*927156a6SJennifer Yu // DUMP: -OMPParallelDirective 128*927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause 129*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 130*927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 131*927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit> 132*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' 133*927156a6SJennifer Yu // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this 134*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 135*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' barA136*927156a6SJennifer Yu void bar() { 137*927156a6SJennifer Yu #pragma omp parallel firstprivate(z) default(firstprivate) 138*927156a6SJennifer Yu { 139*927156a6SJennifer Yu #pragma omp parallel private(z) default(firstprivate) 140*927156a6SJennifer Yu { 141*927156a6SJennifer Yu z++; 142*927156a6SJennifer Yu f++; 143*927156a6SJennifer Yu zoo(z + f); 144*927156a6SJennifer Yu f++; 145*927156a6SJennifer Yu } 146*927156a6SJennifer Yu } 147*927156a6SJennifer Yu } 148*927156a6SJennifer Yu // PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate) 149*927156a6SJennifer Yu // PRINT: #pragma omp parallel private(this->z) default(firstprivate) 150*927156a6SJennifer Yu // DUMP: -OMPParallelDirective 151*927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause 152*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 153*927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 154*927156a6SJennifer Yu // DUMP: -OMPParallelDirective 155*927156a6SJennifer Yu // DUMP-NEXT: -OMPPrivateClaus 156*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 157*927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 158*927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit> 159*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' 160*927156a6SJennifer Yu // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this 161*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' 162*927156a6SJennifer Yu // DUMP: -MemberExpr {{.*}} 163*927156a6SJennifer Yu // DUMP-NEXT: -CXXThisExpr 164*927156a6SJennifer Yu // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this 165*927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 166*927156a6SJennifer Yu }; 1677aa9c393SJennifer Yu #endif // HEADER 168