On 6/26/25 4:12 PM, Marek Polacek wrote:
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?
OK.
-- >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