[OPENMP] Handle re-declaration of captured variables in CodeGen.
If the captured variable has re-declaration we may end up with the situation where the captured variable is the re-declaration while the referenced variable is the canonical declaration (or vice versa). In this case we may generate wrong code. Patch fixes this situation. llvm-svn: 313995
This commit is contained in:
parent
09273239d1
commit
b7f18c3297
|
@ -263,9 +263,9 @@ public:
|
|||
if (I->capturesThis())
|
||||
CXXThisFieldDecl = *Field;
|
||||
else if (I->capturesVariable())
|
||||
CaptureFields[I->getCapturedVar()] = *Field;
|
||||
CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field;
|
||||
else if (I->capturesVariableByCopy())
|
||||
CaptureFields[I->getCapturedVar()] = *Field;
|
||||
CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -279,7 +279,7 @@ public:
|
|||
|
||||
/// \brief Lookup the captured field decl for a variable.
|
||||
virtual const FieldDecl *lookup(const VarDecl *VD) const {
|
||||
return CaptureFields.lookup(VD);
|
||||
return CaptureFields.lookup(VD->getCanonicalDecl());
|
||||
}
|
||||
|
||||
bool isCXXThisExprCaptured() const { return getThisFieldDecl() != nullptr; }
|
||||
|
|
|
@ -110,7 +110,7 @@ int foo(int n) {
|
|||
// CHECK: [[RET2:%.+]] = load i32, i32* [[RHV]], align 4
|
||||
// CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET2]], 0
|
||||
// CHECK: call void [[HVT1:@.+]](i[[SZ]] {{[^,]+}})
|
||||
#pragma omp target if(0)
|
||||
#pragma omp target if(0) firstprivate(global)
|
||||
{
|
||||
global += 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue