Index: lib/Sema/SemaOpenMP.cpp =================================================================== --- lib/Sema/SemaOpenMP.cpp +++ lib/Sema/SemaOpenMP.cpp @@ -676,9 +676,13 @@ } }; + +bool isImplicitTaskingRegion(OpenMPDirectiveKind DKind) { + return isOpenMPParallelDirective(DKind) || isOpenMPTeamsDirective(DKind); +} + bool isParallelOrTaskRegion(OpenMPDirectiveKind DKind) { - return isOpenMPParallelDirective(DKind) || isOpenMPTaskingDirective(DKind) || - isOpenMPTeamsDirective(DKind) || DKind == OMPD_unknown; + return isImplicitTaskingRegion(DKind) || isOpenMPTaskingDirective(DKind) || DKind == OMPD_unknown; } } // namespace @@ -819,7 +823,7 @@ DVar.CKind = OMPC_firstprivate; return DVar; } - } while (I != E && !isParallelOrTaskRegion(I->Directive)); + } while (I != E && !isImplicitTaskingRegion(I->Directive)); DVar.CKind = (DVarTemp.CKind == OMPC_unknown) ? OMPC_firstprivate : OMPC_shared; return DVar; Index: test/OpenMP/task_messages.cpp =================================================================== --- test/OpenMP/task_messages.cpp +++ test/OpenMP/task_messages.cpp @@ -8,7 +8,7 @@ #pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}} class S { - S(const S &s) { a = s.a + 12; } // expected-note 14 {{implicitly declared private here}} + S(const S &s) { a = s.a + 12; } // expected-note 16 {{implicitly declared private here}} int a; public: @@ -51,6 +51,15 @@ ++a; // expected-error {{calling a private constructor of class 'S'}} #pragma omp task default(shared) #pragma omp task + // expected-error@+1 {{calling a private constructor of class 'S'}} + ++a; +#pragma omp parallel shared(a) +#pragma omp task +#pragma omp task + ++a; +#pragma omp parallel shared(a) +#pragma omp task default(shared) +#pragma omp task ++a; #pragma omp task #pragma omp parallel @@ -205,6 +214,15 @@ ++sa; // expected-error {{calling a private constructor of class 'S'}} #pragma omp task default(shared) #pragma omp task + // expected-error@+1 {{calling a private constructor of class 'S'}} + ++sa; +#pragma omp parallel shared(sa) +#pragma omp task +#pragma omp task + ++sa; +#pragma omp parallel shared(sa) +#pragma omp task default(shared) +#pragma omp task ++sa; #pragma omp task #pragma omp parallel