[Bug libstdc++/99433] [11 Regression] custom friend pipe-operator| conflicts with range adaptor?

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Apr 8 14:40:39 GMT 2021


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

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

https://gcc.gnu.org/g:a25321ca06f61e5aeadc00923249f83af72059c5

commit r11-8053-ga25321ca06f61e5aeadc00923249f83af72059c5
Author: Patrick Palka <ppalka@redhat.com>
Date:   Thu Apr 8 10:40:19 2021 -0400

    libstdc++: Reimplement range adaptors [PR99433]

    This rewrites our range adaptor implementation for more comprehensible
    error messages, improved SFINAE behavior and conformance to P2281.

    The diagnostic improvements mostly come from using appropriately named
    functors instead of lambdas in the generic implementation of partial
    application and composition of range adaptors, and in the definition of
    each of the standard range adaptors.  This makes their pretty printed
    types much shorter and more self-descriptive.

    The improved SFINAE behavior comes from constraining the range adaptors'
    member functions appropriately.  This improvement fixes PR99433, and is
    also necessary in order to implement the wording changes of P2281.

    Finally, P2281 clarified that partial application and composition of
    range adaptors behaves like a perfect forwarding call wrapper.  This
    patch implements this, except that we don't bother adding overloads for
    forwarding captured state entities as non-const lvalues, since it seems
    sufficient to handle the const lvalue and non-const rvalue cases for now,
    given the current set of standard range adaptors.  But such overloads
    can be easily added if they turn out to be needed.

    libstdc++-v3/ChangeLog:

            PR libstdc++/99433
            * include/std/ranges (__adaptor::__maybe_refwrap): Remove.
            (__adaptor::__adaptor_invocable): New concept.
            (__adaptor::__adaptor_partial_app_viable): New concept.
            (__adaptor::_RangeAdaptorClosure): Rewrite, turning it into a
            non-template base class.
            (__adaptor::_RangeAdaptor): Rewrite, turning it into a CRTP base
            class template.
            (__adaptor::_Partial): New class template that represents
            partial application of a range adaptor non-closure.
            (__adaptor::__pipe_invocable): New concept.
            (__adaptor::_Pipe): New class template.
            (__detail::__can_ref_view): New concept.
            (__detail::__can_subrange): New concept.
            (all): Replace the lambda here with ...
            (_All): ... this functor.  Add appropriate constraints.
            (__detail::__can_filter_view): New concept.
            (filter, _Filter): As in all/_All.
            (__detail::__can_transform): New concept.
            (transform, _Transform): As in all/_All.
            (__detail::__can_take_view): New concept.
            (take, _Take): As in all/_All.
            (__detail::__can_take_while_view): New concept.
            (take_while, _TakeWhile): As in all/_All.
            (__detail::__can_drop_view): New concept.
            (drop, _Drop): As in all/_All.
            (__detail::__can_drop_while_view): New concept.
            (drop_while, _DropWhile): As in all/_All.
            (__detail::__can_join_view): New concept.
            (join, _Join): As in all/_All.
            (__detail::__can_split_view): New concept.
            (split, _Split): As in all/_All.  Rename template parameter
            _Fp to _Pattern.
            (__detail::__already_common): New concept.
            (__detail::__can_common_view): New concept.
            (common, _Common): As in all/_All.
            (__detail::__can_reverse_view): New concept.
            (reverse, _Reverse): As in all/_All.
            (__detail::__can_elements_view): New concept.
            (elements, _Elements): As in all/_All.
            (keys, values): Adjust.
            * testsuite/std/ranges/adaptors/99433.cc: New test.
            * testsuite/std/ranges/adaptors/all.cc: No longer expect that
            adding empty range adaptor closure objects to a pipeline doesn't
            increase the size of the pipeline.
            (test05): New test.
            * testsuite/std/ranges/adaptors/common.cc (test03): New test.
            * testsuite/std/ranges/adaptors/drop.cc (test09): New test.
            * testsuite/std/ranges/adaptors/drop_while.cc (test04): New test.
            * testsuite/std/ranges/adaptors/elements.cc (test04): New test.
            * testsuite/std/ranges/adaptors/filter.cc (test06): New test.
            * testsuite/std/ranges/adaptors/join.cc (test09): New test.
            * testsuite/std/ranges/adaptors/p2281.cc: New test.
            * testsuite/std/ranges/adaptors/reverse.cc (test07): New test.
            * testsuite/std/ranges/adaptors/split.cc (test01, test04):
            Adjust.
            (test09): New test.
            * testsuite/std/ranges/adaptors/split_neg.cc (test01): Adjust
            expected error message.
            (test02): Likewise.  Extend test.
            * testsuite/std/ranges/adaptors/take.cc (test06): New test.
            * testsuite/std/ranges/adaptors/take_while.cc (test05): New test.
            * testsuite/std/ranges/adaptors/transform.cc (test07, test08):
            New test.


More information about the Gcc-bugs mailing list