]> granicus.if.org Git - clang/commitdiff
[OpenMP] DSAChecker bug fix for combined directives.
authorArpith Chacko Jacob <acjacob@us.ibm.com>
Mon, 23 Jan 2017 15:38:49 +0000 (15:38 +0000)
committerArpith Chacko Jacob <acjacob@us.ibm.com>
Mon, 23 Jan 2017 15:38:49 +0000 (15:38 +0000)
The DSAChecker code in SemaOpenMP looks at the captured statement
associated with an OpenMP directive.  A combined directive such as
'target parallel' has nested capture statements, which have to be
fully traversed before executing the DSAChecker.  This is a patch
to perform the traversal for such combined directives.

Reviewers: ABataev
Differential Revision: https://reviews.llvm.org/D29026

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@292794 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOpenMP.cpp
test/OpenMP/target_parallel_default_messages.cpp

index a4622e1dfb3b7098a441ffe02cd87b6439a5f0c2..c902118f652091a7ce149816f7e3cd5abaed116e 100644 (file)
@@ -2268,7 +2268,11 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
 
     // Check default data sharing attributes for referenced variables.
     DSAAttrChecker DSAChecker(DSAStack, *this, cast<CapturedStmt>(AStmt));
-    DSAChecker.Visit(cast<CapturedStmt>(AStmt)->getCapturedStmt());
+    int ThisCaptureLevel = getOpenMPCaptureLevels(Kind);
+    Stmt *S = AStmt;
+    while (--ThisCaptureLevel >= 0)
+      S = cast<CapturedStmt>(S)->getCapturedStmt();
+    DSAChecker.Visit(S);
     if (DSAChecker.isErrorFound())
       return StmtError();
     // Generate list of implicitly defined firstprivate variables.
index 40f31b84848ae79d534a499ec9da79f189aef1fd..cf497937f3e0be6842cb1a5a94e2e371d3227a39 100644 (file)
@@ -23,5 +23,8 @@ int main(int argc, char **argv) {
   foo();
   #pragma omp target parallel default(shared)
   ++argc;
+  #pragma omp target parallel default(none)
+  #pragma omp parallel default(shared)
+  ++argc;
   return 0;
 }