diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 605c01d52b2b..b74937e9ca13 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -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(CurCodeDecl); if (Init && !isa(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(CurCodeDecl)))) { + (BD && BD->capturesVariable(VD))))) { llvm::Constant *Val = ConstantEmitter(*this).emitAbstract(E->getLocation(), *VD->evaluateValue(), diff --git a/clang/test/CodeGenCXX/block-byref.cpp b/clang/test/CodeGenCXX/block-byref.cpp new file mode 100644 index 000000000000..1cb86a547573 --- /dev/null +++ b/clang/test/CodeGenCXX/block-byref.cpp @@ -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; }; +}