summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-09-03 23:07:53 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-09-03 23:07:53 +0000
commit469a20de757ff872c90ff6b1134f6346909ff652 (patch)
treef62940cbeebc4b234743044db4827de3df4b963d
parent030ef472f31709e175895853fcb43d61d09022c7 (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.cpp2
-rw-r--r--lib/CodeGen/CGExpr.cpp18
-rw-r--r--lib/CodeGen/CGExprScalar.cpp2
-rw-r--r--test/SemaCXX/blocks.cpp7
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;
}
}