On 6/18/26 6:09 PM, Marek Polacek wrote:
FWIW, Jakub seems to agree with this patch in the PR.Tested reflect/* on x86_64-pc-linux-gnu, ok for trunk/16? -- >8 -- members_of doesn't append the call operator of a closure type to ELTS in class_members_of and so the assert in the test doesn't pass. PR c++/125889 gcc/cp/ChangeLog: * reflect.cc (class_members_of): Also append LAMBDA_FUNCTION_P from the implicitly_declared vector. gcc/testsuite/ChangeLog: * g++.dg/reflect/members_of16.C: New test. --- gcc/cp/reflect.cc | 7 +++++++ gcc/testsuite/g++.dg/reflect/members_of16.C | 8 ++++++++ 2 files changed, 15 insertions(+) create mode 100644 gcc/testsuite/g++.dg/reflect/members_of16.C diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index 8dccf5e99a0..f15be65c246 100644 --- a/gcc/cp/reflect.cc +++ b/gcc/cp/reflect.cc @@ -7077,6 +7077,13 @@ class_members_of (location_t loc, const constexpr_ctx *ctx, tree r, get_reflection_raw (loc, m)); break; } + for (tree m : implicitly_declared) + if (LAMBDA_FUNCTION_P (m)) + { + CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, + get_reflection_raw (loc, m)); + break; + } } return elts; } diff --git a/gcc/testsuite/g++.dg/reflect/members_of16.C b/gcc/testsuite/g++.dg/reflect/members_of16.C new file mode 100644 index 00000000000..f23d979e639 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/members_of16.C @@ -0,0 +1,8 @@ +// PR c++/125889 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include <meta> + +using L = decltype([]{}); +static_assert(std::meta::members_of(^^L, std::meta::access_context::unchecked()).size() > 0);
It seems desirable to check specifically for the call operator, since "It is implementation-defined whether declarations of other members of a closure type Q are Q-members-of-eligible."
Jason
