]> granicus.if.org Git - clang/commitdiff
PR4390: Make sure to handle anonymous unions correctly while building
authorEli Friedman <eli.friedman@gmail.com>
Sun, 14 Jun 2009 21:41:37 +0000 (21:41 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 14 Jun 2009 21:41:37 +0000 (21:41 +0000)
static intializers for structs.

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

lib/CodeGen/CGExprConstant.cpp
test/CodeGen/2009-06-14-anonymous-union-init.c [new file with mode: 0644]

index 0e21a00f30fe2c0d05c0c50dc30c0355c7c861fe..0b109f9bee42a49077ce620ed381b5d8782225c3 100644 (file)
@@ -198,16 +198,13 @@ public:
 
     // Copy initializer elements. Skip padding fields.
     unsigned EltNo = 0;  // Element no in ILE
-    int FieldNo = 0; // Field no in RecordDecl
     bool RewriteType = false;
     for (RecordDecl::field_iterator Field = RD->field_begin(CGM.getContext()),
                                  FieldEnd = RD->field_end(CGM.getContext());
          EltNo < ILE->getNumInits() && Field != FieldEnd; ++Field) {
-      FieldNo++;
-      if (!Field->getIdentifier())
-        continue;
-
       if (Field->isBitField()) {
+        if (!Field->getIdentifier())
+          continue;
         InsertBitfieldIntoStruct(Elts, *Field, ILE->getInit(EltNo));
       } else {
         unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(*Field);
diff --git a/test/CodeGen/2009-06-14-anonymous-union-init.c b/test/CodeGen/2009-06-14-anonymous-union-init.c
new file mode 100644 (file)
index 0000000..8d1831a
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: clang-cc -emit-llvm < %s | grep "zeroinitializer, i16 16877"
+// PR4390
+struct sysfs_dirent {
+ union { struct sysfs_elem_dir {} s_dir; };
+ unsigned short s_mode;
+};
+struct sysfs_dirent sysfs_root = { {}, 16877 };