This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: No warning for unreachable code
I'm suggesting that there's no big difference between unsigned char and
unsigned int (and unsigned long...) in this case, and, therefore
compiler's behaviour should be consistent.
But there is a difference.
When "x" is an unsigned int, the expression "x < 0" is equivalent to
(unsigned int) x < (unsigned int) 0
which can never be true, whatever "x" is, and results in
warning: comparison of unsigned expression < 0 is always false
When "x" is an unsigned char however, it reads
(int) x < (int) 0
which only cannot happen because of the particular values "x" can take,
and the warning is
warning: comparison is always false due to limited range of data type
Sounds sane to me, and both warning messages are clear.
And in this case I personally
would prefer a warning in both cases with -Wall.
Then please file a PR in bugzilla so your request won't get lost.
It might be that the warning isn't in -Wall because it has too many
false positives. This is just a guess though.
And this wasn't a purely theoretical observation. There is a driver in
the
Linux kernel, that does exactly this: assigns function return code to
an
unsigned int variable, and then checks for "<0"... And the compiler
happily throws the check away. Yes, I will submit a patch, but if
there is
no strong reason against, maybe it would make sense to warn in these
cases.
I can try to shift the blame and say the kernel should be built with
-Wextra . But then people will shout at me again, so I won't.
Segher