Handle location wrappers better in warn_logical_operator.
authorJason Merrill <jason@redhat.com>
Mon, 16 Sep 2019 04:34:12 +0000 (00:34 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 16 Sep 2019 04:34:12 +0000 (00:34 -0400)
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
gcc/c-family/c-warn.c

index 2b700c2c4bd689a2d457bfbdebb8670d8d60a0a4..93bdf3e07988ec337cb4863143511d83cf0aa97f 100644 (file)
@@ -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.
index d671b77a2b06295cd3a7bed7044c9e71a129bd98..bee5449bcb1690498f95a205afdafdf730d68587 100644 (file)
@@ -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