summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-12-12 04:56:04 +0000
committerChris Lattner <sabre@nondot.org>2008-12-12 04:56:04 +0000
commit81ed6805db67b5b435650334df4bf97ca2cc55f7 (patch)
tree82403d5e1723209f87ea69c6eee08a920051188d
parente5a6d7ddae6c7273fe4f828328b31733957b25e1 (diff)
downloadbcm5719-llvm-81ed6805db67b5b435650334df4bf97ca2cc55f7.tar.gz
bcm5719-llvm-81ed6805db67b5b435650334df4bf97ca2cc55f7.zip
Implement rdar://6138816 - [sema] named bitfields cannot have 0 width
llvm-svn: 60920
-rw-r--r--clang/include/clang/Basic/DiagnosticKinds.def2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp21
-rw-r--r--clang/test/Sema/bitfield.c3
3 files changed, 15 insertions, 11 deletions
diff --git a/clang/include/clang/Basic/DiagnosticKinds.def b/clang/include/clang/Basic/DiagnosticKinds.def
index bba58791d1a..807d32853dd 100644
--- a/clang/include/clang/Basic/DiagnosticKinds.def
+++ b/clang/include/clang/Basic/DiagnosticKinds.def
@@ -1056,6 +1056,8 @@ DIAG(err_implicit_empty_initializer, ERROR,
"initializer for aggregate with no elements requires explicit braces")
DIAG(err_bitfield_has_negative_width, ERROR,
"bit-field %0 has negative width")
+DIAG(err_bitfield_has_zero_width, ERROR,
+ "bit-field %0 has zero width")
DIAG(err_bitfield_width_exceeds_type_size, ERROR,
"size of bit-field %0 exceeds size of its type (%1 bits)")
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 43964f7ccad..29d636fabdc 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -2748,26 +2748,25 @@ static QualType TryToFixInvalidVariablyModifiedType(QualType T,
}
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;
}
diff --git a/clang/test/Sema/bitfield.c b/clang/test/Sema/bitfield.c
index 8d060c5238f..f3b285b12ed 100644
--- a/clang/test/Sema/bitfield.c
+++ b/clang/test/Sema/bitfield.c
@@ -8,4 +8,7 @@ struct a {
int c : (1 + 0.25); // expected-error{{expression is not an integer constant expression}}
int d : (int)(1 + 0.25);
+
+ // rdar://6138816
+ int e : 0; // expected-error {{bit-field 'e' has zero width}}
};
OpenPOWER on IntegriCloud