Index: cfe/trunk/lib/Sema/SemaOpenMP.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp @@ -676,9 +676,13 @@ } }; -bool isParallelOrTaskRegion(OpenMPDirectiveKind DKind) { - return isOpenMPParallelDirective(DKind) || isOpenMPTaskingDirective(DKind) || - isOpenMPTeamsDirective(DKind) || DKind == OMPD_unknown; + +bool isImplicitTaskingRegion(OpenMPDirectiveKind DKind) { + return isOpenMPParallelDirective(DKind) || isOpenMPTeamsDirective(DKind); +} + +bool isImplicitOrExplicitTaskingRegion(OpenMPDirectiveKind DKind) { + 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; @@ -1066,7 +1070,7 @@ if (!isStackEmpty()) { iterator I = Iter, E = Stack.back().first.rend(); Scope *TopScope = nullptr; - while (I != E && !isParallelOrTaskRegion(I->Directive) && + while (I != E && !isImplicitOrExplicitTaskingRegion(I->Directive) && !isOpenMPTargetExecutionDirective(I->Directive)) ++I; if (I == E) @@ -1292,7 +1296,7 @@ if (FromParent && I != EndI) std::advance(I, 1); for (; I != EndI; std::advance(I, 1)) { - if (!DPred(I->Directive) && !isParallelOrTaskRegion(I->Directive)) + if (!DPred(I->Directive) && !isImplicitOrExplicitTaskingRegion(I->Directive)) continue; iterator NewI = I; DSAVarData DVar = getDSA(NewI, D); @@ -1636,7 +1640,7 @@ auto &&Info = DSAStack->isLoopControlVariable(D); if (Info.first || (VD && VD->hasLocalStorage() && - isParallelOrTaskRegion(DSAStack->getCurrentDirective())) || + isImplicitOrExplicitTaskingRegion(DSAStack->getCurrentDirective())) || (VD && DSAStack->isForceVarCapturing())) return VD ? VD : Info.second; DSAStackTy::DSAVarData DVarPrivate = @@ -2244,7 +2248,7 @@ // attribute, must have its data-sharing attribute explicitly determined // by being listed in a data-sharing attribute clause. if (DVar.CKind == OMPC_unknown && Stack->getDefaultDSA() == DSA_none && - isParallelOrTaskRegion(DKind) && + isImplicitOrExplicitTaskingRegion(DKind) && VarsWithInheritedDSA.count(VD) == 0) { VarsWithInheritedDSA[VD] = E; return; Index: cfe/trunk/test/OpenMP/task_messages.cpp =================================================================== --- cfe/trunk/test/OpenMP/task_messages.cpp +++ cfe/trunk/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