Hi! We weren't adding the DECL_SELF_REFERENCE_P TYPE_DECL to TYPE_FIELDS of eval_define_aggregate created aggregates, which resulted in ICE in accessible_base_p which relies on DECL_SELF_REFERENCE_P TYPE_DECL to be present in base classes of other classes.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2026-02-05 Jakub Jelinek <[email protected]> PR c++/123984 * reflect.cc (eval_define_aggregate): Set TYPE_BEING_DEFINED on type after pushclass and call build_self_reference before finish_struct. * g++.dg/reflect/define_aggregate6.C: New test. --- gcc/cp/reflect.cc.jj 2026-02-05 15:19:21.963084934 +0100 +++ gcc/cp/reflect.cc 2026-02-05 17:40:03.901515578 +0100 @@ -6081,6 +6081,7 @@ eval_define_aggregate (location_t loc, c xref_basetypes (type, NULL_TREE); pushclass (type); gcc_assert (!TYPE_FIELDS (type)); + TYPE_BEING_DEFINED (type) = 1; tree fields = NULL_TREE; for (int i = 0; i < TREE_VEC_LENGTH (rvec); ++i) { @@ -6121,6 +6122,7 @@ eval_define_aggregate (location_t loc, c fields = f; } TYPE_FIELDS (type) = fields; + build_self_reference (); finish_struct (type, NULL_TREE); return get_reflection_raw (loc, orig_type); } --- gcc/testsuite/g++.dg/reflect/define_aggregate6.C.jj 2026-02-05 17:42:07.498427315 +0100 +++ gcc/testsuite/g++.dg/reflect/define_aggregate6.C 2026-02-05 17:41:55.461630714 +0100 @@ -0,0 +1,22 @@ +// PR c++/123984 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include <meta> + +struct A; +consteval +{ + define_aggregate (^^A, { data_member_spec (^^int, {.name{"_"}}) }); +} + +struct B : A {}; + +constexpr int +get (B &&d) +{ + constexpr auto ctx = std::meta::access_context::unchecked (); + return static_cast <A*> (&d)->[: nonstatic_data_members_of (^^A, ctx)[0] :]; +} + +static_assert (get (B { 123 }) == 123); Jakub
