]> granicus.if.org Git - clang/commitdiff
Fix crash during initialization of a bitfield which followed a zero
authorDaniel Dunbar <daniel@zuster.org>
Sun, 10 Aug 2008 07:00:24 +0000 (07:00 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sun, 10 Aug 2008 07:00:24 +0000 (07:00 +0000)
  length element.

Fix some 80-col violations.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54610 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprConstant.cpp
test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c [new file with mode: 0644]

index d58d0046072c2916755e9c600b3f9ae72f5a96d1..095153229e644090c3fb515bd0780730facc8a6d 100644 (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
diff --git a/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c b/test/CodeGen/2008-07-22-bitfield-init-after-zero-len-array.c
new file mode 100644 (file)
index 0000000..d8b7adc
--- /dev/null
@@ -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, 
+};
+