This patch fixes a gcc-15 regression (PR116502) and an inelegance in my
earlier patch related to converting CO_AWAIT_EXPRs to void.

This wasn't noticed anywhere AFAICT, but it was a bit unfortunate.

The other two patches fix an actual regression as well as provide
handling for converting INDIRECT_REFs wrapping CO_AWAIT_EXPRs (which I
noticed was lacking while triaging the regression).

WRT INDIRECT_REFs, I've considered making convert_to_void recurse on the
INDIRECT_REF case, so that special handling doesn't need to be added
when some expression might end up getting wrapped in a INDIRECT_REF.  Is
there a reason why we don't do that?  I've started a regstrap with that
recursion added in order to see whether it is something to possibly
explore.  The change being regstrapped looks like so:

diff --git a/gcc/cp/cvt.cc b/gcc/cp/cvt.cc
index ce26cb8ef30..8f874f4f4dc 100644
--- a/gcc/cp/cvt.cc
+++ b/gcc/cp/cvt.cc
@@ -1432,11 +1432,7 @@ convert_to_void (tree expr, impl_conv_void implicit, 
tsubst_flags_t complain)
                 && !is_reference)
               warning_at (loc, OPT_Wunused_value, "value computed is not 
used");
             expr = TREE_OPERAND (expr, 0);
-           if (TREE_CODE (expr) == CALL_EXPR
-               && (complain & tf_warning))
-             maybe_warn_nodiscard (expr, implicit);
-           else if (TREE_CODE (expr) == CO_AWAIT_EXPR)
-             convert_co_await_to_void (expr, implicit, complain);
+           return convert_to_void (expr, implicit, complain);
           }

        break;

At any rate, the patchset was tested as-is on x86_64-pc-linux-gnu also.
If the above shouldn't be done for whatever reason, is the current set
OK for trunk?

TIA, have a lovely evening.
---------- >8 ----------
As of r15-2318-g2664c1bf83855b, we started altering co_await expressions
cast to void so that their constituent await-resume expression is also
cast to void.  This leads to the TREE_TYPE of the CO_AWAIT_EXPR being
wrong, because it should be the same as the await-resume expression, but
it ended up being void.  While this appears not to cause trouble
currently, it could induce bugs in the future, without being necessary.

gcc/cp/ChangeLog:

        * coroutines.cc (co_await_get_resume_call): Don't return a
        pointer to the await-resume expression.
        * cp-tree.h (co_await_get_resume_call): Change return type to a
        non-pointer 'tree'.
        * cvt.cc (convert_to_void): Adjust according to the above.
---
 gcc/cp/coroutines.cc | 4 ++--
 gcc/cp/cp-tree.h     | 2 +-
 gcc/cp/cvt.cc        | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index f243fe9adae2..166978ab464b 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -728,14 +728,14 @@ coro_get_destroy_function (tree decl)
 
 /* Given a CO_AWAIT_EXPR AWAIT_EXPR, return its resume call.  */
 
-tree*
+tree
 co_await_get_resume_call (tree await_expr)
 {
   gcc_checking_assert (TREE_CODE (await_expr) == CO_AWAIT_EXPR);
   tree vec = TREE_OPERAND (await_expr, 3);
   if (!vec)
     return nullptr;
-  return &TREE_VEC_ELT (vec, 2);
+  return TREE_VEC_ELT (vec, 2);
 }
 
 
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 2eeb5e3e8b16..417ed4919c39 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -8776,7 +8776,7 @@ extern tree coro_get_actor_function               (tree);
 extern tree coro_get_destroy_function          (tree);
 extern tree coro_get_ramp_function             (tree);
 
-extern tree* co_await_get_resume_call          (tree await_expr);
+extern tree co_await_get_resume_call           (tree await_expr);
 
 
 /* contracts.cc */
diff --git a/gcc/cp/cvt.cc b/gcc/cp/cvt.cc
index 7b4bd8a9dc44..b6b35ef9cacf 100644
--- a/gcc/cp/cvt.cc
+++ b/gcc/cp/cvt.cc
@@ -1505,8 +1505,8 @@ convert_to_void (tree expr, impl_conv_void implicit, 
tsubst_flags_t complain)
     case CO_AWAIT_EXPR:
       {
        auto awr = co_await_get_resume_call (expr);
-       if (awr && *awr)
-         *awr = convert_to_void (*awr, implicit, complain);
+       if (awr)
+         awr = convert_to_void (awr, implicit, complain);
        break;
       }
 
-- 
2.46.0

Reply via email to