// expected-no-diagnostics //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ //RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ //RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ //RUN: -emit-pch -o %t %s //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ //RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \ //RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \ //RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \ //RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP #ifndef HEADER #define HEADER struct SomeKernel { int targetDev; float devPtr; SomeKernel(); ~SomeKernel(); template void apply() { #pragma omp parallel default(firstprivate) { [=]() -> int { return targetDev++; }(); } // PRINT: #pragma omp parallel default(firstprivate) // PRINT-NEXT: { // PRINT-NEXT: [=]() -> int { // PRINT-NEXT: return this->targetDev++; // PRINT-NEXT: }(); // PRINT-NEXT: } // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPDefaultClause // DUMP-NOT: -OMPFirstprivateClause } // PRINT: template<> void apply<32U>() // PRINT: #pragma omp parallel default(firstprivate) // PRINT-NEXT: { // PRINT-NEXT: [=]() -> int { // PRINT-NEXT: return this->targetDev++; // PRINT-NEXT: }(); // CHECK-NEXT: } // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPDefaultClause // DUMP-NEXT: -OMPFirstprivateClause // DUMP-NEXT: -DeclRefExpr {{.*}} 'targetDev' }; void use_template() { SomeKernel aKern; aKern.apply<32>(); } void foo() { int a; #pragma omp parallel default(firstprivate) a++; // PRINT: #pragma omp parallel default(firstprivate) // PRINT-NEXT: a++; // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPDefaultClause // DUMP-NEXT: -OMPFirstprivateClause {{.*}} // DUMP-NEXT: -DeclRefExpr {{.*}} 'a' } struct St { int a, b; static int y; St() : a(0), b(0) {} ~St() {} }; int St::y = 0; void bar() { St a = St(); static int yy = 0; #pragma omp parallel default(firstprivate) { a.a += 1; a.b += 1; a.y++; yy++; St::y++; } // PRINT: #pragma omp parallel default(firstprivate) // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPDefaultClause // DUMP-NEXT: -OMPFirstprivateClause {{.*}} // DUMP-NEXT: -DeclRefExpr {{.*}} 'a' // DUMP-NEXT: -DeclRefExpr {{.*}} 'yy' // DUMP-NEXT: -DeclRefExpr {{.*}} 'y' } void zoo(int); struct A { int z; int f; A(); ~A(); void foo() { #pragma omp parallel firstprivate(z) default(firstprivate) { z++; f++; zoo(z + f); f++; } } // PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate) // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPFirstprivateClause // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' // DUMP-NEXT: -OMPDefaultClause // DUMP-NEXT: -OMPFirstprivateClause {{.*}} // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' void bar() { #pragma omp parallel firstprivate(z) default(firstprivate) { #pragma omp parallel private(z) default(firstprivate) { z++; f++; zoo(z + f); f++; } } } // PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate) // PRINT: #pragma omp parallel private(this->z) default(firstprivate) // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPFirstprivateClause // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' // DUMP-NEXT: -OMPDefaultClause // DUMP: -OMPParallelDirective // DUMP-NEXT: -OMPPrivateClaus // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' // DUMP-NEXT: -OMPDefaultClause // DUMP-NEXT: -OMPFirstprivateClause {{.*}} // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this // DUMP-NEXT: -DeclRefExpr {{.*}} 'f' // DUMP: -MemberExpr {{.*}} // DUMP-NEXT: -CXXThisExpr // DUMP: -CXXThisExpr {{.*}} 'A *' implicit this // DUMP-NEXT: -DeclRefExpr {{.*}} 'z' }; #endif // HEADER