On Wed, Feb 25, 2026 at 08:50:40PM +0100, Jakub Jelinek wrote: > > Sounds like the maybe_strip_typedefs is wrong, since reflection in general > > tries to preserve aliases. > > Actually the maybe_strip_typedefs call is correct, that is for the type > argument (so when it is std::meta::annotations_with_type) and the standard > says that dealias should be used > - https://eel.is/c++draft/meta.reflection#annotation-6.2 > But we probably shouldn't use TYPE_ATTRIBUTES but DECL_ATTRIBUTES (TYPE_NAME > (r)) > if r is a type alias. > I'll test a patch for that separately.
Here it is. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2026-03-04 Jakub Jelinek <[email protected]> PR c++/123866 * reflect.cc (eval_annotations_of): For type aliases look for annotations in DECL_ATTRIBUTES (TYPE_NAME (r)). * g++.dg/reflect/annotations11.C: New test. --- gcc/cp/reflect.cc.jj 2026-03-03 15:43:33.130814556 +0100 +++ gcc/cp/reflect.cc 2026-03-03 16:42:26.904622279 +0100 @@ -3799,7 +3799,12 @@ eval_annotations_of (location_t loc, con } } else if (TYPE_P (r)) - r = TYPE_ATTRIBUTES (r); + { + if (typedef_variant_p (r)) + r = DECL_ATTRIBUTES (TYPE_NAME (r)); + else + r = TYPE_ATTRIBUTES (r); + } else if (DECL_P (r)) r = DECL_ATTRIBUTES (r); else --- gcc/testsuite/g++.dg/reflect/annotations11.C.jj 2026-03-03 17:00:27.599533819 +0100 +++ gcc/testsuite/g++.dg/reflect/annotations11.C 2026-03-03 17:00:23.275606183 +0100 @@ -0,0 +1,21 @@ +// PR c++/123866 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include <meta> + +struct [[=1, =2]] A {}; +using B [[=3, =4, =5]] = A; +typedef A C [[=6, =7, =8, =9]]; +using D [[=10, =11, =12, =13, =14]] = const int; +typedef volatile int E [[=15, =16, =17, =18, =19, =20]]; + +static_assert (annotations_of (^^A).size () == 2); +static_assert (annotations_of (^^B).size () == 3); +static_assert (annotations_of (dealias (^^B)).size () == 2); +static_assert (annotations_of (^^C).size () == 4); +static_assert (annotations_of (dealias (^^C)).size () == 2); +static_assert (annotations_of (^^D).size () == 5); +static_assert (annotations_of (dealias (^^D)).size () == 0); +static_assert (annotations_of (^^E).size () == 6); +static_assert (annotations_of (dealias (^^E)).size () == 0); Jakub
