Implement rdar://6138816 - [sema] named bitfields cannot have 0 width


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60920 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 43964f7..29d636f 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -2748,26 +2748,25 @@
 }
 
 bool Sema::VerifyBitField(SourceLocation FieldLoc, IdentifierInfo *FieldName, 
-                          QualType FieldTy, const Expr *BitWidth)
-{
+                          QualType FieldTy, const Expr *BitWidth) {
   // FIXME: 6.7.2.1p4 - verify the field type.
   
   llvm::APSInt Value;
   if (VerifyIntegerConstantExpression(BitWidth, &Value))
     return true;
 
-  if (Value.isNegative()) {
-    Diag(FieldLoc, diag::err_bitfield_has_negative_width) << FieldName;
-    return true;
-  }
+  // Zero-width bitfield is ok for anonymous field.
+  if (Value == 0 && FieldName)
+    return Diag(FieldLoc, diag::err_bitfield_has_zero_width) << FieldName;
+  
+  if (Value.isNegative())
+    return Diag(FieldLoc, diag::err_bitfield_has_negative_width) << FieldName;
 
   uint64_t TypeSize = Context.getTypeSize(FieldTy);
   // FIXME: We won't need the 0 size once we check that the field type is valid.
-  if (TypeSize && Value.getZExtValue() > TypeSize) {
-    Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_size) << 
-         FieldName << (unsigned)TypeSize;
-    return true;
-  }
+  if (TypeSize && Value.getZExtValue() > TypeSize)
+    return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_size)
+       << FieldName << (unsigned)TypeSize;
 
   return false;
 }