mirror of https://github.com/microsoft/clang.git
[OPENMP][BLOCKS]Fix PR38923: reference to a global variable is captured
by a block. Added checks for capturing of the variable in the block when trying to emit correct address for the variable with the reference type. This extra check allows correctly identify the variables that are not captured in the block context. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@340181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7a2e99a914
commit
5b14cddec6
|
@ -2437,6 +2437,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
|
|||
// A DeclRefExpr for a reference initialized by a constant expression can
|
||||
// appear without being odr-used. Directly emit the constant initializer.
|
||||
const Expr *Init = VD->getAnyInitializer(VD);
|
||||
const auto *BD = dyn_cast_or_null<BlockDecl>(CurCodeDecl);
|
||||
if (Init && !isa<ParmVarDecl>(VD) && VD->getType()->isReferenceType() &&
|
||||
VD->isUsableInConstantExpressions(getContext()) &&
|
||||
VD->checkInitIsICE() &&
|
||||
|
@ -2446,7 +2447,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
|
|||
(LocalDeclMap.count(VD->getCanonicalDecl()) ||
|
||||
CapturedStmtInfo->lookup(VD->getCanonicalDecl()))) ||
|
||||
LambdaCaptureFields.lookup(VD->getCanonicalDecl()) ||
|
||||
isa<BlockDecl>(CurCodeDecl)))) {
|
||||
(BD && BD->capturesVariable(VD))))) {
|
||||
llvm::Constant *Val =
|
||||
ConstantEmitter(*this).emitAbstract(E->getLocation(),
|
||||
*VD->evaluateValue(),
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang_cc1 %s -fblocks -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - | FileCheck %s
|
||||
// REQUIRES: x86-registered-target
|
||||
|
||||
// CHECK: @b = global i32 0,
|
||||
|
||||
// CHECK: define {{.*}}void @{{.*}}test{{.*}}_block_invoke(
|
||||
// CHECK: store i32 2, i32* @b,
|
||||
// CHECK: ret void
|
||||
|
||||
int b;
|
||||
|
||||
void test() {
|
||||
int &a = b;
|
||||
^{ a = 2; };
|
||||
}
|
Loading…
Reference in New Issue