Commit 7a72546f authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r340181:

------------------------------------------------------------------------
r340181 | abataev | 2018-08-20 18:00:22 +0200 (Mon, 20 Aug 2018) | 7 lines

[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: 340352
parent d8568622
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -2408,6 +2408,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() &&
@@ -2417,7 +2418,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(),
+15 −0
Original line number Diff line number Diff line
// 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; };
}