https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38470

--- Comment #16 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
(In reply to Eric Gallager from comment #15)
> That has since been closed as fixed. So are the chances of this one being
> fixed next somewhat better now?

Not really. PR23608 fixes the case where the variable is actually a "const" by
assuming the initial value cannot be changed. There is no propagation of
values; we still warn for "i = 5; i < 5u;"

To fix the general case, someone has to implement some kind of reduced dataflow
within the FE. Something that once you see "x >= 0", records this info
somewhere, keeps track of any subsequent jumps, then when it sees "x <
Unsigned", it tries to see if "x >= 0" was recorded and there is a
(unconditional?) path from there to here. Doing this seems to me to require a
non-trivial amount of work.

The simplest case (x >= 0 && x < Unsigned) could perhaps be handled by some
special (folding?) function that when seeing such expression, sets
TREE_NO_WARNING for x, or converts the right-hand to (unsigned)x< Unsigned, or
something clever that I cannot even imagine. 

If someone is interested in trying the above, look at warn_logical_operator in
c-common.c, which is one of those warnings that looks at logical && expressions
and tries to figure out whether to warn. You would need to create a similar
function (and call it from wherever warn_logical_operator is called from), but
you may need to rewrite the expressions or set TREE_NO_WARNING or do something
else to avoid warning later. This seems much less work, but still far from
trivial and it will only catch this very specific case.

Reply via email to