From: Eli Friedman Date: Sat, 1 Aug 2009 23:11:24 +0000 (+0000) Subject: Fix a minor issue with unions in the new struct building code. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c0879bbbe06f1983f1291669dcc1d451767c601c;p=clang Fix a minor issue with unions in the new struct building code. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77829 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index cdc8bdb970..dbb1bdcc6e 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -270,7 +270,7 @@ class VISIBILITY_HIDDEN ConstStructBuilder { AppendPadding(NumPadBytes); } - bool Build(const InitListExpr *ILE) { + bool Build(InitListExpr *ILE) { RecordDecl *RD = ILE->getType()->getAs()->getDecl(); const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); @@ -280,6 +280,9 @@ class VISIBILITY_HIDDEN ConstStructBuilder { FieldEnd = RD->field_end(); ElementNo < ILE->getNumInits() && Field != FieldEnd; ++Field, ++FieldNo) { + if (RD->isUnion() && ILE->getInitializedFieldInUnion() != *Field) + continue; + if (Field->isBitField()) { if (!Field->getIdentifier()) continue; @@ -330,7 +333,7 @@ class VISIBILITY_HIDDEN ConstStructBuilder { public: static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF, - const InitListExpr *ILE) { + InitListExpr *ILE) { ConstStructBuilder Builder(CGM, CGF); if (!Builder.Build(ILE)) diff --git a/test/CodeGen/union-init2.c b/test/CodeGen/union-init2.c new file mode 100644 index 0000000000..b167f8026a --- /dev/null +++ b/test/CodeGen/union-init2.c @@ -0,0 +1,4 @@ +// RUN: clang-cc -emit-llvm %s -o - | not grep ptrtoint + +// Make sure we generate something sane instead of a ptrtoint +union x {long long b;union x* a;} r = {.a = &r};