On Wed, 27 Nov 2024 at 15:43, Patrick Palka <ppa...@redhat.com> wrote: > > Tested on x86_64-pc-linux-gnu, does this look OK for trunk?
OK > > -- >8 -- > > 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. > --- > libstdc++-v3/include/std/ranges | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > > diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges > index 5153dcc26c4..9d30e3a8e9d 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 operator| 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 > -- > 2.47.1.313.gcc01bad4a9 >