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>
"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))
--- /dev/null
+// 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});