[Bug other/102440] Uinteger Opt/Param but the underlying type is signed
segher at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Oct 26 16:45:57 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102440
--- Comment #9 from Segher Boessenkool <segher at gcc dot gnu.org> ---
(In reply to Martin Liška from comment #8)
> > We could make the "UInteger" type mean it is implemented with an "unsigned
> > int"
> > C type (or some other unsigned integer type).
>
> This would lead to the following list of -Wsign-compare warnings:
>
> /home/marxin/Programming/gcc/gcc/c-family/c-opts.c:934:27: warning:
> comparison of integer expressions of different signedness: ‘unsigned int’
> and ‘int’ [-Wsign-compare]
That line is
if (warn_shift_overflow == -1)
The documentation for that warning flag says
'-Wsign-compare'
Warn when a comparison between signed and unsigned values could
produce an incorrect result when the signed value is converted to
unsigned. In C++, this warning is also enabled by '-Wall'. In C,
it is also enabled by '-Wextra'.
I don't see how this could produce an incorrect result. Writing the code as
if (warn_shift_overflow == -1U)
means exactly the same thing, except it assumes the size of the variable so
it is a bad habit. Plain "-1" is easier to read anyway.
It is idiom to use -1 for all-bits-set for unsigned vars. It works correctly
whatever the size of the variable is. It is silly if
if (warn_shift_overflow == -1)
warns, but
if (warn_shift_overflow + 1 == 0)
is just dandy (and that is the current situation :-( )
> One would need to verify/adjust all these places (plus many more for other
> targets).
Or fix the bloody warning ;-) But not something you want on your plate, I
fully
understand :-)
More information about the Gcc-bugs
mailing list