diff options
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 9 | ||||
-rw-r--r-- | clang/test/OpenMP/taskloop_firstprivate_messages.cpp | 4 | ||||
-rw-r--r-- | clang/test/OpenMP/taskloop_simd_firstprivate_messages.cpp | 4 |
3 files changed, 10 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 342bd6dce87..e4a57db8da5 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1130,6 +1130,7 @@ bool Sema::IsOpenMPCapturedByRef(ValueDecl *D, unsigned Level) { bool IsByRef = true; // Find the directive that is associated with the provided scope. + D = cast<ValueDecl>(D->getCanonicalDecl()); auto Ty = D->getType(); if (DSAStack->hasExplicitDirective(isOpenMPTargetExecutionDirective, Level)) { @@ -1787,6 +1788,7 @@ class DSAAttrChecker : public StmtVisitor<DSAAttrChecker, void> { CapturedStmt *CS; llvm::SmallVector<Expr *, 8> ImplicitFirstprivate; llvm::DenseMap<ValueDecl *, Expr *> VarsWithInheritedDSA; + llvm::DenseSet<ValueDecl *> ImplicitDeclarations; public: void VisitDeclRefExpr(DeclRefExpr *E) { @@ -1794,13 +1796,14 @@ public: E->containsUnexpandedParameterPack() || E->isInstantiationDependent()) return; if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) { + VD = VD->getCanonicalDecl(); // Skip internally declared variables. if (VD->isLocalVarDecl() && !CS->capturesVariable(VD)) return; auto DVar = Stack->getTopDSA(VD, false); // Check if the variable has explicit DSA set and stop analysis if it so. - if (DVar.RefExpr) + if (DVar.RefExpr || !ImplicitDeclarations.insert(VD).second) return; auto ELoc = E->getExprLoc(); @@ -1850,7 +1853,7 @@ public: auto DVar = Stack->getTopDSA(FD, false); // Check if the variable has explicit DSA set and stop analysis if it // so. - if (DVar.RefExpr) + if (DVar.RefExpr || !ImplicitDeclarations.insert(FD).second) return; auto ELoc = E->getExprLoc(); @@ -2617,7 +2620,7 @@ StmtResult Sema::ActOnOpenMPExecutableDirective( llvm::DenseMap<ValueDecl *, Expr *> VarsWithInheritedDSA; bool ErrorFound = false; ClausesWithImplicit.append(Clauses.begin(), Clauses.end()); - if (AStmt) { + if (AStmt && !CurContext->isDependentContext()) { assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); // Check default data sharing attributes for referenced variables. diff --git a/clang/test/OpenMP/taskloop_firstprivate_messages.cpp b/clang/test/OpenMP/taskloop_firstprivate_messages.cpp index fe22311f650..e63d6a678b8 100644 --- a/clang/test/OpenMP/taskloop_firstprivate_messages.cpp +++ b/clang/test/OpenMP/taskloop_firstprivate_messages.cpp @@ -295,9 +295,9 @@ int main(int argc, char **argv) { #pragma omp taskloop firstprivate(i) // expected-note {{defined as firstprivate}} for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp taskloop' directive may not be firstprivate, predetermined as private}} foo(); -#pragma omp parallel reduction(+ : i) // expected-note 4 {{defined as reduction}} +#pragma omp parallel reduction(+ : i) // expected-note 2 {{defined as reduction}} #pragma omp taskloop firstprivate(i) //expected-error {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}} - for (i = 0; i < argc; ++i) // expected-error 3 {{reduction variables may not be accessed in an explicit task}} + for (i = 0; i < argc; ++i) // expected-error {{reduction variables may not be accessed in an explicit task}} foo(); #pragma omp parallel #pragma omp taskloop firstprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} diff --git a/clang/test/OpenMP/taskloop_simd_firstprivate_messages.cpp b/clang/test/OpenMP/taskloop_simd_firstprivate_messages.cpp index 18cefc1beeb..176dcd7f8f9 100644 --- a/clang/test/OpenMP/taskloop_simd_firstprivate_messages.cpp +++ b/clang/test/OpenMP/taskloop_simd_firstprivate_messages.cpp @@ -295,9 +295,9 @@ int main(int argc, char **argv) { #pragma omp taskloop simd firstprivate(i) // expected-note {{defined as firstprivate}} for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp taskloop simd' directive may not be firstprivate, predetermined as linear}} foo(); -#pragma omp parallel reduction(+ : i) // expected-note 4 {{defined as reduction}} +#pragma omp parallel reduction(+ : i) // expected-note 2 {{defined as reduction}} #pragma omp taskloop simd firstprivate(i) // expected-error {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}} - for (i = 0; i < argc; ++i) // expected-error 3 {{reduction variables may not be accessed in an explicit task}} + for (i = 0; i < argc; ++i) // expected-error {{reduction variables may not be accessed in an explicit task}} foo(); #pragma omp parallel #pragma omp taskloop simd firstprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} |