Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

In Jakub's patch for PR44677 he added code to prevent mark_exp_read on
e.g. (void)++i from marking i as read, but it seems to me that we can
generalize that to avoid looking any farther into any void expression;
you can't read a void value, and an explicit cast will have already called
mark_exp_read on its operand in convert_to_void.

For testing I added an assert to catch places where we were trying to mark
void expressions as read, and fix a few that it found.  But there were
several other places (such as check_return_expr) where we could have a void
expression but always calling mark_exp_read makes sense, so I dropped the
assert from the final commit.

        PR c++/44677

gcc/cp/ChangeLog:

        * cp-gimplify.cc (cp_fold) [CLEANUP_POINT_EXPR]: Don't force rvalue.
        [COMPOUND_EXPR]: Likewise.
        * cvt.cc (convert_to_void): Call mark_exp_read later.
        * expr.cc (mark_use): Turn off read_p for any void argument.
        (mark_exp_read): Return early for void argument.
---
 gcc/cp/cp-gimplify.cc |  5 +++--
 gcc/cp/cvt.cc         | 13 ++++++-------
 gcc/cp/expr.cc        | 37 ++++++-------------------------------
 3 files changed, 15 insertions(+), 40 deletions(-)

diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc
index addbc29d104..d54fe347a6c 100644
--- a/gcc/cp/cp-gimplify.cc
+++ b/gcc/cp/cp-gimplify.cc
@@ -3028,7 +3028,7 @@ cp_fold (tree x, fold_flags_t flags)
     case CLEANUP_POINT_EXPR:
       /* Strip CLEANUP_POINT_EXPR if the expression doesn't have side
         effects.  */
-      r = cp_fold_rvalue (TREE_OPERAND (x, 0), flags);
+      r = cp_fold (TREE_OPERAND (x, 0), flags);
       if (!TREE_SIDE_EFFECTS (r))
        x = r;
       break;
@@ -3223,7 +3223,8 @@ cp_fold (tree x, fold_flags_t flags)
          && (VAR_P (op0) || TREE_CODE (op0) == PARM_DECL)
          && !DECL_READ_P (op0))
        clear_decl_read = true;
-      op1 = cp_fold_rvalue (TREE_OPERAND (x, 1), flags);
+      op1 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 1),
+                                 code != COMPOUND_EXPR, flags);
       if (clear_decl_read)
        DECL_READ_P (op0) = 0;
 
diff --git a/gcc/cp/cvt.cc b/gcc/cp/cvt.cc
index f663a6d08c8..55be12db951 100644
--- a/gcc/cp/cvt.cc
+++ b/gcc/cp/cvt.cc
@@ -1186,13 +1186,6 @@ convert_to_void (tree expr, impl_conv_void implicit, 
tsubst_flags_t complain)
 
   expr = maybe_undo_parenthesized_ref (expr);
 
-  expr = mark_discarded_use (expr);
-  if (implicit == ICV_CAST)
-    /* An explicit cast to void avoids all -Wunused-but-set* warnings.  */
-    mark_exp_read (expr);
-
-  if (!TREE_TYPE (expr))
-    return expr;
   if (invalid_nonstatic_memfn_p (loc, expr, complain))
     return error_mark_node;
   if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
@@ -1209,6 +1202,12 @@ convert_to_void (tree expr, impl_conv_void implicit, 
tsubst_flags_t complain)
 
   if (VOID_TYPE_P (TREE_TYPE (expr)))
     return expr;
+
+  expr = mark_discarded_use (expr);
+  if (implicit == ICV_CAST)
+    /* An explicit cast to void avoids all -Wunused-but-set* warnings.  */
+    mark_exp_read (expr);
+
   switch (TREE_CODE (expr))
     {
     case COND_EXPR:
diff --git a/gcc/cp/expr.cc b/gcc/cp/expr.cc
index 8b5a098ecb3..32dc3eee78f 100644
--- a/gcc/cp/expr.cc
+++ b/gcc/cp/expr.cc
@@ -102,6 +102,9 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
   if (reject_builtin && reject_gcc_builtin (expr, loc))
     return error_mark_node;
 
+  if (TREE_TYPE (expr) && VOID_TYPE_P (TREE_TYPE (expr)))
+    read_p = false;
+
   if (read_p)
     mark_exp_read (expr);
 
@@ -213,25 +216,6 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
        }
       gcc_fallthrough ();
     CASE_CONVERT:
-      if (VOID_TYPE_P (TREE_TYPE (expr)))
-       switch (TREE_CODE (TREE_OPERAND (expr, 0)))
-         {
-         case PREINCREMENT_EXPR:
-         case PREDECREMENT_EXPR:
-         case POSTINCREMENT_EXPR:
-         case POSTDECREMENT_EXPR:
-           tree op0;
-           op0 = TREE_OPERAND (TREE_OPERAND (expr, 0), 0);
-           STRIP_ANY_LOCATION_WRAPPER (op0);
-           if ((VAR_P (op0) || TREE_CODE (op0) == PARM_DECL)
-               && !DECL_READ_P (op0)
-               && (VAR_P (op0) ? warn_unused_but_set_variable
-                               : warn_unused_but_set_parameter) > 1)
-             read_p = false;
-           break;
-         default:
-           break;
-         }
       recurse_op[0] = true;
       break;
 
@@ -371,6 +355,9 @@ mark_exp_read (tree exp)
   if (exp == NULL)
     return;
 
+  if (TREE_TYPE (exp) && VOID_TYPE_P (TREE_TYPE (exp)))
+    return;
+
   switch (TREE_CODE (exp))
     {
     case VAR_DECL:
@@ -381,18 +368,6 @@ mark_exp_read (tree exp)
       DECL_READ_P (exp) = 1;
       break;
     CASE_CONVERT:
-      if (VOID_TYPE_P (TREE_TYPE (exp)))
-       switch (TREE_CODE (TREE_OPERAND (exp, 0)))
-         {
-         case PREINCREMENT_EXPR:
-         case PREDECREMENT_EXPR:
-         case POSTINCREMENT_EXPR:
-         case POSTDECREMENT_EXPR:
-           return;
-         default:
-           break;
-         }
-      /* FALLTHRU */
     case ARRAY_REF:
     case COMPONENT_REF:
     case MODIFY_EXPR:

base-commit: 3fbed69502770851c8a5bfece99e9ee8c6d9e4b0
-- 
2.50.0

Reply via email to