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