https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108827

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>:

https://gcc.gnu.org/g:4a6f3676e7dd9e73a822f4da634b037299f0d482

commit r14-3293-g4a6f3676e7dd9e73a822f4da634b037299f0d482
Author: Patrick Palka <ppa...@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 <jwak...@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.
  • [Bug libstdc++/108827] [C++23] ... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to