From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23222 invoked by alias); 28 Apr 2012 18:50:43 -0000 Received: (qmail 23210 invoked by uid 22791); 28 Apr 2012 18:50:42 -0000 X-SWARE-Spam-Status: No, hits=-4.3 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00,KHOP_THREADED X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 28 Apr 2012 18:50:30 +0000 From: "marc.glisse at normalesup dot org" To: gcc-bugs@gcc.gnu.org Subject: [Bug c/43772] Errant -Wlogical-op warning when testing limits Date: Sat, 28 Apr 2012 18:50:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c X-Bugzilla-Keywords: diagnostic X-Bugzilla-Severity: normal X-Bugzilla-Who: marc.glisse at normalesup dot org X-Bugzilla-Status: NEW X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-04/txt/msg02517.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772 --- Comment #17 from Marc Glisse 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&&isomething are common, but isomething seems less likely.