From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by sourceware.org (Postfix) with ESMTP id 6F0113865C10 for ; Wed, 26 Aug 2020 20:45:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6F0113865C10 Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-324-W0Bd4f4MPASk_pXY8Apcag-1; Wed, 26 Aug 2020 16:45:01 -0400 X-MC-Unique: W0Bd4f4MPASk_pXY8Apcag-1 Received: by mail-qv1-f69.google.com with SMTP id p15so2564461qvv.7 for ; Wed, 26 Aug 2020 13:45:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IElfqSi1lq/dZxfs6CRw8jFOzWZcMarNQmbc4eIyjoc=; b=ZtpFZk8iydtTswlDfch0ljQt1wSwTxb2SzolavWEuUxePRftlXPoGzaomnXgaOSMKE uwzXpQOyNF7H3/ayFodObDCC1ZuR6z2QQ/uzLVF18nt3UU3/eKiXrdnvHkqVASzjWzlb uL25zA4wCx0E4YYVpUWcQXmAkkYDkMjDGB1OZCZtr1aydgmphf13k+7JyF3GqvRpFq0S 9WINgGgMYZwsna7apzWm0rLhw9/h32kcbhD5gvthDZv2tM+qb7vRjAYTrzOYrsgdTMzC fwH3uq5OpQ1M78QSZOw9VJe4hsqq+aO5ua1Rs4w/vPNVZTdIzdAlwOrXlPRlg8l3k0jL gSzA== X-Gm-Message-State: AOAM532trwhAUBn/+pBL/q4cp3lud95bsHb5F1q08gxno4RKv2UClOPd q1hIS5e3w5MjnG2+xsvbLgXz/rA/vvZvP6zySTBW5gx2VKsHfFTT5keGt8eDO/kLzwpN+QcKS5U pagBf2SYz9dGM+fzoiw== X-Received: by 2002:a37:71c6:: with SMTP id m189mr9094661qkc.327.1598474700832; Wed, 26 Aug 2020 13:45:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTbUc4FANKghueHjfg51ye6Z+1SXuOxmXAyTLUdBJpSgbBQxBKUEfek9REBnAgqOhLklOfvg== X-Received: by 2002:a37:71c6:: with SMTP id m189mr9094646qkc.327.1598474700542; Wed, 26 Aug 2020 13:45:00 -0700 (PDT) Received: from localhost.localdomain (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id h20sm131580qkk.79.2020.08.26.13.44.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Aug 2020 13:44:59 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Cc: libstdc++@gcc.gnu.org, Patrick Palka Subject: [PATCH 2/3] libstdc++: elements_view's sentinel and iterator not comparable [LWG 3406] Date: Wed, 26 Aug 2020 16:44:53 -0400 Message-Id: <20200826204454.1375362-2-ppalka@redhat.com> X-Mailer: git-send-email 2.28.0.337.ge9b77c84a0 In-Reply-To: <20200826204454.1375362-1-ppalka@redhat.com> References: <20200826204454.1375362-1-ppalka@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0.0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-16.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, 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: Wed, 26 Aug 2020 20:45:06 -0000 This implements the proposed resolution for LWG 3406 and adds a testcase for the example from P1994R1. libstdc++-v3/ChangeLog: LWG 3406 * include/std/ranges (elements_view::begin): Adjust constraints. (elements_view::end): Likewise. (elements_view::_Sentinel::operator==): Templatize to take both _Iterator and _Iterator. (elements_view::_Sentinel::operator-): Likewise. * testsuite/std/ranges/adaptors/elements.cc: Add testcase for the example from P1994R1. * testsuite/std/range/adaptors/lwg3406.cc: New test. --- libstdc++-v3/include/std/ranges | 39 ++++++++------- .../testsuite/std/ranges/adaptors/elements.cc | 22 +++++++++ .../testsuite/std/ranges/adaptors/lwg3406.cc | 48 +++++++++++++++++++ 3 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 libstdc++-v3/testsuite/std/ranges/adaptors/lwg3406.cc diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index efa8d2cf9f4..42028354b81 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -3362,15 +3362,15 @@ namespace views { return _Iterator(ranges::begin(_M_base)); } constexpr auto - begin() const requires __detail::__simple_view<_Vp> + begin() const requires range { return _Iterator(ranges::begin(_M_base)); } constexpr auto - end() + end() requires (!__detail::__simple_view<_Vp> && !common_range<_Vp>) { return _Sentinel{ranges::end(_M_base)}; } constexpr auto - end() requires common_range<_Vp> + end() requires (!__detail::__simple_view<_Vp> && common_range<_Vp>) { return _Iterator{ranges::end(_M_base)}; } constexpr auto @@ -3576,19 +3576,26 @@ namespace views base() const { return _M_end; } - friend constexpr bool - operator==(const _Iterator<_Const>& __x, const _Sentinel& __y) - { return __y._M_equal(__x); } - - friend constexpr range_difference_t<_Base> - operator-(const _Iterator<_Const>& __x, const _Sentinel& __y) - requires sized_sentinel_for, iterator_t<_Base>> - { return __x._M_current - __y._M_end; } - - friend constexpr range_difference_t<_Base> - operator-(const _Sentinel& __x, const _Iterator<_Const>& __y) - requires sized_sentinel_for, iterator_t<_Base>> - { return __x._M_end - __y._M_current; } + template + requires sentinel_for, + iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>> + friend constexpr bool + operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y) + { return __y._M_equal(__x); } + + template> + requires sized_sentinel_for, iterator_t<_Base2>> + friend constexpr range_difference_t<_Base2> + operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y) + { return __x._M_current - __y._M_end; } + + template> + requires sized_sentinel_for, iterator_t<_Base2>> + friend constexpr range_difference_t<_Base> + operator-(const _Sentinel& __x, const _Iterator<_Const2>& __y) + { return __x._M_end - __y._M_current; } friend _Sentinel; }; diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc index d846c4cf33e..af5c2d43bb6 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc @@ -45,8 +45,30 @@ test01() VERIFY( ranges::equal(v1, x | views::values) ); } +struct S +{ + friend bool + operator==(std::input_iterator auto const& i, S) + { return std::get<1>(*i) == 0; } +}; + +void +test02() +{ + // This verifies that P1994R1 (and LWG3406) is implemented. + std::pair, long> x[] + = {{{1,2},3l}, {{1,0},2l}, {{1,2},0l}}; + ranges::subrange r{ranges::begin(x), S{}}; + + auto v = r | views::keys; + VERIFY( ranges::equal(v, (std::pair[]){{1,2},{1,0}}) ); + ranges::subrange v2 = {ranges::begin(v), S{}}; + VERIFY( ranges::equal(v2, (std::pair[]){{1,2}}) ); +} + int main() { test01(); + test02(); } diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/lwg3406.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/lwg3406.cc new file mode 100644 index 00000000000..d36db22aad5 --- /dev/null +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/lwg3406.cc @@ -0,0 +1,48 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +namespace ranges = std::ranges; +namespace views = std::views; + +void +test01() +{ + std::tuple x[] = {{0,0}}; + auto v = x | views::elements<0>; + bool b = ranges::cbegin(v) == ranges::end(v); +} + +void +test02() +{ + std::tuple x = {0, 1}; + auto v = views::single(x) | views::elements<0>; + auto i = ranges::cbegin(v); +} + +int +main() +{ + test01(); + test02(); +} -- 2.28.0.337.ge9b77c84a0