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

Reply via email to