[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.

llvm-svn: 340181
This commit is contained in:
Alexey Bataev 2018-08-20 16:00:22 +00:00
parent 6ef4fafef8
commit 7b1a7bd5ba
2 changed files with 17 additions and 1 deletions

View File

@ -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(),

View File

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