From 7925561e702430c0d632c5e5db1a74673b44ea18 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 3 Sep 2010 21:36:02 +0000 Subject: Cope with llvm's reference to bool type of 'i1' vs. clang's type of 'i8' for the same for __block variables of type bool. refixes radar 8382559. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113015 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGExpr.cpp | 17 +++++++++++++++++ test/SemaCXX/blocks.cpp | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 06c657fa92..b4d0e13993 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -335,6 +335,23 @@ CodeGenFunction::EmitReferenceBindingToExpr(const Expr* E, llvm::Value *Value = EmitExprForReferenceBinding(*this, E, ReferenceTemporary, ReferenceTemporaryDtor, InitializedDecl); + if (E->getType()->isBooleanType()) { + // special handling for __block variable of bool type bound to + // a reference type. + bool block_byref_var = false; + if (const BlockDeclRefExpr *BE = dyn_cast(E)) + block_byref_var = BE->isByRef(); + else if (const DeclRefExpr *BD = dyn_cast(E)) { + const NamedDecl *ND = BD->getDecl(); + if (const VarDecl *VD = dyn_cast(ND)) + block_byref_var = VD->hasAttr(); + } + if (block_byref_var) { + const llvm::Type *T = ConvertTypeForMem(E->getType()); + T = llvm::PointerType::getUnqual(T); + Value = Builder.CreateBitCast(Value, T); + } + } if (!ReferenceTemporaryDtor) return RValue::get(Value); diff --git a/test/SemaCXX/blocks.cpp b/test/SemaCXX/blocks.cpp index baa79e7d89..4fd9941a2e 100644 --- a/test/SemaCXX/blocks.cpp +++ b/test/SemaCXX/blocks.cpp @@ -41,3 +41,23 @@ namespace test2 { return Power(2).calculate(10); } } + +// rdar: // 8382559 +namespace radar8382559 { + void func(bool& outHasProperty); + + int test3() { + __attribute__((__blocks__(byref))) bool hasProperty = false; + bool (^b)() = ^ { + func(hasProperty); + if (hasProperty) + hasProperty = 0; + return hasProperty; + }; + func(hasProperty); + b(); + if (hasProperty) + hasProperty = 1; + return hasProperty = 1; + } +} -- cgit v1.2.3