http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772
--- Comment #17 from Marc Glisse <marc.glisse at normalesup dot org> 2012-04-28 18:49:49 UTC --- (In reply to comment #16) > I understand now, and I think you are right. We don't have a warning for > "((int)x) < INT_MIN" or ((int)x) > INT_MAX but I think it should go to > Wtype-limits. Interestingly, for an int i, we don't warn for x<=INT_MAX, but we do warn for x<=(long)INT_MAX (adapt if your platform has int and long of the same size). > Do you think we could test this situation just before the Wlogical-op warning? It is easy to re-check inside warn_logical_operator if one of the tests is always true. I have no idea how to pass the information from Wtype-limits that warn_logical_operator shouldn't be called. > I can see that some macros may generate x >= INT_MIN but the x < INT_MIN case > seems less likely to be intented and we should warn (and then return and avoid > warning with Wlogical-op). I think < INT_MIN and >= INT_MIN should either both warn of both be quiet. It is a matter of style whether people write: if (x in range) do the work; or if (x out of range) abort; do the work; (In reply to comment #12) > Do you mean: > > if (or_op && integer_onep(tem)) { warn();} > else if (!or_op && integer_zerop(tem)) { warn();} Even smaller would be to replace the current (TREE_CODE (tem) != INTEGER_CST) with integer_zerop(tem) and pass build_range_check in_p^or_op (or in_p==or_op, don't know which) instead of just in_p. It would already be an improvement over the current situation, and I expect the remaining false positives to be very rare. i>=INT_MIN&&i<something or i<INT_MIN||i>something are common, but i<INT_MIN&&i>something seems less likely.