https://gcc.gnu.org/g:910901abe03a31c5f234852e224be4c37d08b5d9
commit r17-819-g910901abe03a31c5f234852e224be4c37d08b5d9 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]> 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 3910017a9dc9..ada5f53a9f11 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -23376,6 +23376,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; }
