forked from OSchip/llvm-project
Implement rdar://6138816 - [sema] named bitfields cannot have 0 width
llvm-svn: 60920
This commit is contained in:
parent
e5a6d7ddae
commit
81ed6805db
|
@ -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)")
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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}}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue