Bug 108827 - [C++23] Implement P2387R3, Pipe support for user-defined range adaptors
Summary: [C++23] Implement P2387R3, Pipe support for user-defined range adaptors
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libstdc++ (show other bugs)
Version: 13.0
: P3 normal
Target Milestone: 14.0
Assignee: Patrick Palka
URL:
Keywords: ABI
Depends on:
Blocks: c++23-lib
  Show dependency treegraph
 
Reported: 2023-02-16 18:05 UTC by Patrick Palka
Modified: 2024-01-13 04:06 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2023-02-16 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Patrick Palka 2023-02-16 18:05:32 UTC
Tracker bug for https://wg21.link/p2387r3
Comment 1 GCC Commits 2023-04-18 11:23:39 UTC
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.
Comment 2 GCC Commits 2023-04-18 11:28:44 UTC
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)
Comment 3 GCC Commits 2023-08-17 16:40:14 UTC
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.
Comment 4 Jonathan Wakely 2023-09-07 12:51:19 UTC
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).
Comment 5 GCC Commits 2024-01-13 04:02:52 UTC
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.
Comment 6 Patrick Palka 2024-01-13 04:06:49 UTC
Fully implemented for GCC 14.