From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by sourceware.org (Postfix) with ESMTP id 91BB33851C3E for ; Mon, 29 Mar 2021 18:49:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 91BB33851C3E Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-522-BL8Pz_E-NSGv7mAfCmDMyA-1; Mon, 29 Mar 2021 14:49:22 -0400 X-MC-Unique: BL8Pz_E-NSGv7mAfCmDMyA-1 Received: by mail-qk1-f197.google.com with SMTP id k68so12863377qke.2 for ; Mon, 29 Mar 2021 11:49:21 -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=88BgkPpGG29+wnNjwCP8sTTefo00Vs7uD8O0uw2Gzis=; b=Kn2o2fZ9CDx8FYWUMfBq/P/uHqHQBxA9v65/+9QARp8dyZ+jrX0Gk+PcEoKJzmEWKX 99cKgJWOt9orDbglbbvBHv3Nf/BJN2vsu+A+DO64opRE+tWd3tOfFk4ZIfpbioDQWyfp 570UM6xiEGZ4V4DhhaHu/g2iCo/Ura1I6tfRKwn4Lo3mPV6M6zixBLED4FI1N7RJ6pz6 WDp4jqCIATVacvqddFHS+Zpyj7bPpe7OaX/t2npi20dDUxqn8yGoNEbbK4ib9oAItwJI 9OIEtmZHI84yxA2UsLjgyTHR5ha2ExIsbgUxUsVLpNsllAjGC5K/aCUcyCkF5d5XC+22 saMw== X-Gm-Message-State: AOAM530A0/V9jdq5LtROnyAjx6YYdnukfT1CbNrTk+qbg6SXIQfrqIRh 3DfPQOnBszp5UM5YOyYrpDEORdljyPjlCKHUF4ScxekoeN0Kn5TrjWMIoM0bfXNGGjjEXTgbXMH 6+5iD9zO+gjwgEBQ= X-Received: by 2002:a0c:f6cd:: with SMTP id d13mr26262454qvo.20.1617043761510; Mon, 29 Mar 2021 11:49:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJykncHGNIyha5vDQHjar4CVMt040gLUle4FrEbJdtQAarFvAYQUtIrCRkRDP6DTK6LXxvQx6w== X-Received: by 2002:a0c:f6cd:: with SMTP id d13mr26262444qvo.20.1617043761343; Mon, 29 Mar 2021 11:49:21 -0700 (PDT) Received: from localhost.localdomain (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id b198sm13879591qkg.10.2021.03.29.11.49.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Mar 2021 11:49:20 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Cc: libstdc++@gcc.gnu.org, Patrick Palka Subject: [PATCH 3/3] libstdc++: Fix split_view::_OuterIter::operator++ [LWG 3505] Date: Mon, 29 Mar 2021 14:49:15 -0400 Message-Id: <20210329184915.3921422-3-ppalka@redhat.com> X-Mailer: git-send-email 2.31.1.133.g84d06cdc06 In-Reply-To: <20210329184915.3921422-1-ppalka@redhat.com> References: <20210329184915.3921422-1-ppalka@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" X-Spam-Status: No, score=-16.2 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_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, 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: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Mar 2021 18:49:24 -0000 libstdc++-v3/ChangeLog: * include/std/ranges (__detail::find): Define. (split_view::_OuterIter::operator++): Apply proposed resolution of LWG 3505. * testsuite/std/ranges/adaptors/split.cc (test10): New test. --- libstdc++-v3/include/std/ranges | 28 ++++++++++++++++--- .../testsuite/std/ranges/adaptors/split.cc | 12 ++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 9077271e4e6..baec8c0efef 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -982,6 +982,16 @@ namespace views::__adaptor // having to include that entire header. namespace __detail { + template + constexpr _Iter + find(_Iter __first, _Sent __last, const _Tp& __value) + { + while (__first != __last + && !(bool)(*__first == __value)) + ++__first; + return __first; + } + template constexpr _Iter find_if(_Iter __first, _Sent __last, _Pred __pred) @@ -2656,21 +2666,31 @@ namespace views::__adaptor constexpr _OuterIter& operator++() { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3505. split_view::outer-iterator::operator++ misspecified const auto __end = ranges::end(_M_parent->_M_base); if (__current() == __end) return *this; const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern}; if (__pbegin == __pend) ++__current(); + else if constexpr (__detail::__tiny_range<_Pattern>) + { + __current() = __detail::find(std::move(__current()), __end, + *__pbegin); + if (__current() != __end) + ++__current(); + } else do { auto [__b, __p] - = __detail::mismatch(std::move(__current()), __end, - __pbegin, __pend); - __current() = std::move(__b); + = __detail::mismatch(__current(), __end, __pbegin, __pend); if (__p == __pend) - break; + { + __current() = __b; + break; + } } while (++__current() != __end); return *this; } diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc index b9fb3728708..9d2cfa8632a 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc @@ -182,6 +182,17 @@ test09() static_assert(requires { adapt2(s); }); } +void +test10() +{ + // LWG 3505 + auto to_string = [] (auto r) { + return std::string(r.begin(), ranges::next(r.begin(), r.end())); + }; + auto v = "xxyx"sv | views::split("xy"sv) | views::transform(to_string); + VERIFY( ranges::equal(v, (std::string_view[]){"x", "x"}) ); +} + int main() { @@ -194,4 +205,5 @@ main() test07(); test08(); test09(); + test10(); } -- 2.31.1.133.g84d06cdc06