diff options
author | Jason Merrill <jason@redhat.com> | 2019-09-16 00:34:12 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-09-16 00:34:12 -0400 |
commit | c4438114d6133f4266be57b8678c49badbe60145 (patch) | |
tree | 11acc18cc58f5e10db7a779340e601f933d64b7d /gcc | |
parent | 27e0979b8b432e5bc109754d4426f49f190b2359 (diff) | |
download | gcc-c4438114d6133f4266be57b8678c49badbe60145.zip gcc-c4438114d6133f4266be57b8678c49badbe60145.tar.gz gcc-c4438114d6133f4266be57b8678c49badbe60145.tar.bz2 |
Handle location wrappers better in warn_logical_operator.
When we introduced location wrappers, we added fold_for_warn to warnings
that are interested in a constant value, or wrapper-stripping to warnings
that are interested in literal constants. This particular warning is
looking for a literal constant, but was wrongly changed to use
fold_for_warn; this patch makes it strip instead.
* c-warn.c (warn_logical_operator): Strip location wrappers. Don't
fold_for_warn in "|| mask" warning.
From-SVN: r275743
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/c-warn.c | 40 |
2 files changed, 25 insertions, 20 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 2b700c2..93bdf3e0 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2019-09-15 Jason Merrill <jason@redhat.com> + + * c-warn.c (warn_logical_operator): Strip location wrappers. Don't + fold_for_warn in "|| mask" warning. + 2019-09-10 Martin Liska <mliska@suse.cz> * c.opt: Use newly added WarnRemoved. diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index d671b77..bee5449 100644 --- a/gcc/c-family/c-warn.c +++ b/gcc/c-family/c-warn.c @@ -208,32 +208,32 @@ warn_logical_operator (location_t location, enum tree_code code, tree type, programmer. That is, an expression such as op && MASK where op should not be any boolean expression, nor a constant, and mask seems to be a non-boolean integer constant. */ + STRIP_ANY_LOCATION_WRAPPER (op_right); if (TREE_CODE (op_right) == CONST_DECL) /* An enumerator counts as a constant. */ op_right = DECL_INITIAL (op_right); + tree stripped_op_left = tree_strip_any_location_wrapper (op_left); if (!truth_value_p (code_left) && INTEGRAL_TYPE_P (TREE_TYPE (op_left)) - && !CONSTANT_CLASS_P (op_left) - && !TREE_NO_WARNING (op_left)) + && !CONSTANT_CLASS_P (stripped_op_left) + && TREE_CODE (stripped_op_left) != CONST_DECL + && !TREE_NO_WARNING (op_left) + && TREE_CODE (op_right) == INTEGER_CST + && !integer_zerop (op_right) + && !integer_onep (op_right)) { - tree folded_op_right = fold_for_warn (op_right); - if (TREE_CODE (folded_op_right) == INTEGER_CST - && !integer_zerop (folded_op_right) - && !integer_onep (folded_op_right)) - { - bool warned; - if (or_op) - warned - = warning_at (location, OPT_Wlogical_op, - "logical %<or%> applied to non-boolean constant"); - else - warned - = warning_at (location, OPT_Wlogical_op, - "logical %<and%> applied to non-boolean constant"); - if (warned) - TREE_NO_WARNING (op_left) = true; - return; - } + bool warned; + if (or_op) + warned + = warning_at (location, OPT_Wlogical_op, + "logical %<or%> applied to non-boolean constant"); + else + warned + = warning_at (location, OPT_Wlogical_op, + "logical %<and%> applied to non-boolean constant"); + if (warned) + TREE_NO_WARNING (op_left) = true; + return; } /* We do not warn for constants because they are typical of macro |