]> granicus.if.org Git - clang/commitdiff
[OPENMP] Support for re-declarations when checking captured variables.
authorAlexey Bataev <a.bataev@hotmail.com>
Wed, 20 Sep 2017 20:11:31 +0000 (20:11 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Wed, 20 Sep 2017 20:11:31 +0000 (20:11 +0000)
Need to check for variables re-declarations when checking that the
variable was already captured in the captured region.

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

lib/AST/Stmt.cpp
test/OpenMP/target_codegen.cpp

index 2367cadf645c69170ed3268557b953c3b9187598..922ff1f8dea7213e398c0ba26f28b79aa6992f80 100644 (file)
@@ -1114,11 +1114,7 @@ bool CapturedStmt::capturesVariable(const VarDecl *Var) const {
   for (const auto &I : captures()) {
     if (!I.capturesVariable() && !I.capturesVariableByCopy())
       continue;
-
-    // This does not handle variable redeclarations. This should be
-    // extended to capture variables with redeclarations, for example
-    // a thread-private variable in OpenMP.
-    if (I.getCapturedVar() == Var)
+    if (I.getCapturedVar()->getCanonicalDecl() == Var->getCanonicalDecl())
       return true;
   }
 
index c457045c17c74ec4b577d96446fa3c21cc58860a..9d68dd4a1e5bd092fee943ab80eb2c8176b3902b 100644 (file)
@@ -79,6 +79,9 @@ struct TT{
   ty Y;
 };
 
+int global;
+extern int global;
+
 // CHECK: define {{.*}}[[FOO:@.+]](
 int foo(int n) {
   int a = 0;
@@ -109,7 +112,7 @@ int foo(int n) {
   // CHECK:       call void [[HVT1:@.+]](i[[SZ]] {{[^,]+}})
   #pragma omp target if(0)
   {
-    a += 1;
+    global += 1;
   }
 
   // CHECK-DAG:   [[RET:%.+]] = call i32 @__tgt_target(i32 -1, i8* @{{[^,]+}}, i32 1, i8** [[BP:%[^,]+]], i8** [[P:%[^,]+]], i[[SZ]]* getelementptr inbounds ([1 x i[[SZ]]], [1 x i[[SZ]]]* [[SIZET2]], i32 0, i32 0), i32* getelementptr inbounds ([1 x i32], [1 x i32]* [[MAPT2]], i32 0, i32 0))