aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGExprAgg.cpp8
-rw-r--r--test/CodeGen/init.c7
2 files changed, 12 insertions, 3 deletions
diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp
index 6ea21ec47a..d620d3b953 100644
--- a/lib/CodeGen/CGExprAgg.cpp
+++ b/lib/CodeGen/CGExprAgg.cpp
@@ -857,10 +857,12 @@ void AggExprEmitter::EmitNullInitializationToLValue(LValue lv) {
llvm::Value *null = llvm::Constant::getNullValue(CGF.ConvertType(type));
// Note that the following is not equivalent to
// EmitStoreThroughBitfieldLValue for ARC types.
- if (lv.isBitField())
+ if (lv.isBitField()) {
CGF.EmitStoreThroughBitfieldLValue(RValue::get(null), lv);
- assert(lv.isSimple());
- CGF.EmitStoreOfScalar(null, lv, /* isInitialization */ true);
+ } else {
+ 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/test/CodeGen/init.c b/test/CodeGen/init.c
index 599b4f23db..426233d8df 100644
--- a/test/CodeGen/init.c
+++ b/test/CodeGen/init.c
@@ -123,3 +123,10 @@ struct test12 {
struct test12 (*p)(void);
} test12g;
+
+void test13(int x) {
+ struct X { int a; int b : 10; int c; };
+ struct X y = {.c = x};
+ // CHECK: @test13
+ // CHECK: and i32 {{.*}}, -1024
+}