[cfe-dev] Unwanted warning on assigning negatives to unsigned bit-fields

David Blaikie via cfe-dev cfe-dev at lists.llvm.org
Mon Jul 18 09:08:14 PDT 2016


Richard - perhaps you could take a look at this diagnostic quality
issues/possible inconsistency?

On Sun, Jul 17, 2016 at 11:12 AM Iurii via cfe-dev <cfe-dev at lists.llvm.org>
wrote:

> Hi everybody,
>
> I'm suffering from an annoying warning. Here's an example to quickly
> reproduce it:
>
>     #include <stdio.h>
>     #include <stdint.h>
>     #include <inttypes.h>
>
>     typedef union _bf
>     {
>         struct
>         {
>             uint32_t field1:2;
>             uint32_t field2:30;
>         } fields;
>         uint32_t raw;
>     } bf;
>
>     int main(int argc, char *argv[])
>     {
>         printf("0x%" PRIx32 "\n"
>                "0x%" PRIx32 "\n",
>                 ((bf){ .fields.field1 = -1 }).raw, //Warning
>                 ((bf){ .raw = -1 }).raw );         //No warning
>         return 0;
>     }
>
> Compilation: clang -std=c99 -m32 -O2 -o test test.c
>
> Result: test.c:19:37: warning: implicit truncation from 'int' to bit-field
> changes value from -1 to 3
>
> Could someone, please, explain me, why the warning is produced? The C99
> standard is very clear about the behaviour
> with respect to the value of field1 (the value of raw after assigning to
> field1 is implementation-defined, but that's
> a different story), and it is unambiguous:
>
> 6.3.1.3 paragraph 2
> "if the new type is unsigned, the value is converted by repeatedly adding
> or subtracting one more than the maximum
> value that can be represented in the new type until the value is in the
> range of the new type"
>
> 6.7.2.1 paragraph 9:
> "A bit-field is interpreted as a signed or unsigned integer type
> consisting of the specified number of bits"
>
> So field1 is an unsigned integer consisting of 2 bits. The maximum value
> that it can store is 2^2-1 . In order to
> assign -1 to field1 2^2-1+1 must be added to -1. The result is therefore
> well-defined to be 3. So as long as assigning
> -1 to any standard unsigned integer does not produce any warning, I see no
> reason behind producing it for unsigned
> bit-fields. Especially because this is the most convenient way to set all
> bits in a bit-field. A single-bit bit-field
> would be a somewhat special case for assigning -1, but I'd prefer to not
> have the warning in this case as well.
>
> Kind regards
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160718/060ab813/attachment.html>


More information about the cfe-dev mailing list