summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-02-22 05:38:59 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-02-22 05:38:59 +0000
commit91d5bb1ee5e795dbad776856188f60a195d05d5a (patch)
tree633093d86ee27f1932ebc86fca5b755e4c90504d /clang
parent3cd25390e5737111d3143572c5ba377f9dc91258 (diff)
downloadbcm5719-llvm-91d5bb1ee5e795dbad776856188f60a195d05d5a.tar.gz
bcm5719-llvm-91d5bb1ee5e795dbad776856188f60a195d05d5a.zip
Make sure null initialization in arrays works correctly with ARC types. <rdar://problem/10907547>.
llvm-svn: 151133
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGExprAgg.cpp9
-rw-r--r--clang/test/CodeGenObjC/arc.m12
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp
index 5fb334bd8e8..80d754a98a4 100644
--- a/clang/lib/CodeGen/CGExprAgg.cpp
+++ b/clang/lib/CodeGen/CGExprAgg.cpp
@@ -853,9 +853,14 @@ void AggExprEmitter::EmitNullInitializationToLValue(LValue lv) {
return;
if (!CGF.hasAggregateLLVMType(type)) {
- // For non-aggregates, we can store zero
+ // For non-aggregates, we can store zero.
llvm::Value *null = llvm::Constant::getNullValue(CGF.ConvertType(type));
- CGF.EmitStoreThroughLValue(RValue::get(null), lv);
+ // Note that the following is not equivalent to
+ // EmitStoreThroughBitfieldLValue for ARC types.
+ if (lv.isBitField())
+ CGF.EmitStoreThroughBitfieldLValue(RValue::get(null), lv);
+ assert(lv.isSimple());
+ CGF.EmitStoreOfScalar(null, lv, /* isInitialization */ true);
} else {
// There's a potential optimization opportunity in combining
// memsets; that would be easy for arrays, but relatively
diff --git a/clang/test/CodeGenObjC/arc.m b/clang/test/CodeGenObjC/arc.m
index 97abb472437..1db00affe82 100644
--- a/clang/test/CodeGenObjC/arc.m
+++ b/clang/test/CodeGenObjC/arc.m
@@ -1533,3 +1533,15 @@ void test68(void) {
// CHECK: [[T0:%.*]] = load [[TEST69]]** [[SELF]], align 8
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST69]]* [[T0]] to i8*
// CHECK-NEXT: ret i8* [[T1]]
+
+// rdar://problem/10907547
+void test70(id i) {
+ // CHECK: define void @test70
+ // CHECK: store i8* null, i8**
+ // CHECK: store i8* null, i8**
+ // CHECK: [[ID:%.*]] = call i8* @objc_retain(i8*
+ // CHECK: store i8* [[ID]], i8**
+ id x[3] = {
+ [2] = i
+ };
+}
OpenPOWER on IntegriCloud