Merged to 7.0 in r340352.
On Mon, Aug 20, 2018 at 9:00 AM, Alexey Bataev via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: abataev > Date: Mon Aug 20 09:00:22 2018 > New Revision: 340181 > > URL: http://llvm.org/viewvc/llvm-project?rev=340181&view=rev > Log: > [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. > > Added: > cfe/trunk/test/CodeGenCXX/block-byref.cpp > Modified: > cfe/trunk/lib/CodeGen/CGExpr.cpp > > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=340181&r1=340180&r2=340181&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Aug 20 09:00:22 2018 > @@ -2437,6 +2437,7 @@ LValue CodeGenFunction::EmitDeclRefLValu > // 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::EmitDeclRefLValu > (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(), > > Added: cfe/trunk/test/CodeGenCXX/block-byref.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/block-byref.cpp?rev=340181&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/block-byref.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/block-byref.cpp Mon Aug 20 09:00:22 2018 > @@ -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; }; > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits