aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGExprConstant.cpp17
-rw-r--r--test/CodeGen/cast-to-union.c4
2 files changed, 12 insertions, 9 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index 4f1f58fefd..43284b5173 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -243,15 +243,18 @@ public:
Types.push_back(C->getType());
unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType());
unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty);
- while (CurSize < TotalSize) {
- Elts.push_back(VMContext.getNullValue(llvm::Type::Int8Ty));
- Types.push_back(llvm::Type::Int8Ty);
- CurSize++;
+
+ assert(CurSize <= TotalSize && "Union size mismatch!");
+ if (unsigned NumPadBytes = TotalSize - CurSize) {
+ const llvm::Type *Ty = llvm::Type::Int8Ty;
+ if (NumPadBytes > 1)
+ Ty = VMContext.getArrayType(Ty, NumPadBytes);
+
+ Elts.push_back(VMContext.getNullValue(Ty));
+ Types.push_back(Ty);
}
- // This always generates a packed struct
- // FIXME: Try to generate an unpacked struct when we can
- llvm::StructType* STy = VMContext.getStructType(Types, true);
+ llvm::StructType* STy = VMContext.getStructType(Types, false);
return VMContext.getConstantStruct(STy, Elts);
}
diff --git a/test/CodeGen/cast-to-union.c b/test/CodeGen/cast-to-union.c
index 6098bcc5a0..39644c0c99 100644
--- a/test/CodeGen/cast-to-union.c
+++ b/test/CodeGen/cast-to-union.c
@@ -1,7 +1,7 @@
// RUN: clang-cc -emit-llvm < %s -o %t &&
// RUN: grep "store i32 351, i32*" %t &&
-// RUN: grep "w = global %0 <{ i32 2, i8 0, i8 0, i8 0, i8 0 }>" %t &&
-// RUN: grep "y = global %1 <{ double 7.300000e+01 }>" %t
+// RUN: grep "w = global %0 { i32 2, \[4 x i8\] zeroinitializer }" %t &&
+// RUN: grep "y = global %1 { double 7.300000e+01 }" %t
union u { int i; double d; };