On Mon, Jul 14, 2025 at 11:58:32PM -0400, Jason Merrill wrote: > Coming back to this comment, it still seems to me that we can generalize > this and ignore anything cast to void here, as in the below; after something > has been cast to void, it can no longer be read. I don't get any > regressions from this simplification, either. > > We might generalize to anything of void type, but I haven't tested that.
We do want to warn for b and not for a e.g. on -Wunused-but-set-variable void foo () { int a, b; a = 1; b = 2; (void) a; } Though, from what I can see, we warn correctly even with your patch. I admit I don't know any longer what was the reason for all the special cases in mark_exp_read and whether over the years some of them might be unneeded. We have some test coverage, but only limited (40KB of tests in c-c++-common & g++.dg), plus sure full bootstrap/regtest does test it further. Could it be committed separately though, in case there is some regression that bisection can find whether it is this simplification or the original patch? > commit adcf4220b73a9b7f44a35728f60aa5b351ef51d8 > Author: Jason Merrill <ja...@redhat.com> > Date: Mon Jul 14 18:29:17 2025 -0400 > > void > > diff --git a/gcc/cp/expr.cc b/gcc/cp/expr.cc > index 8b5a098ecb3..e4a7cfd7bec 100644 > --- a/gcc/cp/expr.cc > +++ b/gcc/cp/expr.cc > @@ -214,24 +214,7 @@ 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; > - } > + read_p = false; > recurse_op[0] = true; > break; > > @@ -382,16 +365,7 @@ mark_exp_read (tree exp) > 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; > - } > + return; > /* FALLTHRU */ > case ARRAY_REF: > case COMPONENT_REF: Jakub