On 1/30/26 4:12 AM, Marek Polacek wrote:
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?

OK.

-- >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

Reply via email to