forked from OSchip/llvm-project
[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:
parent
d128fff5df
commit
d558aa8627
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue