[MS ABI] Overwide bool bitfields should be permitted

Overwide bool bitfields have eight bits of storage size, make sure we
take the padding into account when determining whether or not they are
problematic.

llvm-svn: 247651
This commit is contained in:
David Majnemer 2015-09-15 01:00:55 +00:00
parent d128fff5df
commit d558aa8627
2 changed files with 9 additions and 6 deletions

View File

@ -12626,11 +12626,14 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc,
}
if (!FieldTy->isDependentType()) {
uint64_t TypeWidth = Context.getIntWidth(FieldTy);
bool UseMSBitfieldSemantics =
IsMsStruct || Context.getTargetInfo().getCXXABI().isMicrosoft();
bool UseStorageSize = getLangOpts().CPlusPlus && UseMSBitfieldSemantics;
uint64_t TypeWidth = UseStorageSize ? Context.getTypeSize(FieldTy)
: Context.getIntWidth(FieldTy);
if (Value.ugt(TypeWidth)) {
if (!getLangOpts().CPlusPlus || IsMsStruct ||
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
if (FieldName)
if (!getLangOpts().CPlusPlus || UseMSBitfieldSemantics) {
if (FieldName)
return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
<< FieldName << (unsigned)Value.getZExtValue()
<< (unsigned)TypeWidth;

View File

@ -3,8 +3,8 @@
struct A {
char a : 9; // expected-error{{width of bit-field 'a' (9 bits) exceeds width of its type (8 bits)}}
int b : 33; // expected-error{{width of bit-field 'b' (33 bits) exceeds width of its type (32 bits)}}
bool c : 9; // expected-error{{width of bit-field 'c' (9 bits) exceeds width of its type (1 bit)}}
bool d : 3; // expected-error{{width of bit-field 'd' (3 bits) exceeds width of its type (1 bit)}}
bool c : 9; // expected-error{{width of bit-field 'c' (9 bits) exceeds width of its type (8 bits)}}
bool d : 3;
};
int a[sizeof(A) == 1 ? 1 : -1];