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.133.124]) by sourceware.org (Postfix) with ESMTPS id 6F43D3858418 for ; Wed, 12 Apr 2023 14:41:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6F43D3858418 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=1681310489; 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; bh=lVCLnGOOLYgAHT3FwVNQBAknCOS5+kr/FDz3rMNRaz4=; b=N03k4M5+yqCJZ0NoQsclCSwY5/AbXEa91SBav/LZ7f+el5MV/sIqE7KJJrffLmeTJy4yYd X42QVYtxThd6Ztl3m0fPamz0bkJbbP8PcE0sd1JYvvjincZj3y5bZt5yMFwQwGiiH6DueK qzaVbizoUFRzoeAWURALLAdfW0pjpbw= Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-564-zBPzh5msOiiQ4ThVCXreJQ-1; Wed, 12 Apr 2023 10:41:28 -0400 X-MC-Unique: zBPzh5msOiiQ4ThVCXreJQ-1 Received: by mail-qt1-f200.google.com with SMTP id c6-20020ac87d86000000b003e4df699997so7155810qtd.20 for ; Wed, 12 Apr 2023 07:41:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1681310487; x=1683902487; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lVCLnGOOLYgAHT3FwVNQBAknCOS5+kr/FDz3rMNRaz4=; b=N9c6stwNmVT78Gk2xmFZRWWMg4vI53Fax6F12fYDM0rn01j5NL7hFyuVIFP/dCeuYL LWHityCVMz180KNT/x9yk9wONWPf8iyHjVmkKu4qhDIncXyTmhT8Vs/ytS3boH8yqFY7 TMueFK0M45nE27oW6kzWdxdpiZQsCRxRPl2o/SdK2gjH3g5x37cLu2XP9IiYV32adbhA 12n1Yq/1CqtMYwXwoH6zjFo5DIGcZiJv+nLZInphHEpYClaUhBgm1wrGBu1LaNHDrVH5 XOrEaleQybOOPk6uXZ0qytaf6O7ompFZgOuJfLyO58C/pe56Zz69a33zF+WmLjVT9YMn 8KWA== X-Gm-Message-State: AAQBX9edbMxKcksXO9bxsNk/6UpU6ByOv08ThAZ/oGoXy/dz5uDQ/nry HWSabnQDrDygCaUNK4F9HE6dhKolbWhUAhCb8UVXTMhrNFcE1h4VxMDgTIK05JtN+nPeXsPsLzO 60swzWWF5qO2JauNue80Fq8DDRQrrANaUiU/ZbK3v4azLVmrV0cEUxIL1ilg/+8ci7pY4nC4O/G A= X-Received: by 2002:ac8:4e85:0:b0:3d3:fe29:1caf with SMTP id 5-20020ac84e85000000b003d3fe291cafmr4477344qtp.0.1681310487005; Wed, 12 Apr 2023 07:41:27 -0700 (PDT) X-Google-Smtp-Source: AKy350bWJV4/r6s1W/TR2BtcGpfqzcI0WZteclIMVygeZ11uHcYwUoWZD6GFRH+NjcJSwEOgWFJErQ== X-Received: by 2002:ac8:4e85:0:b0:3d3:fe29:1caf with SMTP id 5-20020ac84e85000000b003d3fe291cafmr4477301qtp.0.1681310486619; Wed, 12 Apr 2023 07:41:26 -0700 (PDT) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id q11-20020ac8734b000000b003dffd3d3df5sm4296957qtp.2.2023.04.12.07.41.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Apr 2023 07:41:26 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Cc: libstdc++@gcc.gnu.org, Patrick Palka Subject: [PATCH] libstdc++: Fix chunk_by_view when value_type& and reference differ [PR108291] Date: Wed, 12 Apr 2023 10:41:24 -0400 Message-ID: <20230412144124.3356890-1-ppalka@redhat.com> X-Mailer: git-send-email 2.40.0.335.g9857273be0 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-default=true X-Spam-Status: No, score=-13.7 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=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Tested on x86_64-pc-linux-gnu, does this look OK for trunk? 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