]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: fix ICE with [[deprecated]] [PR120756]
authorMarek Polacek <polacek@redhat.com>
Wed, 25 Jun 2025 14:29:49 +0000 (10:29 -0400)
committerMarek Polacek <polacek@redhat.com>
Fri, 27 Jun 2025 23:01:52 +0000 (19:01 -0400)
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 <jason@redhat.com>
gcc/cp/pt.cc
gcc/testsuite/g++.dg/warn/deprecated-22.C [new file with mode: 0644]

index deb0106b1589d620ff3be3790a62011ccec49c70..c7a0066a11ac01467ad123d14264652750fd01c9 100644 (file)
@@ -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 (file)
index 0000000..60ee607
--- /dev/null
@@ -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" }
+}