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]));

Reply via email to