]> granicus.if.org Git - clang/commitdiff
Fix a minor issue with unions in the new struct building code.
authorEli Friedman <eli.friedman@gmail.com>
Sat, 1 Aug 2009 23:11:24 +0000 (23:11 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 1 Aug 2009 23:11:24 +0000 (23:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77829 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprConstant.cpp
test/CodeGen/union-init2.c [new file with mode: 0644]

index cdc8bdb97013c70d13f5509421cc8750a6b6fa38..dbb1bdcc6e3d609cf6d3eeeb9ee7a0bfb0096c78 100644 (file)
@@ -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 (file)
index 0000000..b167f80
--- /dev/null
@@ -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};