}
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;
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];