aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorArsen Arsenović <arsen@aarsen.me>2024-08-28 21:59:18 +0200
committerArsen Arsenović <arsen@gcc.gnu.org>2024-09-27 13:37:37 +0200
commit05e4f07cad1eacf869c10622cae2a9cdee3b6a7a (patch)
tree14d2c582a21ea135e1b6670c9de802cf5df4a882 /gcc/cp
parent037c97e114341143af35f4df3ff49e12afacf105 (diff)
downloadgcc-05e4f07cad1eacf869c10622cae2a9cdee3b6a7a.zip
gcc-05e4f07cad1eacf869c10622cae2a9cdee3b6a7a.tar.gz
gcc-05e4f07cad1eacf869c10622cae2a9cdee3b6a7a.tar.bz2
c++/coro: prevent ICV_STATEMENT diagnostics in temp promotion [PR116502]
If such a diagnostic is necessary, it has already been emitted, otherwise, it is not correct and emitting it here is inactionable by the user, and bogus. PR c++/116502 gcc/cp/ChangeLog: * coroutines.cc (maybe_promote_temps): Convert temporary initializers to void without complaining. gcc/testsuite/ChangeLog: * g++.dg/coroutines/maybe-unused-1.C: New test. * g++.dg/coroutines/pr116502.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/coroutines.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index 4c7ea1d..50904e0 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -3203,7 +3203,13 @@ maybe_promote_temps (tree *stmt, void *d)
to run the initializer.
If the initializer is a conditional expression, we need to collect
and declare any promoted variables nested within it. DTORs for such
- variables must be run conditionally too. */
+ variables must be run conditionally too.
+
+ Since here we're synthetically processing code here, we've already
+ emitted any Wunused-result warnings. Below, however, we call
+ finish_expr_stmt, which will convert its operand to void, and could
+ result in such a diagnostic being emitted. To avoid that, convert to
+ void ahead of time. */
if (t->var)
{
tree var = t->var;
@@ -3213,7 +3219,7 @@ maybe_promote_temps (tree *stmt, void *d)
if (TREE_CODE (t->init) == COND_EXPR)
process_conditional (t, vlist);
else
- finish_expr_stmt (t->init);
+ finish_expr_stmt (convert_to_void (t->init, ICV_STATEMENT, tf_none));
if (tree cleanup = cxx_maybe_build_cleanup (var, tf_warning_or_error))
{
tree cl = build_stmt (sloc, CLEANUP_STMT, expr_list, cleanup, var);
@@ -3232,7 +3238,7 @@ maybe_promote_temps (tree *stmt, void *d)
if (TREE_CODE (t->init) == COND_EXPR)
process_conditional (t, vlist);
else
- finish_expr_stmt (t->init);
+ finish_expr_stmt (convert_to_void (t->init, ICV_STATEMENT, tf_none));
if (expr_list)
{
if (TREE_CODE (expr_list) != STATEMENT_LIST)