diff options
author | David Malcolm <dmalcolm@redhat.com> | 2019-02-16 16:17:17 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2019-02-16 16:17:17 +0000 |
commit | 3fe53000bbaa5024af7ceecb950e0a7fd6b189e3 (patch) | |
tree | d4ce7caa5c4014625f6fccf5e7a10714d8b7e302 /gcc/c-family/c-common.c | |
parent | 9dbdefbb201dd67cd1ce795e969c3ae1a850c31d (diff) | |
download | gcc-3fe53000bbaa5024af7ceecb950e0a7fd6b189e3.zip gcc-3fe53000bbaa5024af7ceecb950e0a7fd6b189e3.tar.gz gcc-3fe53000bbaa5024af7ceecb950e0a7fd6b189e3.tar.bz2 |
Fix excess warnings from -Wtype-limits with location wrappers (PR c++/88680)
PR c++/88680 reports excess warnings from -Wtype-limits after the C++
FE's use of location wrappers was extended in r267272 for cases such as:
const unsigned n = 8;
static_assert (n >= 0 && n % 2 == 0, "");
t.C:3:18: warning: comparison of unsigned expression >= 0 is always true
[-Wtype-limits]
3 | static_assert (n >= 0 && n % 2 == 0, "");
| ~~^~~~
The root cause is that the location wrapper around "n" breaks the
suppression of the warning for the "if OP0 is a constant that is >= 0"
case.
This patch fixes it by calling fold_for_warn on OP0, extracting the
constant.
gcc/c-family/ChangeLog:
PR c++/88680
* c-common.c (shorten_compare): Call fold_for_warn on op0 when
implementing -Wtype-limits.
gcc/testsuite/ChangeLog:
PR c++/88680
* g++.dg/wrappers/pr88680.C: New test.
From-SVN: r268961
Diffstat (limited to 'gcc/c-family/c-common.c')
-rw-r--r-- | gcc/c-family/c-common.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index ae23e59..c6856c9 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -3117,6 +3117,12 @@ shorten_compare (location_t loc, tree *op0_ptr, tree *op1_ptr, primop0 = op0; primop1 = op1; + /* We want to fold unsigned comparisons of >= and < against zero. + For these, we may also issue a warning if we have a non-constant + compared against zero, where the zero was spelled as "0" (rather + than merely folding to it). + If we have at least one constant, then op1 is constant + and we may have a non-constant expression as op0. */ if (!real1 && !real2 && integer_zerop (primop1) && TYPE_UNSIGNED (*restype_ptr)) { @@ -3125,13 +3131,14 @@ shorten_compare (location_t loc, tree *op0_ptr, tree *op1_ptr, if OP0 is a constant that is >= 0, the signedness of the comparison isn't an issue, so suppress the warning. */ + tree folded_op0 = fold_for_warn (op0); bool warn = warn_type_limits && !in_system_header_at (loc) - && !(TREE_CODE (primop0) == INTEGER_CST + && !(TREE_CODE (folded_op0) == INTEGER_CST && !TREE_OVERFLOW (convert (c_common_signed_type (type), - primop0))) + folded_op0))) /* Do not warn for enumeration types. */ - && (TREE_CODE (expr_original_type (primop0)) != ENUMERAL_TYPE); + && (TREE_CODE (expr_original_type (folded_op0)) != ENUMERAL_TYPE); switch (code) { |