aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-09-16 00:34:12 -0400
committerJason Merrill <jason@gcc.gnu.org>2019-09-16 00:34:12 -0400
commitc4438114d6133f4266be57b8678c49badbe60145 (patch)
tree11acc18cc58f5e10db7a779340e601f933d64b7d /gcc
parent27e0979b8b432e5bc109754d4426f49f190b2359 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/c-family/c-warn.c40
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