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 <jason@redhat.com>
This commit is contained in:
Marek Polacek
2026-02-24 11:08:55 -05:00
parent 132139c00a
commit 195e27c797
2 changed files with 12 additions and 0 deletions

View File

@@ -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))

View File

@@ -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});