diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2008-08-10 07:00:24 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-10 07:00:24 +0000 |
| commit | 07bb087ac1aa5075081d93be440d74d5ddda0d6a (patch) | |
| tree | 05fc4bb8941377ae3b99ae32979a55c05f7bced7 | |
| parent | 63fed4f35e410b1b3ec4bb957a1542e3b56214c0 (diff) | |
| download | bcm5719-llvm-07bb087ac1aa5075081d93be440d74d5ddda0d6a.tar.gz bcm5719-llvm-07bb087ac1aa5075081d93be440d74d5ddda0d6a.zip | |
Fix crash during initialization of a bitfield which followed a zero
length element.
Fix some 80-col violations.
llvm-svn: 54610
| -rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 10 | ||||
| -rw-r--r-- | clang/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c | 11 |
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index d58d0046072..095153229e6 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -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 diff --git a/clang/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c b/clang/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c new file mode 100644 index 00000000000..d8b7adcacf7 --- /dev/null +++ b/clang/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c @@ -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, +}; + |

