17aa9c393SJennifer Yu // expected-no-diagnostics 27aa9c393SJennifer Yu 3*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ 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 8*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ 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 13*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ 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 18*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ 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 23*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ 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 { 41927156a6SJennifer Yu [=]() -> int { 42927156a6SJennifer Yu return targetDev++; 43927156a6SJennifer Yu }(); 447aa9c393SJennifer Yu } 457aa9c393SJennifer Yu // PRINT: #pragma omp parallel default(firstprivate) 467aa9c393SJennifer Yu // PRINT-NEXT: { 47927156a6SJennifer Yu // PRINT-NEXT: [=]() -> int { 48927156a6SJennifer Yu // PRINT-NEXT: return this->targetDev++; 49927156a6SJennifer Yu // PRINT-NEXT: }(); 50927156a6SJennifer Yu // PRINT-NEXT: } 517aa9c393SJennifer Yu // DUMP: -OMPParallelDirective 52927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 53927156a6SJennifer 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: { 58927156a6SJennifer Yu // PRINT-NEXT: [=]() -> int { 59927156a6SJennifer Yu // PRINT-NEXT: return this->targetDev++; 60927156a6SJennifer Yu // PRINT-NEXT: }(); 617aa9c393SJennifer Yu // CHECK-NEXT: } 627aa9c393SJennifer Yu // DUMP: -OMPParallelDirective 637aa9c393SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 64927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause 65927156a6SJennifer 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 } 111927156a6SJennifer Yu void zoo(int); 112927156a6SJennifer Yu struct A { 113927156a6SJennifer Yu int z; 114927156a6SJennifer Yu int f; 115927156a6SJennifer Yu A(); 116927156a6SJennifer Yu ~A(); fooA117927156a6SJennifer Yu void foo() { 118927156a6SJennifer Yu #pragma omp parallel firstprivate(z) default(firstprivate) 119927156a6SJennifer Yu { 120927156a6SJennifer Yu z++; 121927156a6SJennifer Yu f++; 122927156a6SJennifer Yu zoo(z + f); 123927156a6SJennifer Yu f++; 124927156a6SJennifer Yu } 125927156a6SJennifer Yu } 126927156a6SJennifer Yu // PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate) 127927156a6SJennifer Yu // DUMP: -OMPParallelDirective 128927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause 129927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 130927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 131927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit> 132927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' 133927156a6SJennifer Yu // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this 134927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 135927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' barA136927156a6SJennifer Yu void bar() { 137927156a6SJennifer Yu #pragma omp parallel firstprivate(z) default(firstprivate) 138927156a6SJennifer Yu { 139927156a6SJennifer Yu #pragma omp parallel private(z) default(firstprivate) 140927156a6SJennifer Yu { 141927156a6SJennifer Yu z++; 142927156a6SJennifer Yu f++; 143927156a6SJennifer Yu zoo(z + f); 144927156a6SJennifer Yu f++; 145927156a6SJennifer Yu } 146927156a6SJennifer Yu } 147927156a6SJennifer Yu } 148927156a6SJennifer Yu // PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate) 149927156a6SJennifer Yu // PRINT: #pragma omp parallel private(this->z) default(firstprivate) 150927156a6SJennifer Yu // DUMP: -OMPParallelDirective 151927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause 152927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 153927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 154927156a6SJennifer Yu // DUMP: -OMPParallelDirective 155927156a6SJennifer Yu // DUMP-NEXT: -OMPPrivateClaus 156927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 157927156a6SJennifer Yu // DUMP-NEXT: -OMPDefaultClause 158927156a6SJennifer Yu // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit> 159927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' 160927156a6SJennifer Yu // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this 161927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' 162927156a6SJennifer Yu // DUMP: -MemberExpr {{.*}} 163927156a6SJennifer Yu // DUMP-NEXT: -CXXThisExpr 164927156a6SJennifer Yu // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this 165927156a6SJennifer Yu // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' 166927156a6SJennifer Yu }; 1677aa9c393SJennifer Yu #endif // HEADER 168