diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-08-01 23:11:24 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-08-01 23:11:24 +0000 |
commit | 62561fe9b03b05108754cfd4a292e3acc029a8c1 (patch) | |
tree | 58e29ce663f120d441dd2e5bf54586c936f5f4fd /clang/lib/CodeGen/CGExprConstant.cpp | |
parent | 5a283bf8481d0804dc6a27f68d625c289a274a29 (diff) | |
download | bcm5719-llvm-62561fe9b03b05108754cfd4a292e3acc029a8c1.tar.gz bcm5719-llvm-62561fe9b03b05108754cfd4a292e3acc029a8c1.zip |
Fix a minor issue with unions in the new struct building code.
llvm-svn: 77829
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index cdc8bdb9701..dbb1bdcc6e3 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/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<RecordType>()->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)) |