diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-09-03 23:07:53 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-09-03 23:07:53 +0000 |
commit | 469a20de757ff872c90ff6b1134f6346909ff652 (patch) | |
tree | f62940cbeebc4b234743044db4827de3df4b963d | |
parent | 030ef472f31709e175895853fcb43d61d09022c7 (diff) |
Truncate block variable of bool type to i1 when its
value is used. This matches with non-block variable
use of bool type. (Fixes radar 8390062).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113027 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGDecl.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 18 | ||||
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/blocks.cpp | 7 |
4 files changed, 9 insertions, 20 deletions
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 5017ce720c..57e5236c67 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -373,7 +373,7 @@ const llvm::Type *CodeGenFunction::BuildByRefType(const ValueDecl *D) { } // T x; - Types.push_back(ConvertType(Ty)); + Types.push_back(ConvertTypeForMem(Ty)); const llvm::Type *T = llvm::StructType::get(VMContext, Types, Packed); diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index b4d0e13993..3750ab80c3 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -335,24 +335,6 @@ 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<BlockDeclRefExpr>(E)) - block_byref_var = BE->isByRef(); - else if (const DeclRefExpr *BD = dyn_cast<DeclRefExpr>(E)) { - const NamedDecl *ND = BD->getDecl(); - if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) - block_byref_var = VD->hasAttr<BlocksAttr>(); - } - 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/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 4e16f66ba4..2318cc4e9a 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -1118,7 +1118,7 @@ Value *ScalarExprEmitter::VisitBlockDeclRefExpr(const BlockDeclRefExpr *E) { llvm::Value *V = CGF.GetAddrOfBlockDecl(E); if (E->getType().isObjCGCWeak()) return CGF.CGM.getObjCRuntime().EmitObjCWeakRead(CGF, V); - return Builder.CreateLoad(V, "tmp"); + return CGF.EmitLoadOfScalar(V, false, 0, E->getType()); } //===----------------------------------------------------------------------===// diff --git a/test/SemaCXX/blocks.cpp b/test/SemaCXX/blocks.cpp index 4fd9941a2e..adbff553e6 100644 --- a/test/SemaCXX/blocks.cpp +++ b/test/SemaCXX/blocks.cpp @@ -48,16 +48,23 @@ namespace radar8382559 { int test3() { __attribute__((__blocks__(byref))) bool hasProperty = false; + bool has = true; + bool (^b)() = ^ { func(hasProperty); if (hasProperty) hasProperty = 0; + if (has) + hasProperty = 1; return hasProperty; }; func(hasProperty); + func(has); b(); if (hasProperty) hasProperty = 1; + if (has) + has = 2; return hasProperty = 1; } } |