[gcc r16-7190] c++/reflection: tweak eval_can_substitute
Marek Polacek
mpolacek@gcc.gnu.org
Fri Jan 30 13:27:21 GMT 2026
https://gcc.gnu.org/g:35d45295f555a4970e98180f4a2f6099f345c363
commit r16-7190-g35d45295f555a4970e98180f4a2f6099f345c363
Author: Marek Polacek <polacek@redhat.com>
Date: Wed Jan 28 16:33:34 2026 -0500
c++/reflection: tweak eval_can_substitute
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.
Reviewed-by: Jason Merrill <jason@redhat.com>
Reviewed-by: Jakub Jelinek <jakub@redhat.com>
Diff:
---
gcc/cp/reflect.cc | 2 +-
gcc/testsuite/g++.dg/reflect/substitute3.C | 22 ++++++++++++++++++++++
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index 78990ce414d2..3654f8814fb5 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 000000000000..ff1b1aeaf4da
--- /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 ());
More information about the Gcc-cvs
mailing list