From: Patrick Palka Date: Wed, 27 Nov 2024 16:59:38 +0000 (-0500) Subject: libstdc++/ranges: make _RangeAdaptorClosure befriend operator| X-Git-Tag: basepoints/gcc-16~3824 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56029c91dcadcfd1800614b7484d3dc82ca16dde;p=thirdparty%2Fgcc.git 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 --- diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 5153dcc26c4f..f4b897784797 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 - struct _RangeAdaptorClosure - { }; + struct _RangeAdaptorClosure; template requires (!same_as<_Tp, _RangeAdaptorClosure<_Up>>) @@ -984,6 +983,26 @@ namespace views::__adaptor } #pragma GCC diagnostic pop + template + 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 + requires __is_range_adaptor_closure<_Self> + && __adaptor_invocable<_Self, _Range> + friend constexpr auto + operator|(_Range&& __r, _Self&& __self); + + template + 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 diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in index 7d787a55555f..16e66c3d9210 100644 --- a/libstdc++-v3/src/c++23/std.cc.in +++ b/libstdc++-v3/src/c++23/std.cc.in @@ -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|; - } } }