From c4438114d6133f4266be57b8678c49badbe60145 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 16 Sep 2019 00:34:12 -0400 Subject: [PATCH] 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 --- gcc/c-family/ChangeLog | 5 +++++ 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 2b700c2c4bd..93bdf3e0798 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2019-09-15 Jason Merrill + + * c-warn.c (warn_logical_operator): Strip location wrappers. Don't + fold_for_warn in "|| mask" warning. + 2019-09-10 Martin Liska * c.opt: Use newly added WarnRemoved. diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index d671b77a2b0..bee5449bcb1 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 % applied to non-boolean constant"); - else - warned - = warning_at (location, OPT_Wlogical_op, - "logical % 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 % applied to non-boolean constant"); + else + warned + = warning_at (location, OPT_Wlogical_op, + "logical % 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 -- 2.30.2