On Thu, Jan 29, 2026 at 06:45:01PM +0800, Jason Merrill wrote:
> On 1/29/26 5:37 AM, Marek Polacek wrote:
> > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> > 
> > -- >8 --
> > As discussed in
> > <https://gcc.gnu.org/pipermail/gcc-patches/2026-January/705756.html>,
> > we should check for undeduced_auto_decl after performing
> > resolve_nondeduced_context_or_error.
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * reflect.cc (eval_can_substitute): Check undeduced_auto_decl after
> >     resolve_nondeduced_context_or_error.
> 
> No test?

Now With a Test.  Ok for trunk?

-- >8 --
As discussed in
<https://gcc.gnu.org/pipermail/gcc-patches/2026-January/705756.html>,
we should check for undeduced_auto_decl after performing
resolve_nondeduced_context_or_error.  Also add a test to exercise
the new check.

gcc/cp/ChangeLog:

        * reflect.cc (eval_can_substitute): Check undeduced_auto_decl after
        resolve_nondeduced_context_or_error.

gcc/testsuite/ChangeLog:

        * g++.dg/reflect/substitute3.C: New test.
---
 gcc/cp/reflect.cc                          |  2 +-
 gcc/testsuite/g++.dg/reflect/substitute3.C | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/reflect/substitute3.C

diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index 78990ce414d..3654f8814fb 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -5339,7 +5339,7 @@ eval_can_substitute (location_t loc, const constexpr_ctx 
*ctx,
       if (fn == error_mark_node)
        return boolean_false_node;
       fn = resolve_nondeduced_context_or_error (fn, tf_none);
-      if (fn == error_mark_node)
+      if (fn == error_mark_node || undeduced_auto_decl (fn))
        return boolean_false_node;
       return boolean_true_node;
     }
diff --git a/gcc/testsuite/g++.dg/reflect/substitute3.C 
b/gcc/testsuite/g++.dg/reflect/substitute3.C
new file mode 100644
index 00000000000..ff1b1aeaf4d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/substitute3.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+// Test std::meta::substitute.  Test the case when undeduced_auto_decl
+// is true after resolve_nondeduced_context.
+
+#include <meta>
+
+template<typename>
+auto
+f ()
+{
+}
+
+consteval bool
+g ()
+{
+  try { substitute (^^f, { ^^int }); }
+  catch (std::meta::exception &) { return false; }
+  return true;
+}
+
+static_assert (!g ());

base-commit: c906b8f0199d16c93db1df99e789e2fc6bf31680
-- 
2.52.0

Reply via email to