https://gcc.gnu.org/g:35d45295f555a4970e98180f4a2f6099f345c363
commit r16-7190-g35d45295f555a4970e98180f4a2f6099f345c363 Author: Marek Polacek <[email protected]> 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 <[email protected]> Reviewed-by: Jakub Jelinek <[email protected]> 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 ());
