[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
This commit is contained in:
Alexey Bataev 2017-09-20 20:11:31 +00:00
parent 0f245eccd6
commit e85de8fcf9
2 changed files with 5 additions and 6 deletions

View 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;
}

View 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))