https://gcc.gnu.org/g:c51f663f7f38702806c97afe74203a71233c8383

commit r16-8964-gc51f663f7f38702806c97afe74203a71233c8383
Author: Marek Polacek <[email protected]>
Date:   Tue May 26 13:56:16 2026 -0400

    c++/reflection: ICE when substituting base info [PR125423]
    
    As tsubst says, we should never be tsubsting a binfo.  So let's
    bail for REFLECT_BASE.
    
            PR c++/125423
    
    gcc/cp/ChangeLog:
    
            * pt.cc (tsubst_expr) <case REFLECT_EXPR>: Don't tsubst
            REFLECT_BASEs.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/reflect/bases_of6.C: New test.
    
    Reviewed-by: Jason Merrill <[email protected]>
    (cherry picked from commit 910901abe03a31c5f234852e224be4c37d08b5d9)

Diff:
---
 gcc/cp/pt.cc                             |  3 +++
 gcc/testsuite/g++.dg/reflect/bases_of6.C | 33 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 4d14ee239d36..b6302b592253 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -23368,6 +23368,9 @@ tsubst_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl)
             instantiated entities and so no need to tsubst the annotation
             attribute and we rely on pointer equality of that.  */
          ;
+       else if (kind == REFLECT_BASE)
+         /* Don't substitute; class_bases_of is never called for a dependent
+            type.  */;
        else if (TREE_CODE (h) == SCOPE_REF)
          h = tsubst_qualified_id (h, args, complain, in_decl,
                                   /*done=*/true, /*address_p=*/false,
diff --git a/gcc/testsuite/g++.dg/reflect/bases_of6.C 
b/gcc/testsuite/g++.dg/reflect/bases_of6.C
new file mode 100644
index 000000000000..bd3b0eda15c5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/bases_of6.C
@@ -0,0 +1,33 @@
+// PR c++/125423
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <meta>
+
+struct Base
+{
+};
+struct Derived : Base
+{
+};
+
+template <typename Tp, Tp v> struct get_type
+{
+    inline constexpr static auto info = ^^void;
+};
+
+template <std::meta::info base> struct get_type<std::meta::info, base>
+{
+    inline constexpr static auto info = std::meta::type_of(base);
+};
+
+template <std::meta::info currField> struct ReflectionSubPanel
+{
+    static constexpr auto _ranges = []()
+    {
+        constexpr auto b = std::meta::bases_of(^^Derived, 
std::meta::access_context::unchecked())[0];
+        return get_type<decltype(b), b>::info;
+    }();
+};
+
+int main() { ReflectionSubPanel<^^Derived> panel; }

Reply via email to