From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by sourceware.org (Postfix) with ESMTP id C9DD13850421 for ; Mon, 21 Sep 2020 13:31:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C9DD13850421 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-354-SUmgo-qmP-e1-iwLnmL7dA-1; Mon, 21 Sep 2020 09:31:16 -0400 X-MC-Unique: SUmgo-qmP-e1-iwLnmL7dA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 46BFB10A7AE6; Mon, 21 Sep 2020 13:31:15 +0000 (UTC) Received: from localhost (unknown [10.33.36.46]) by smtp.corp.redhat.com (Postfix) with ESMTP id E858C5D9E4; Mon, 21 Sep 2020 13:31:14 +0000 (UTC) Date: Mon, 21 Sep 2020 14:31:14 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Relax constraints on transform_view and elements_view iterators Message-ID: <20200921133114.GA448294@redhat.com> MIME-Version: 1.0 X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="fUYQa+Pmc3FrFX/N" Content-Disposition: inline X-Spam-Status: No, score=-14.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Sep 2020 13:31:21 -0000 --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: inline libstdc++-v3/ChangeLog: * include/std/ranges (transform_view, elements_view): Relax constraints on operator- for iterators, as per LWG 3483. * testsuite/std/ranges/adaptors/elements.cc: Check that we can take the difference of two iterators from a non-random access range. * testsuite/std/ranges/adaptors/transform.cc: Likewise. Tested powerpc64le-linux. Committed to trunk. I'll backport this to gcc-10 too. --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="patch.txt" commit 2ec58cfcea146a61755516ce4ed160827fe0b4ff Author: Jonathan Wakely Date: Mon Sep 21 14:30:38 2020 libstdc++: Relax constraints on transform_view and elements_view iterators libstdc++-v3/ChangeLog: * include/std/ranges (transform_view, elements_view): Relax constraints on operator- for iterators, as per LWG 3483. * testsuite/std/ranges/adaptors/elements.cc: Check that we can take the difference of two iterators from a non-random access range. * testsuite/std/ranges/adaptors/transform.cc: Likewise. diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 23a04d61174..005e89f94b2 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -1833,9 +1833,11 @@ namespace views requires random_access_range<_Base> { return {*__i._M_parent, __i._M_current - __n}; } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3483. transform_view::iterator's difference is overconstrained friend constexpr difference_type operator-(const _Iterator& __x, const _Iterator& __y) - requires random_access_range<_Base> + requires sized_sentinel_for, iterator_t<_Base>> { return __x._M_current - __y._M_current; } friend constexpr decltype(auto) @@ -3538,9 +3540,11 @@ namespace views requires random_access_range<_Base> { return _Iterator{__x} -= __y; } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3483. transform_view::iterator's difference is overconstrained friend constexpr difference_type operator-(const _Iterator& __x, const _Iterator& __y) - requires random_access_range<_Base> + requires sized_sentinel_for, iterator_t<_Base>> { return __x._M_current - __y._M_current; } friend _Sentinel<_Const>; diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc index 3026adf4f28..94dd7c94505 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc @@ -66,9 +66,33 @@ test02() VERIFY( ranges::equal(v2, (std::pair[]){{1,2}}) ); } +struct X +{ + using Iter = __gnu_test::forward_iterator_wrapper>; + + friend auto operator-(Iter l, Iter r) { return l.ptr - r.ptr; } +}; + +void +test03() +{ + // LWG 3483 + std::pair x[3]; + __gnu_test::test_forward_range> r(x); + auto v = views::elements<1>(r); + auto b = begin(v); + static_assert( !ranges::random_access_range ); + static_assert( std::sized_sentinel_for ); + VERIFY( (next(b, 1) - b) == 1 ); + const auto v_const = v; + auto b_const = begin(v_const); + VERIFY( (next(b_const, 2) - b_const) == 2 ); +} + int main() { test01(); test02(); + test03(); } diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc index c14e36e0cef..41a7d3b3321 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc @@ -122,6 +122,29 @@ test05() b = ranges::end(v); } +struct Y +{ + using Iter = __gnu_test::forward_iterator_wrapper; + + friend auto operator-(Iter l, Iter r) { return l.ptr - r.ptr; } +}; + +void +test06() +{ + // LWG 3483 + Y y[3]; + __gnu_test::test_forward_range r(y); + auto v = views::transform(r, std::identity{}); + auto b = begin(v); + static_assert( !ranges::random_access_range ); + static_assert( std::sized_sentinel_for ); + VERIFY( (next(b, 1) - b) == 1 ); + const auto v_const = v; + auto b_const = begin(v_const); + VERIFY( (next(b_const, 2) - b_const) == 2 ); +} + int main() { @@ -130,4 +153,5 @@ main() test03(); test04(); test05(); + test06(); } --fUYQa+Pmc3FrFX/N--