r247651 - [MS ABI] Overwide bool bitfields should be permitted

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 14 18:03:58 PDT 2015


On Mon, Sep 14, 2015 at 6:00 PM, David Majnemer via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: majnemer
> Date: Mon Sep 14 20:00:55 2015
> New Revision: 247651
>
> URL: http://llvm.org/viewvc/llvm-project?rev=247651&view=rev
> Log:
> [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.
>
> 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=247651&r1=247650&r2=247651&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Sep 14 20:00:55 2015
> @@ -12626,11 +12626,14 @@ ExprResult Sema::VerifyBitField(SourceLo
>    }
>
>    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)) {
>

It looks like you've lost the warning on >1-bit bit-fields in C++ mode, for
the MS record layout case.


> -      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;
>
> 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=247651&r1=247650&r2=247651&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp (original)
> +++ cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp Mon Sep 14 20:00:55 2015
> @@ -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];
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150914/fdc8b530/attachment.html>


More information about the cfe-commits mailing list