From: Eli Friedman Date: Sun, 14 Jun 2009 21:41:37 +0000 (+0000) Subject: PR4390: Make sure to handle anonymous unions correctly while building X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4c4c527dc1877999dd2bdae74ae9ffbddedaf819;p=clang PR4390: Make sure to handle anonymous unions correctly while building static intializers for structs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73349 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 0e21a00f30..0b109f9bee 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -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 index 0000000000..8d1831a4f3 --- /dev/null +++ b/test/CodeGen/2009-06-14-anonymous-union-init.c @@ -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 };