On Wed, Jun 25, 2025 at 03:13:25PM -0400, Jason Merrill wrote: > On 6/25/25 1:28 PM, Marek Polacek wrote: > > @@ -24604,7 +24604,7 @@ resolve_nondeduced_context (tree orig_expr, > > tsubst_flags_t complain) > > } > > if (good == 1) > > { > > - mark_used (goodfn); > > + mark_used (goodfn, complain); > > Actually, if we're going to pass complain, we should also check the return > value; the usual pattern is > > > if (!mark_used (fn, complain) && !(complain & tf_error)) > > return error_mark_node;
OK, done here: Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? -- >8 -- Here we end up with "error reporting routines re-entered" because resolve_nondeduced_context isn't passing complain to mark_used. PR c++/120756 gcc/cp/ChangeLog: * pt.cc (resolve_nondeduced_context): Pass complain to mark_used. gcc/testsuite/ChangeLog: * g++.dg/warn/deprecated-22.C: New test. --- gcc/cp/pt.cc | 3 ++- gcc/testsuite/g++.dg/warn/deprecated-22.C | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/deprecated-22.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index deb0106b158..c7a0066a11a 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -24604,7 +24604,8 @@ resolve_nondeduced_context (tree orig_expr, tsubst_flags_t complain) } if (good == 1) { - mark_used (goodfn); + if (!mark_used (goodfn, complain) && !(complain & tf_error)) + return error_mark_node; expr = goodfn; if (baselink) expr = build_baselink (BASELINK_BINFO (baselink), diff --git a/gcc/testsuite/g++.dg/warn/deprecated-22.C b/gcc/testsuite/g++.dg/warn/deprecated-22.C new file mode 100644 index 00000000000..60ee607f717 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-22.C @@ -0,0 +1,13 @@ +// PR c++/120756 +// { dg-do compile { target c++11 } } + +struct A { + template <long> [[deprecated]] void foo (); +}; + +template <long t> [[deprecated]] auto bar () -> decltype (&A::foo<t>); + +void foo () +{ + bar<0> (); // { dg-warning "deprecated" } +} base-commit: 5aca8510abea6c3fac3336a7445863db07fd4a06 -- 2.50.0