diff options
author | Chris Lattner <sabre@nondot.org> | 2008-12-12 04:56:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-12-12 04:56:04 +0000 |
commit | 81ed6805db67b5b435650334df4bf97ca2cc55f7 (patch) | |
tree | 82403d5e1723209f87ea69c6eee08a920051188d | |
parent | e5a6d7ddae6c7273fe4f828328b31733957b25e1 (diff) | |
download | bcm5719-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.def | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 21 | ||||
-rw-r--r-- | clang/test/Sema/bitfield.c | 3 |
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}} }; |