]> granicus.if.org Git - clang/commitdiff
Only the first zero-length bitfield decides alignment of
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 3 May 2011 22:07:14 +0000 (22:07 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 3 May 2011 22:07:14 +0000 (22:07 +0000)
the followup data member in an ms_struct struct.
// rdar:// 8823265

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130795 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
lib/AST/RecordLayoutBuilder.cpp
test/CodeGen/ms_struct-bitfield-1.c

index 8316ea68e9e46cf1ac2a52957f7b05b69a5d35e2..287c8b2af6ef33bb21b37baae79afb049c4f312e 100644 (file)
@@ -546,7 +546,8 @@ bool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD,
 bool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD,
                                              const FieldDecl *LastFD) const {
   return (FD->isBitField() && LastFD && LastFD->isBitField() &&
-          FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() == 0);
+          FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() == 0 &&
+          LastFD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() != 0);
 
 }
 
index 810f11b6e3ae4eea73a2a473109c211027b612a8..2203ed13243512a44fb861024c4a853159266a3d 100644 (file)
@@ -1359,9 +1359,11 @@ void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
       std::pair<uint64_t, unsigned> FieldInfo = 
         Context.getTypeInfo(ZeroLengthBitfield->getType());
       unsigned ZeroLengthBitfieldAlignment = FieldInfo.second;
-      if (ZeroLengthBitfieldAlignment > FieldAlign)
+      // Ignore alignment of subsequent zero-length bitfields.
+      if ((ZeroLengthBitfieldAlignment > FieldAlign) || (FieldSize == 0))
         FieldAlign = ZeroLengthBitfieldAlignment;
-      ZeroLengthBitfield = 0;
+      if (FieldSize)
+        ZeroLengthBitfield = 0;
     }
   }
 
index 10c6e2aed35872cea0f8ba45db57b4aa0cd2f211..0b15a24f0337dd0be08d2168d718df7e7d03e4dc 100644 (file)
@@ -43,3 +43,49 @@ struct
 } ATTR t5;
 static int a5[(sizeof(t5) == 4) -1];
 
+struct
+{
+                   char foo : 4;
+                   short : 0;
+                   long  :0;
+                   char bar;
+} ATTR t6;
+static int a6[(sizeof(t6) == 4) -1];
+
+struct
+{
+                   char foo : 4;
+                   long  :0;
+                   short : 0;
+                   char bar;
+} ATTR t7;
+static int a7[(sizeof(t7) == 16) -1];
+
+struct
+{
+                   char foo : 4;
+                   short : 0;
+                   long  :0;
+                   char bar:7;
+} ATTR t8;
+static int a8[(sizeof(t8) == 4) -1];
+
+struct
+{
+                   char foo : 4;
+                   long  :0;
+                   short : 0;
+                   char bar: 8;
+} ATTR t9;
+static int a9[(sizeof(t9) == 16) -1];
+
+struct
+{
+                   char foo : 4;
+                   char : 0;
+                   short : 0;
+                   int : 0;
+                   long  :0;
+                   char bar;
+} ATTR t10;
+static int a10[(sizeof(t10) == 2) -1];