On 5/26/26 2:08 PM, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/16?

-- >8 --
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.
---
  gcc/cp/pt.cc                             |  2 ++
  gcc/testsuite/g++.dg/reflect/bases_of6.C | 33 ++++++++++++++++++++++++
  2 files changed, 35 insertions(+)
  create mode 100644 gcc/testsuite/g++.dg/reflect/bases_of6.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 3910017a9dc..65151ffd8fa 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -23376,6 +23376,8 @@ 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.  */;

This comment could use more a bit more rationale, something like "class_bases_of is never called for a dependent type". OK with such a tweak.

Jason

        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 00000000000..bd3b0eda15c
--- /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; }

base-commit: bd02a048e92a778c2d3fcc011b8a88e1ac6f8183

Reply via email to