aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-08-01 23:11:24 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-08-01 23:11:24 +0000
commitc0879bbbe06f1983f1291669dcc1d451767c601c (patch)
tree622939a3fdbc28e19774c96efe0ad904f222904e
parent414be149b04b2af79fd2a7c9d26b3ab05d63cfc7 (diff)
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
-rw-r--r--lib/CodeGen/CGExprConstant.cpp7
-rw-r--r--test/CodeGen/union-init2.c4
2 files changed, 9 insertions, 2 deletions
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<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))
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};