On Mon, Nov 09, 2020 at 10:34:00PM +0100, Jakub Jelinek via Gcc-patches wrote: > On Mon, Nov 09, 2020 at 02:35:58PM -0500, Jason Merrill wrote: > > How about calling warn_if_unused_value instead of the new > > warn_if_unused_value_p? > > That seems to work if I just replace the warning_at call with > warn_if_unused_value call (at least no regression in check-c++-all and > libstdc++ testsuite). > Initially I've tried just calling warn_if_unused_value without the NOP_EXPR > stripping and code/tclass checks, but that regressed a few tests, e.g. > g++.dg/warn/Wunused-14.C or c-c++-common/Wunused-var-9.c or 3 lines > in the new test, e.g. because STATEMENT_LIST or CLEANUP_POINT_EXPRs would > make it through and resulted in bogus warnings.
Bootstrapped/regtested on x86_64-linux and i686-linux successfully now. If we wanted to simplify, I think the && !(code == ....) part could be dropped too, i.e. just if (tclass == tcc_comparison || tclass == tcc_unary || tclass == tcc_binary || code == VEC_PERM_EXPR || code == VEC_COND_EXPR) warn_if_unused_value (e, loc); because warn_if_unused_value already returns false on those codes. > + enum tree_code code = TREE_CODE (e); > + enum tree_code_class tclass = TREE_CODE_CLASS (code); > + if (tclass == tcc_comparison > + || tclass == tcc_unary > + || (tclass == tcc_binary > + && !(code == MODIFY_EXPR > + || code == INIT_EXPR > + || code == PREDECREMENT_EXPR > + || code == PREINCREMENT_EXPR > + || code == POSTDECREMENT_EXPR > + || code == POSTINCREMENT_EXPR)) > + || code == VEC_PERM_EXPR > + || code == VEC_COND_EXPR) > + warn_if_unused_value (e, loc); > } > } > expr = build1 (CONVERT_EXPR, void_type_node, expr); Jakub