]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++/ranges: make _RangeAdaptorClosure befriend operator|
authorPatrick Palka <ppalka@redhat.com>
Wed, 27 Nov 2024 16:59:38 +0000 (11:59 -0500)
committerPatrick Palka <ppalka@redhat.com>
Wed, 27 Nov 2024 16:59:38 +0000 (11:59 -0500)
This declares the range adaptor pipe operators a friend of the
_RangeAdaptorClosure base class so that the std module doesn't need to
export them for ADL to find them.

Note that we deliberately don't define these pipe operators as hidden
friends, see r14-3293-g4a6f3676e7dd9e.

libstdc++-v3/ChangeLog:

* include/std/ranges (views::__adaptor::_RangeAdaptorClosure):
Befriend both operator| overloads.
* src/c++23/std.cc.in: Don't export views::__adaptor::operator|.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/include/std/ranges
libstdc++-v3/src/c++23/std.cc.in

index 5153dcc26c4f98de0622f82d570dfdfff55f719e..f4b897784797f23f24369ab103fc2c694e0cbd40 100644 (file)
@@ -949,8 +949,7 @@ namespace views::__adaptor
   // _S_has_simple_call_op to true if the behavior of this adaptor is
   // independent of the constness/value category of the adaptor object.
   template<typename _Derived>
-    struct _RangeAdaptorClosure
-    { };
+    struct _RangeAdaptorClosure;
 
   template<typename _Tp, typename _Up>
     requires (!same_as<_Tp, _RangeAdaptorClosure<_Up>>)
@@ -984,6 +983,26 @@ namespace views::__adaptor
     }
 #pragma GCC diagnostic pop
 
+  template<typename _Derived>
+    struct _RangeAdaptorClosure
+    {
+      // In non-modules compilation ADL finds these operators either way and
+      // the friend declarations are redundant.  But with the std module these
+      // friend declarations enable ADL to find these operators without having
+      // to export them.
+      template<typename _Self, typename _Range>
+       requires __is_range_adaptor_closure<_Self>
+         && __adaptor_invocable<_Self, _Range>
+       friend constexpr auto
+       operator|(_Range&& __r, _Self&& __self);
+
+      template<typename _Lhs, typename _Rhs>
+       requires __is_range_adaptor_closure<_Lhs>
+         && __is_range_adaptor_closure<_Rhs>
+       friend constexpr auto
+       operator|(_Lhs&& __lhs, _Rhs&& __rhs);
+    };
+
   // The base class of every range adaptor non-closure.
   //
   // The static data member _Derived::_S_arity must contain the total number of
index 7d787a55555f7ea5ccf2b56b4bbd6cccf29e9bd9..16e66c3d9210c632e9afa79343f95491175dda00 100644 (file)
@@ -2366,12 +2366,6 @@ export namespace std
     using ranges::concat_view;
     namespace views { using views::concat; }
 #endif
-
-    // FIXME can we avoid this export using friends?
-    namespace views::__adaptor
-    {
-      using __adaptor::operator|;
-    }
   }
 }