From e85de8fcf9c0ea5f878140c2801be67a3663a518 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Wed, 20 Sep 2017 20:11:31 +0000 Subject: [PATCH] [OPENMP] Support for re-declarations when checking captured variables. Need to check for variables re-declarations when checking that the variable was already captured in the captured region. llvm-svn: 313805 --- clang/lib/AST/Stmt.cpp | 6 +----- clang/test/OpenMP/target_codegen.cpp | 5 ++++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index 2367cad..922ff1f 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -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; } diff --git a/clang/test/OpenMP/target_codegen.cpp b/clang/test/OpenMP/target_codegen.cpp index c457045..9d68dd4 100644 --- a/clang/test/OpenMP/target_codegen.cpp +++ b/clang/test/OpenMP/target_codegen.cpp @@ -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)) -- 2.7.4