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
