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 [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 294193857721 for ; Wed, 12 Apr 2023 15:05:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 294193857721 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1681311909; 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: in-reply-to:in-reply-to:references:references; bh=0IH6i9ZiL5Ml4XraXyDAuGCZffZjO7TCh3cWe397aI4=; b=DXhwmsh0OweeauDVjIFPIuL5E+i6MWAoz3FTeScUnuJu5fTg2FH6CdPoOwjeL/LMF9kim4 DrgmmyFnPs/8n49pPMM7XjT5sdI3N/W/wFaLSzeFBkShtB+zklQc0iPzs3Cs5UljSkzIEE bjtEjIeiMEH9JTPGyCEBrpgApcfwql4= Received: from mail-lj1-f197.google.com (mail-lj1-f197.google.com [209.85.208.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-45-9zakrWGOPZmtYvQ1URv1cQ-1; Wed, 12 Apr 2023 11:05:08 -0400 X-MC-Unique: 9zakrWGOPZmtYvQ1URv1cQ-1 Received: by mail-lj1-f197.google.com with SMTP id bd2-20020a05651c168200b002a7970aad88so783765ljb.18 for ; Wed, 12 Apr 2023 08:05:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1681311907; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0IH6i9ZiL5Ml4XraXyDAuGCZffZjO7TCh3cWe397aI4=; b=JGWdF+P+34XSjiASITz445RUuqPBYsAr8BlUmV2RI5yuZgpg4pp53Zs4ZrKXeINpbP 1YuBRdekfm8YgXo2qPtOFtTKut05t/xIWGLCfF6DfxzjaciGh3c2b6Hwtk67QEsfAAyp pNf270fluKbpIHuLd4N0aKy8EjJPFcwhd/uWpxf37dIC1kTlFTzLx2WO1TljIxfa4yvI cUdunXqgTe6geqz4nXBOABL6S6nRD/efYin8S/DHgYrxDRMpPXbLMB/dDiotH3I7qmsD hoUX0eT02BZiPRjObeUmzb+ctEkS+vuSOdl80wymEfZUm5/XqVOJwoEx/ISnsFrp0hbI 8mug== X-Gm-Message-State: AAQBX9c2oT0pVZtuKxaSRba8yDcdIFbxJxUHDWFmnN/h3fO9ieqntqkT GWHg2TEKpKgPMEOFQC2794HtfpX3qnfwV2POcGQ7hNSWtJWOY3fDzgZAW1HjdZH8nb1Zp/+jaaH 2kChjvplLwADiSNiJY/lSToNwX0YFD18= X-Received: by 2002:a2e:8e96:0:b0:2a1:d819:f0ae with SMTP id z22-20020a2e8e96000000b002a1d819f0aemr2119490ljk.9.1681311906967; Wed, 12 Apr 2023 08:05:06 -0700 (PDT) X-Google-Smtp-Source: AKy350ZOjDKI2Z6Z4gXmmvkzTmvU4H039JcDBJV9hT8nk2lIh+IqXA6GudtwRx2zEulJxylOPafVa301OwGP1VhmHlw= X-Received: by 2002:a2e:8e96:0:b0:2a1:d819:f0ae with SMTP id z22-20020a2e8e96000000b002a1d819f0aemr2119478ljk.9.1681311906635; Wed, 12 Apr 2023 08:05:06 -0700 (PDT) MIME-Version: 1.0 References: <20230412144124.3356890-1-ppalka@redhat.com> In-Reply-To: <20230412144124.3356890-1-ppalka@redhat.com> From: Jonathan Wakely Date: Wed, 12 Apr 2023 16:04:59 +0100 Message-ID: Subject: Re: [PATCH] libstdc++: Fix chunk_by_view when value_type& and reference differ [PR108291] To: Patrick Palka Cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-12.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_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Wed, 12 Apr 2023 at 15:41, Patrick Palka via Libstdc++ wrote: > > Tested on x86_64-pc-linux-gnu, does this look OK for trunk? OK, thanks. > > PR libstdc++/108291 > > libstdc++-v3/ChangeLog: > > * include/std/ranges (chunk_by_view::_M_find_next): Generalize > parameter types of the predicate passed to adjacent_find. > (chunk_by_view::_M_find_prev): Likewise. > * testsuite/std/ranges/adaptors/chunk_by/1.cc (test04, test05): > New tests. > --- > libstdc++-v3/include/std/ranges | 8 ++--- > .../std/ranges/adaptors/chunk_by/1.cc | 35 +++++++++++++++++++ > 2 files changed, 39 insertions(+), 4 deletions(-) > > diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges > index be71c370eb7..dc37a8afe51 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -6743,8 +6743,8 @@ namespace views::__adaptor > _M_find_next(iterator_t<_Vp> __current) > { > __glibcxx_assert(_M_pred.has_value()); > - auto __pred = [this](_Tp&& __x, _Tp&& __y) { > - return !bool((*_M_pred)(std::forward<_Tp>(__x), std::forward<_Tp>(__y))); > + auto __pred = [this](_Tp&& __x, _Up&& __y) { > + return !bool((*_M_pred)(std::forward<_Tp>(__x), std::forward<_Up>(__y))); > }; > auto __it = ranges::adjacent_find(__current, ranges::end(_M_base), __pred); > return ranges::next(__it, 1, ranges::end(_M_base)); > @@ -6754,8 +6754,8 @@ namespace views::__adaptor > _M_find_prev(iterator_t<_Vp> __current) requires bidirectional_range<_Vp> > { > __glibcxx_assert(_M_pred.has_value()); > - auto __pred = [this](_Tp&& __x, _Tp&& __y) { > - return !bool((*_M_pred)(std::forward<_Tp>(__y), std::forward<_Tp>(__x))); > + auto __pred = [this](_Tp&& __x, _Up&& __y) { > + return !bool((*_M_pred)(std::forward<_Up>(__y), std::forward<_Tp>(__x))); > }; > auto __rbegin = std::make_reverse_iterator(__current); > auto __rend = std::make_reverse_iterator(ranges::begin(_M_base)); > diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/chunk_by/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/chunk_by/1.cc > index f165c7d9a95..a8fceb105e0 100644 > --- a/libstdc++-v3/testsuite/std/ranges/adaptors/chunk_by/1.cc > +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/chunk_by/1.cc > @@ -61,10 +61,45 @@ test03() > ranges::chunk_by_view, ranges::equal_to> r; > } > > +constexpr bool > +test04() > +{ > + // PR libstdc++/108291 > + using namespace std::literals; > + std::string_view s = "hello"; > + auto r = s | views::chunk_by(std::less{}); > + VERIFY( ranges::equal(r, > + (std::string_view[]){"h"sv, "el"sv, "lo"sv}, > + ranges::equal) ); > + VERIFY( ranges::equal(r | views::reverse, > + (std::string_view[]){"lo"sv, "el"sv, "h"sv}, > + ranges::equal) ); > + > + return true; > +} > + > +void > +test05() > +{ > + // PR libstdc++/109474 > + std::vector v = {true, false, true, true, false, false}; > + auto r = v | views::chunk_by(std::equal_to{}); > + VERIFY( ranges::equal(r, > + (std::initializer_list[]) > + {{true}, {false}, {true, true}, {false, false}}, > + ranges::equal) ); > + VERIFY( ranges::equal(r | views::reverse, > + (std::initializer_list[]) > + {{false, false}, {true, true}, {false}, {true}}, > + ranges::equal) ); > +} > + > int > main() > { > static_assert(test01()); > test02(); > test03(); > + static_assert(test04()); > + test05(); > } > -- > 2.40.0.335.g9857273be0 >