Author: abataev
Date: Thu Sep 21 07:06:59 2017
New Revision: 313880

URL: http://llvm.org/viewvc/llvm-project?rev=313880&view=rev
Log:
[OPENMP] Use canonical declarations for redeclarations checks.

If the captured variable has some redeclarations we may run into the
situation where the redeclaration is used instead of the canonical
declaration and we may consider this variable as one not captured
before.

Modified:
    cfe/trunk/lib/Sema/SemaOpenMP.cpp
    cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp
    cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp

Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=313880&r1=313879&r2=313880&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Thu Sep 21 07:06:59 2017
@@ -1130,6 +1130,7 @@ bool Sema::IsOpenMPCapturedByRef(ValueDe
   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 StmtVisito
   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::ActOnOpenMPExecutableDi
   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.

Modified: cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp?rev=313880&r1=313879&r2=313880&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp (original)
+++ cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp Thu Sep 21 
07:06:59 2017
@@ -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}}

Modified: cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp?rev=313880&r1=313879&r2=313880&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp (original)
+++ cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp Thu Sep 21 
07:06:59 2017
@@ -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}}


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to