aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-11-27 11:59:38 -0500
committerPatrick Palka <ppalka@redhat.com>2024-11-27 11:59:38 -0500
commit56029c91dcadcfd1800614b7484d3dc82ca16dde (patch)
tree6e226f60e767a4a90e01da85360f5b6e11f333bd /libstdc++-v3/include/std
parent958f0025f41d8bd9812e4da91a72b1ad79496e5b (diff)
downloadgcc-56029c91dcadcfd1800614b7484d3dc82ca16dde.zip
gcc-56029c91dcadcfd1800614b7484d3dc82ca16dde.tar.gz
gcc-56029c91dcadcfd1800614b7484d3dc82ca16dde.tar.bz2
libstdc++/ranges: make _RangeAdaptorClosure befriend operator|
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>
Diffstat (limited to 'libstdc++-v3/include/std')
-rw-r--r--libstdc++-v3/include/std/ranges23
1 files changed, 21 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 5153dcc..f4b8977 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -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