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]; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits