https://gcc.gnu.org/g:195e27c797b695f16032dead8d475eca097ebe5c
commit r16-7744-g195e27c797b695f16032dead8d475eca097ebe5c Author: Marek Polacek <[email protected]> Date: Tue Feb 24 11:08:55 2026 -0500 c++/reflection: fix crash with substitute [PR124204] Here we crash in implicit_conversion on: /* An argument should have gone through convert_from_reference. */ gcc_checking_assert (!expr || !TYPE_REF_P (from)); so let's do that. PR c++/124204 gcc/cp/ChangeLog: * reflect.cc (eval_can_substitute): Call convert_from_reference. gcc/testsuite/ChangeLog: * g++.dg/reflect/substitute5.C: New test. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/reflect.cc | 1 + gcc/testsuite/g++.dg/reflect/substitute5.C | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index 871d52a55b11..e90c9e376b1b 100644 --- a/gcc/cp/reflect.cc +++ b/gcc/cp/reflect.cc @@ -5318,6 +5318,7 @@ eval_can_substitute (location_t loc, const constexpr_ctx *ctx, "invalid argument to can_substitute", fun, non_constant_p, jump_target); a = resolve_nondeduced_context (a, tf_warning_or_error); + a = convert_from_reference (a); TREE_VEC_ELT (rvec, i) = a; } if (DECL_TYPE_TEMPLATE_P (r) || DECL_TEMPLATE_TEMPLATE_PARM_P (r)) diff --git a/gcc/testsuite/g++.dg/reflect/substitute5.C b/gcc/testsuite/g++.dg/reflect/substitute5.C new file mode 100644 index 000000000000..f9af9bf5f468 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/substitute5.C @@ -0,0 +1,11 @@ +// PR c++/124204 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include <meta> + +template<int> +using U = void; +constexpr int v = 0; +constexpr auto &ref = v; +constexpr auto result = substitute(^^U, {^^ref});
