On 24/02/20 08:53 -0500, Patrick Palka wrote:
On Mon, 24 Feb 2020, Jonathan Wakely wrote:

On 24/02/20 08:29 -0500, Patrick Palka wrote:
> This adds some missing pieces of the Ranges TS that make
> back_insert_iterator and
> front_insert_iterator conform to the new output_iterator requirements.
>
> It also fixes a bug in ranges::__copy_or_move and
> ranges::__copy_or_move_backward in which we were inspecting the iter_value_t
> of
> the output iterator, but iterators such as back_insert_iterator and
> front_insert_iterator whose value_type is defined to be void do not have an
> iter_value_t according to [readable.traits] p4.  The entire __use_memmove
> condition can probably be refactored, but the simplest fix for now is to
> inspect
> the iterator_traits of the output iterator instead.
>
> libstdc++-v3/ChangeLog:
>
>    PR libstdc++/93884
>    * include/bits/ranges_algobase.h (__copy_or_move,
>    __copy_or_move_backward): Don't inspect the iter_value_t of the output
>    iterator, instead inspect its iterator_traits directly.
>    * include/bits/stl_iterator.h (back_insert_iterator::container):
>    Conditionally initialize.
>    (back_insert_iterator::difference_type): Conditionally define.
>    (back_insert_iterator::back_insert_iterator): Conditionally define
> this
>    default constructor.
>    (front_insert_iterator::container): Conditionally initialize.
>    (front_insert_iterator::difference_type): Conditionally define.
>    (front_insert_iterator::front_insert_iterator): Conditionally define
>    this default constructor.
> ---
> libstdc++-v3/include/bits/ranges_algobase.h   |  4 +-
> libstdc++-v3/include/bits/stl_iterator.h      | 22 ++++++++++
> .../back_insert_iterator/pr93884.C            | 44 +++++++++++++++++++
> .../front_insert_iterator/pr93884.C           | 44 +++++++++++++++++++
> 4 files changed, 112 insertions(+), 2 deletions(-)
> create mode 100644
> libstdc++-v3/testsuite/24_iterators/back_insert_iterator/pr93884.C
> create mode 100644
> libstdc++-v3/testsuite/24_iterators/front_insert_iterator/pr93884.C
>
> diff --git a/libstdc++-v3/include/bits/ranges_algobase.h
> b/libstdc++-v3/include/bits/ranges_algobase.h
> index 807822e99c8..739424e1a2d 100644
> --- a/libstdc++-v3/include/bits/ranges_algobase.h
> +++ b/libstdc++-v3/include/bits/ranges_algobase.h
> @@ -249,7 +249,7 @@ namespace ranges
>       else if constexpr (sized_sentinel_for<_Sent, _Iter>)
>    {
>      using _ValueTypeI = iter_value_t<_Iter>;
> -    using _ValueTypeO = iter_value_t<_Out>;
> +    using _ValueTypeO = iterator_traits<_Out>::value_type;

I think this will fail to compile with Clang, because it needs
'typename' there.

>      constexpr bool __use_memmove
>        = (is_trivially_copyable_v<_ValueTypeI>
>           && is_same_v<_ValueTypeI, _ValueTypeO>
> @@ -386,7 +386,7 @@ namespace ranges
>       else if constexpr (sized_sentinel_for<_Sent, _Iter>)
>    {
>      using _ValueTypeI = iter_value_t<_Iter>;
> -    using _ValueTypeO = iter_value_t<_Out>;
> +    using _ValueTypeO = iterator_traits<_Out>::value_type;

Same here.

Ah right... Here's v2 of the patch that adds typename to those two
aliases and fixes the file extensions on the tests.

OK for master, thanks.

Reply via email to