diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2008-08-06 05:32:55 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-06 05:32:55 +0000 |
| commit | e8bdce441bd413ff91787dd4514c397bdccabf82 (patch) | |
| tree | 0c650fe6cdf025712433bc90dfef4812b11a47a8 | |
| parent | 7bdaecb7f497fa82f13fb640a4bc1e6a5245ede8 (diff) | |
| download | bcm5719-llvm-e8bdce441bd413ff91787dd4514c397bdccabf82.tar.gz bcm5719-llvm-e8bdce441bd413ff91787dd4514c397bdccabf82.zip | |
Fix EmitNullInitializationToLValue for bitfield lvalues.
- PR2643
llvm-svn: 54397
| -rw-r--r-- | clang/lib/CodeGen/CGExprAgg.cpp | 6 | ||||
| -rw-r--r-- | clang/test/CodeGen/PR2643-null-store-to-bitfield.c | 10 |
2 files changed, 12 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index df90ee09f5c..e51a852451e 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -340,10 +340,8 @@ void AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV) { void AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) { if (!CGF.hasAggregateLLVMType(T)) { // For non-aggregates, we can store zero - const llvm::Type *T = - cast<llvm::PointerType>(LV.getAddress()->getType())->getElementType(); - // FIXME: volatility - Builder.CreateStore(llvm::Constant::getNullValue(T), LV.getAddress()); + llvm::Value *Null = llvm::Constant::getNullValue(CGF.ConvertType(T)); + CGF.EmitStoreThroughLValue(RValue::get(Null), LV, T); } else { // Otherwise, just memset the whole thing to zero. This is legal // because in LLVM, all default initializers are guaranteed to have a diff --git a/clang/test/CodeGen/PR2643-null-store-to-bitfield.c b/clang/test/CodeGen/PR2643-null-store-to-bitfield.c new file mode 100644 index 00000000000..4fef84255a5 --- /dev/null +++ b/clang/test/CodeGen/PR2643-null-store-to-bitfield.c @@ -0,0 +1,10 @@ +// RUN: clang -emit-llvm -o - %s +// PR2643 + +void foo() { + struct { + int a : 1; + int b : 1; + } entry = {0}; +} + |

