Tracker bug for https://wg21.link/p2387r3
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:cb5c71d16d0fb47638498365f5c857ce7c673eaf commit r14-29-gcb5c71d16d0fb47638498365f5c857ce7c673eaf Author: Patrick Palka <ppalka@redhat.com> Date: Tue Apr 18 07:21:13 2023 -0400 libstdc++: Implement range_adaptor_closure from P2387R3 [PR108827] PR libstdc++/108827 libstdc++-v3/ChangeLog: * include/bits/ranges_cmp.h (__cpp_lib_ranges): Bump value for C++23. * include/std/ranges (range_adaptor_closure): Define for C++23. * include/std/version (__cpp_lib_ranges): Bump value for C++23. * testsuite/std/ranges/version_c++23.cc: Bump expected value of __cpp_lib_ranges. * testsuite/std/ranges/range_adaptor_closure.cc: New test.
The releases/gcc-13 branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:769c324424500a3d20de7417f62a4e7bce345775 commit r13-7214-g769c324424500a3d20de7417f62a4e7bce345775 Author: Patrick Palka <ppalka@redhat.com> Date: Tue Apr 18 07:21:13 2023 -0400 libstdc++: Implement range_adaptor_closure from P2387R3 [PR108827] PR libstdc++/108827 libstdc++-v3/ChangeLog: * include/bits/ranges_cmp.h (__cpp_lib_ranges): Bump value for C++23. * include/std/ranges (range_adaptor_closure): Define for C++23. * include/std/version (__cpp_lib_ranges): Bump value for C++23. * testsuite/std/ranges/version_c++23.cc: Bump expected value of __cpp_lib_ranges. * testsuite/std/ranges/range_adaptor_closure.cc: New test. (cherry picked from commit cb5c71d16d0fb47638498365f5c857ce7c673eaf)
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:4a6f3676e7dd9e73a822f4da634b037299f0d482 commit r14-3293-g4a6f3676e7dd9e73a822f4da634b037299f0d482 Author: Patrick Palka <ppalka@redhat.com> Date: Thu Aug 17 12:40:04 2023 -0400 libstdc++: Convert _RangeAdaptorClosure into a CRTP base [PR108827] Using the CRTP idiom for this base class avoids bloating the size of a pipeline when adding distinct empty range adaptor closure objects to it, as detailed in section 4.1 of P2387R3. But it means we can no longer define its operator| overloads as hidden friends, since it'd mean each instantiation of _RangeAdaptorClosure introduces its own distinct set of hidden friends. So e.g. for the outer | in x | (views::reverse | views::join) ADL would find 6 distinct hidden operator| friends: two from _RangeAdaptorClosure<_Reverse> two from _RangeAdaptorClosure<_Join> two from _RangeAdaptorClosure<_Pipe<_Reverse, _Join>> but we really only want to consider the last two. We avoid this issue by instead defining the operator| overloads at namespace scope alongside _RangeAdaptorClosure. This should be fine because the only types defined in this namespace are _RangeAdaptorClosure, _RangeAdaptor, _Pipe and _Partial, so we don't have to worry about unintentional ADL. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> PR libstdc++/108827 libstdc++-v3/ChangeLog: * include/std/ranges (__adaptor::_RangeAdaptorClosure): Convert into a CRTP class template. Move hidden operator| friends into namespace scope and adjust their constraints. (__closure::__is_range_adaptor_closure_fn): Define. (__closure::__is_range_adaptor_closure): Define. (__adaptor::_Partial): Adjust use of _RangeAdaptorClosure. (__adaptor::_Pipe): Likewise. (views::_All): Likewise. (views::_Join): Likewise. (views::_Common): Likewise. (views::_Reverse): Likewise. (views::_Elements): Likewise. (views::_Adjacent): Likewise. (views::_AsRvalue): Likewise. (views::_Enumerate): Likewise. (views::_AsConst): Likewise. * testsuite/std/ranges/adaptors/all.cc: Reinstate assertion expecting that adding empty range adaptor closure objects to a pipeline doesn't increase the size of a pipeline.
The new bind_back call wrapper still needs to be added (which will need to be done before https://wg21.link/p2714r1 can be implemented for C++26).
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:ac1a399bf61b04845f5d6fc34e4b7a4db2bc5760 commit r14-7220-gac1a399bf61b04845f5d6fc34e4b7a4db2bc5760 Author: Patrick Palka <ppalka@redhat.com> Date: Fri Jan 12 23:02:12 2024 -0500 libstdc++: Implement C++23 std::bind_back from P2387R3 [PR108827] The implementation is based off of std::bind_front. Since this is a C++23 feature we use deducing this unconditionally. PR libstdc++/108827 PR libstdc++/111327 libstdc++-v3/ChangeLog: * include/bits/version.def (bind_back): Define. * include/bits/version.h: Regenerate. * include/std/functional (_Bind_back): Define for C++23. (bind_back): Likewise. * testsuite/20_util/function_objects/bind_back/1.cc: New test (adapted from corresponding bind_front test). * testsuite/20_util/function_objects/bind_back/111327.cc: Likewise.
Fully implemented for GCC 14.