https://gcc.gnu.org/g:7555c9b1c86b72049049fdde1c987cc7a6505fb0
commit r16-9143-g7555c9b1c86b72049049fdde1c987cc7a6505fb0 Author: Marek Polacek <[email protected]> Date: Thu Jun 18 16:54:43 2026 -0400 c++/reflection: include lambda op() in members_of [PR125889] 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. Reviewed-by: Jason Merrill <[email protected]> (cherry picked from commit 4dc96a3ea00e6876bef3321288343c0abe78bd39) Diff: --- gcc/cp/reflect.cc | 7 +++++++ gcc/testsuite/g++.dg/reflect/members_of16.C | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index 5f4d1d84b242..9a1dded537f9 100644 --- a/gcc/cp/reflect.cc +++ b/gcc/cp/reflect.cc @@ -7067,6 +7067,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 000000000000..5a59c69728bb --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/members_of16.C @@ -0,0 +1,14 @@ +// PR c++/125889 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include <meta> + +using L = decltype([]{}); +/* There should be at least operator(). */ +static_assert(members_of(^^L, std::meta::access_context::unchecked()).size() > 0); +/* This is lazy; there can be more members than the call operator: + "It is implementation-defined whether declarations of other members of + a closure type Q are Q-members-of-eligible." At least we'll know when + something changes, though. */ +static_assert(is_operator_function(members_of(^^L, std::meta::access_context::unchecked())[0]));
