From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 112971 invoked by alias); 24 Feb 2020 13:43:20 -0000 Mailing-List: contact libstdc++-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libstdc++-owner@gcc.gnu.org Received: (qmail 112913 invoked by uid 89); 24 Feb 2020 13:43:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 spammy= X-HELO: us-smtp-1.mimecast.com Received: from us-smtp-delivery-1.mimecast.com (HELO us-smtp-1.mimecast.com) (205.139.110.120) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Feb 2020 13:43:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582551797; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UkqWLdQLnWcnKcyeJqajK17d5rM6Z4/hKPEcLOpmS/k=; b=VoQ/SIYnRl2cH4k+2q5ZOO6NYVIXACJ61P7PFtGpppUo14LOdPFH8pudyy0kYUbSVqb/zl udqWnb3UojRCuEc+IAtRGYEfnApy/Y977RZVBWuZIRT5G9bjqA3mwIkat7QAurlOLfjjGo cRQP+pAsSpXn8rYqZQ1wkQSc4ciTgS8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-384-kmm8Yw_QPeCRlUaaIvzCww-1; Mon, 24 Feb 2020 08:43:14 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 08055800D54; Mon, 24 Feb 2020 13:43:13 +0000 (UTC) Received: from localhost (unknown [10.33.36.96]) by smtp.corp.redhat.com (Postfix) with ESMTP id A6015100164D; Mon, 24 Feb 2020 13:43:12 +0000 (UTC) Date: Mon, 24 Feb 2020 13:43:00 -0000 From: Jonathan Wakely To: Patrick Palka Cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org Subject: Re: [PATCH] libstdc++: Add missing bits of P0896R4 pertaining to [back|front]_insert_iterator Message-ID: <20200224134311.GB9441@redhat.com> References: <20200224132934.559186-1-ppalka@redhat.com> MIME-Version: 1.0 In-Reply-To: <20200224132934.559186-1-ppalka@redhat.com> X-Clacks-Overhead: GNU Terry Pratchett X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg00153.txt.bz2 On 24/02/20 08:29 -0500, Patrick Palka wrote: >This adds some missing pieces of the Ranges TS that make back_insert_itera= tor 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 i= nspect >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_iterat= or/pr93884.C > create mode 100644 libstdc++-v3/testsuite/24_iterators/front_insert_itera= tor/pr93884.C > >diff --git a/libstdc++-v3/include/bits/ranges_algobase.h b/libstdc++-v3/in= clude/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 =3D iter_value_t<_Iter>; >- using _ValueTypeO =3D iter_value_t<_Out>; >+ using _ValueTypeO =3D iterator_traits<_Out>::value_type; I think this will fail to compile with Clang, because it needs 'typename' there. > constexpr bool __use_memmove > =3D (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 =3D iter_value_t<_Iter>; >- using _ValueTypeO =3D iter_value_t<_Out>; >+ using _ValueTypeO =3D iterator_traits<_Out>::value_type; Same here.