Fix crash during initialization of a bitfield which followed a zero

length element.

Fix some 80-col violations.

llvm-svn: 54610
This commit is contained in:
Daniel Dunbar 2008-08-10 07:00:24 +00:00
parent 63fed4f35e
commit 07bb087ac1
2 changed files with 19 additions and 2 deletions

View File

@ -132,7 +132,8 @@ public:
// Calculate information about the relevant field
const llvm::Type* Ty = CI->getType();
unsigned size = CGM.getTypes().getTargetData().getTypeStoreSizeInBits(Ty);
const llvm::TargetData &TD = CGM.getTypes().getTargetData();
unsigned size = TD.getTypeStoreSizeInBits(Ty);
unsigned fieldOffset = CGM.getTypes().getLLVMFieldNo(Field) * size;
CodeGenTypes::BitFieldInfo bitFieldInfo =
CGM.getTypes().getBitFieldInfo(Field);
@ -143,7 +144,12 @@ public:
// FIXME: This won't work if the struct isn't completely packed!
unsigned offset = 0, i = 0;
while (offset < (fieldOffset & -8))
offset += CGM.getTypes().getTargetData().getTypeStoreSizeInBits(Elts[i++]->getType());
offset += TD.getTypeStoreSizeInBits(Elts[i++]->getType());
// Advance over 0 sized elements (must terminate in bounds since
// the bitfield must have a size).
while (TD.getTypeStoreSizeInBits(Elts[i]->getType()) == 0)
++i;
// Promote the size of V if necessary
// FIXME: This should never occur, but currently it can because

View File

@ -0,0 +1,11 @@
// RUN: clang --emit-llvm -o %t %s &&
// RUN: grep "i8 52" %s | count 1
struct et7 {
float lv7[0];
char mv7:6;
} yv7 = {
{},
52,
};