r247659 - [MS ABI] Restore our warning for overwide bitfields using the MS ABI
David Majnemer via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 14 19:36:41 PDT 2015
Author: majnemer
Date: Mon Sep 14 21:36:41 2015
New Revision: 247659
URL: http://llvm.org/viewvc/llvm-project?rev=247659&view=rev
Log:
[MS ABI] Restore our warning for overwide bitfields using the MS ABI
This restores a diagnostic lost in r247651.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=247659&r1=247658&r2=247659&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Sep 14 21:36:41 2015
@@ -12626,29 +12626,36 @@ ExprResult Sema::VerifyBitField(SourceLo
}
if (!FieldTy->isDependentType()) {
- 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 || UseMSBitfieldSemantics) {
- if (FieldName)
- return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
- << FieldName << (unsigned)Value.getZExtValue()
- << (unsigned)TypeWidth;
-
- return Diag(FieldLoc, diag::err_anon_bitfield_width_exceeds_type_width)
- << (unsigned)Value.getZExtValue() << (unsigned)TypeWidth;
- }
-
+ uint64_t TypeStorageSize = Context.getTypeSize(FieldTy);
+ uint64_t TypeWidth = Context.getIntWidth(FieldTy);
+ bool BitfieldIsOverwide = Value.ugt(TypeWidth);
+
+ // Over-wide bitfields are an error in C or when using the MSVC bitfield
+ // ABI.
+ bool CStdConstraintViolation =
+ BitfieldIsOverwide && !getLangOpts().CPlusPlus;
+ bool MSBitfieldViolation =
+ Value.ugt(TypeStorageSize) &&
+ (IsMsStruct || Context.getTargetInfo().getCXXABI().isMicrosoft());
+ if (CStdConstraintViolation || MSBitfieldViolation) {
+ unsigned DiagWidth =
+ CStdConstraintViolation ? TypeWidth : TypeStorageSize;
+ if (FieldName)
+ return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
+ << FieldName << (unsigned)Value.getZExtValue() << DiagWidth;
+
+ return Diag(FieldLoc, diag::err_anon_bitfield_width_exceeds_type_width)
+ << (unsigned)Value.getZExtValue() << DiagWidth;
+ }
+
+ if (BitfieldIsOverwide) {
if (FieldName)
Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
- << FieldName << (unsigned)Value.getZExtValue()
- << (unsigned)TypeWidth;
+ << FieldName << (unsigned)Value.getZExtValue()
+ << (unsigned)TypeWidth;
else
Diag(FieldLoc, diag::warn_anon_bitfield_width_exceeds_type_width)
- << (unsigned)Value.getZExtValue() << (unsigned)TypeWidth;
+ << (unsigned)Value.getZExtValue() << (unsigned)TypeWidth;
}
}
Modified: cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp?rev=247659&r1=247658&r2=247659&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp (original)
+++ cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp Mon Sep 14 21:36:41 2015
@@ -4,7 +4,7 @@ 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 (8 bits)}}
- bool d : 3;
+ bool d : 3; // expected-warning{{width of bit-field 'd' (3 bits) exceeds the width of its type; value will be truncated to 1 bit}}
};
int a[sizeof(A) == 1 ? 1 : -1];
More information about the cfe-commits
mailing list