https://gcc.gnu.org/g:35be043e4d2d47a99ff81b0651bc57566b4d11f9

commit r15-10172-g35be043e4d2d47a99ff81b0651bc57566b4d11f9
Author: Marek Polacek <pola...@redhat.com>
Date:   Wed Jun 25 10:29:49 2025 -0400

    c++: fix ICE with [[deprecated]] [PR120756]
    
    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.
    
    Reviewed-by: Jason Merrill <ja...@redhat.com>
    (cherry picked from commit a394cfb29adf603b72151d2423270db6516b05ed)

Diff:
---
 gcc/cp/pt.cc                              |  3 ++-
 gcc/testsuite/g++.dg/warn/deprecated-22.C | 13 +++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 776bab0b8603..8b7dc5cb2235 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -24465,7 +24465,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 000000000000..60ee607f7170
--- /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" }
+}

Reply via email to