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 ESMTP id 77F4A3968C0B for ; Thu, 29 Apr 2021 15:05:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 77F4A3968C0B Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-510-I7zsdXJuPFiILAjilTT6RA-1; Thu, 29 Apr 2021 11:05:08 -0400 X-MC-Unique: I7zsdXJuPFiILAjilTT6RA-1 Received: by mail-qk1-f198.google.com with SMTP id 81-20020a370c540000b02902e4d7b9e448so6362839qkm.16 for ; Thu, 29 Apr 2021 08:05:07 -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:mime-version :content-transfer-encoding; bh=L60fViVvDWS5zKV56LM4TIdYy9YAHCNTsHVOQL9ARNQ=; b=hXlj1bCp+uleFUNbxV5OnhBC2BQqWL57MmGU+VKA6q0qW8KSaYbBiSS/FPL9aL5CLH nUeGQ+Oue2LRiheUYSeZqClm9YCafTn2euW4OYwXcP0qD/XNkVG8fXz8bQ5wmXPoaxzJ w50bSzQ5mgzMIghBxbrstExSfsxBZdDg3iVJlVDm/XnOYW5HArDd3S8X8AxaD5ijwdlF 4HOIWqTmtg6VhVIdnqh3hxrgLFwCgzi0x4IFQunuI86NEwOJPngUkN6RKx2I/QYwbCPM VWJDSP1H6iD5T/heNSbPsTf3QtLNuxvM1oiPoyJTCinrquOvnPV4C3XFErt/S50UUcT2 CNCA== X-Gm-Message-State: AOAM530MLnQZ32GbYpQmZYEphb6vkRdCU1SSkz3H377/pVSVclFd1zUk 9SR/Iei9BWoRh4MUfx3GTKTupPv1iqRldE2Vs5d96MXDV95f9Zb6XaW4zn9dYQsTai7Eqk/p5yW XcPEzfEDZ3nSxMPuTqWLlJYcVCDru/OsSMWdlmhlvhRfmpGjAI2HoZxlmfJhn7mYvMgg= X-Received: by 2002:a05:620a:918:: with SMTP id v24mr127465qkv.54.1619708705999; Thu, 29 Apr 2021 08:05:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwabO75TidSjqFWv3AgWI3tTeFlsIOX6ZKQlOZH9V6QMjISz8FYnPqLw77fPWPbOyJyQjnv3Q== X-Received: by 2002:a05:620a:918:: with SMTP id v24mr127414qkv.54.1619708705474; Thu, 29 Apr 2021 08:05:05 -0700 (PDT) Received: from localhost.localdomain (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id f24sm94216qto.45.2021.04.29.08.05.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:05:04 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Cc: libstdc++@gcc.gnu.org, Patrick Palka Subject: [PATCH] c++: Implement P2367 changes to avoid some list-initialization Date: Thu, 29 Apr 2021 11:04:59 -0400 Message-Id: <20210429150459.609423-1-ppalka@redhat.com> X-Mailer: git-send-email 2.31.1.362.g311531c9de 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, KAM_SHORT, 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: 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: Thu, 29 Apr 2021 15:05:15 -0000 This implements the wording changes of P2367R0 "Remove misuses of list-initialization from Clause 24", modulo the parts that depend on P1739R4 which we don't yet implement (due to LWG 3407). Tested on x86_64-pc-linux-gnu, does this look OK for trunk? libstdc++-v3/ChangeLog: * include/bits/ranges_util.h (subrange::subrange): Avoid list-initialization in delegating constructor. * include/std/ranges (single_view): Replace implicit guide with explicit deduction guide that decays its argument. (_Single::operator()): Avoid CTAD when constructing the single_view object. (_Iota::operator()): Avoid list-initialization. (__detail::__can_filter_view, _Filter::operator()): Likewise. (__detail::__can_transform_view, _Transform::operator()): Likewise. (take_view::begin): Likewise. (__detail::__can_take_view, _Take::operator()): Likewise. (__detail::__can_take_while_view, _TakeWhile::operator()): Likewise. (__detail::__can_drop_view, _Drop::operator()): Likewise. (__detail::__can_drop_while_view, _DropWhile::operator()): Likewise. (split_view::split_view): Use views::single when initializing _M_pattern. (__detail::__can_split_view, _Split::operator()): Avoid list-initialization. (_Counted::operator()): Likewise. * testsuite/std/ranges/p2367.cc: New test. --- libstdc++-v3/include/bits/ranges_util.h | 2 +- libstdc++-v3/include/std/ranges | 55 ++++++++++++---------- libstdc++-v3/testsuite/std/ranges/p2367.cc | 48 +++++++++++++++++++ 3 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 libstdc++-v3/testsuite/std/ranges/p2367.cc diff --git a/libstdc++-v3/include/bits/ranges_util.h b/libstdc++-v3/include/bits/ranges_util.h index 9d51e1b874e..589886eb157 100644 --- a/libstdc++-v3/include/bits/ranges_util.h +++ b/libstdc++-v3/include/bits/ranges_util.h @@ -251,7 +251,7 @@ namespace ranges && convertible_to, _Sent> constexpr subrange(_Rng&& __r) requires (!_S_store_size) - : subrange{ranges::begin(__r), ranges::end(__r)} + : subrange(ranges::begin(__r), ranges::end(__r)) { } template diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 74075a2d6d3..a3779d1ed0c 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -246,6 +246,9 @@ namespace ranges [[no_unique_address]] __detail::__box<_Tp> _M_value; }; + template + single_view(_Tp) -> single_view<_Tp>; + namespace __detail { template @@ -597,7 +600,7 @@ namespace views template constexpr auto operator()(_Tp&& __e) const - { return single_view{std::forward<_Tp>(__e)}; } + { return single_view>(std::forward<_Tp>(__e)); } }; inline constexpr _Single single{}; @@ -607,12 +610,12 @@ namespace views template constexpr auto operator()(_Tp&& __e) const - { return iota_view{std::forward<_Tp>(__e)}; } + { return iota_view(std::forward<_Tp>(__e)); } template constexpr auto operator()(_Tp&& __e, _Up&& __f) const - { return iota_view{std::forward<_Tp>(__e), std::forward<_Up>(__f)}; } + { return iota_view(std::forward<_Tp>(__e), std::forward<_Up>(__f)); } }; inline constexpr _Iota iota{}; @@ -1336,7 +1339,7 @@ namespace views::__adaptor { template concept __can_filter_view - = requires { filter_view{std::declval<_Range>(), std::declval<_Pred>()}; }; + = requires { filter_view(std::declval<_Range>(), std::declval<_Pred>()); }; } // namespace __detail struct _Filter : __adaptor::_RangeAdaptor<_Filter> @@ -1346,7 +1349,7 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Pred&& __p) const { - return filter_view{std::forward<_Range>(__r), std::forward<_Pred>(__p)}; + return filter_view(std::forward<_Range>(__r), std::forward<_Pred>(__p)); } using _RangeAdaptor<_Filter>::operator(); @@ -1717,7 +1720,7 @@ namespace views::__adaptor { template concept __can_transform_view - = requires { transform_view{std::declval<_Range>(), std::declval<_Fp>()}; }; + = requires { transform_view(std::declval<_Range>(), std::declval<_Fp>()); }; } // namespace __detail struct _Transform : __adaptor::_RangeAdaptor<_Transform> @@ -1727,7 +1730,7 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Fp&& __f) const { - return transform_view{std::forward<_Range>(__r), std::forward<_Fp>(__f)}; + return transform_view(std::forward<_Range>(__r), std::forward<_Fp>(__f)); } using _RangeAdaptor<_Transform>::operator(); @@ -1813,11 +1816,11 @@ namespace views::__adaptor else { auto __sz = size(); - return counted_iterator{ranges::begin(_M_base), __sz}; + return counted_iterator(ranges::begin(_M_base), __sz); } } else - return counted_iterator{ranges::begin(_M_base), _M_count}; + return counted_iterator(ranges::begin(_M_base), _M_count); } constexpr auto @@ -1830,11 +1833,11 @@ namespace views::__adaptor else { auto __sz = size(); - return counted_iterator{ranges::begin(_M_base), __sz}; + return counted_iterator(ranges::begin(_M_base), __sz); } } else - return counted_iterator{ranges::begin(_M_base), _M_count}; + return counted_iterator(ranges::begin(_M_base), _M_count); } constexpr auto @@ -1897,7 +1900,7 @@ namespace views::__adaptor { template concept __can_take_view - = requires { take_view{std::declval<_Range>(), std::declval<_Tp>()}; }; + = requires { take_view(std::declval<_Range>(), std::declval<_Tp>()); }; } // namespace __detail struct _Take : __adaptor::_RangeAdaptor<_Take> @@ -1907,7 +1910,7 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Tp&& __n) const { - return take_view{std::forward<_Range>(__r), std::forward<_Tp>(__n)}; + return take_view(std::forward<_Range>(__r), std::forward<_Tp>(__n)); } using _RangeAdaptor<_Take>::operator(); @@ -2016,7 +2019,7 @@ namespace views::__adaptor { template concept __can_take_while_view - = requires { take_while_view{std::declval<_Range>(), std::declval<_Pred>()}; }; + = requires { take_while_view(std::declval<_Range>(), std::declval<_Pred>()); }; } // namespace __detail struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile> @@ -2026,7 +2029,7 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Pred&& __p) const { - return take_while_view{std::forward<_Range>(__r), std::forward<_Pred>(__p)}; + return take_while_view(std::forward<_Range>(__r), std::forward<_Pred>(__p)); } using _RangeAdaptor<_TakeWhile>::operator(); @@ -2135,7 +2138,7 @@ namespace views::__adaptor { template concept __can_drop_view - = requires { drop_view{std::declval<_Range>(), std::declval<_Tp>()}; }; + = requires { drop_view(std::declval<_Range>(), std::declval<_Tp>()); }; } // namespace __detail struct _Drop : __adaptor::_RangeAdaptor<_Drop> @@ -2145,7 +2148,7 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Tp&& __n) const { - return drop_view{std::forward<_Range>(__r), std::forward<_Tp>(__n)}; + return drop_view(std::forward<_Range>(__r), std::forward<_Tp>(__n)); } using _RangeAdaptor<_Drop>::operator(); @@ -2217,7 +2220,7 @@ namespace views::__adaptor { template concept __can_drop_while_view - = requires { drop_while_view{std::declval<_Range>(), std::declval<_Pred>()}; }; + = requires { drop_while_view(std::declval<_Range>(), std::declval<_Pred>()); }; } // namespace __detail struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile> @@ -2227,8 +2230,8 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Pred&& __p) const { - return drop_while_view{std::forward<_Range>(__r), - std::forward<_Pred>(__p)}; + return drop_while_view(std::forward<_Range>(__r), + std::forward<_Pred>(__p)); } using _RangeAdaptor<_DropWhile>::operator(); @@ -2948,7 +2951,7 @@ namespace views::__adaptor && constructible_from<_Pattern, single_view>> constexpr split_view(_Range&& __r, range_value_t<_Range> __e) - : _M_pattern(std::move(__e)), + : _M_pattern(views::single(std::move(__e))), _M_base(views::all(std::forward<_Range>(__r))) { } @@ -3012,7 +3015,7 @@ namespace views::__adaptor { template concept __can_split_view - = requires { split_view{std::declval<_Range>(), std::declval<_Pattern>()}; }; + = requires { split_view(std::declval<_Range>(), std::declval<_Pattern>()); }; } // namespace __detail struct _Split : __adaptor::_RangeAdaptor<_Split> @@ -3022,7 +3025,7 @@ namespace views::__adaptor constexpr auto operator()(_Range&& __r, _Pattern&& __f) const { - return split_view{std::forward<_Range>(__r), std::forward<_Pattern>(__f)}; + return split_view(std::forward<_Range>(__r), std::forward<_Pattern>(__f)); } using _RangeAdaptor<_Split>::operator(); @@ -3041,10 +3044,10 @@ namespace views::__adaptor operator()(_Iter __i, iter_difference_t<_Iter> __n) const { if constexpr (random_access_iterator<_Iter>) - return subrange{__i, __i + __n}; + return subrange(__i, __i + __n); else - return subrange{counted_iterator{std::move(__i), __n}, - default_sentinel}; + return subrange(counted_iterator(std::move(__i), __n), + default_sentinel); } }; diff --git a/libstdc++-v3/testsuite/std/ranges/p2367.cc b/libstdc++-v3/testsuite/std/ranges/p2367.cc new file mode 100644 index 00000000000..d099f623bfd --- /dev/null +++ b/libstdc++-v3/testsuite/std/ranges/p2367.cc @@ -0,0 +1,48 @@ +// Copyright (C) 2021 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 } } + +// Verify P2367 changes. + +#include + +namespace ranges = std::ranges; +namespace views = std::views; + +void +test01() +{ + extern int (&x)[5]; + + // Verify changes to single_view. + using ranges::single_view; + using std::same_as; + same_as> auto v1 = views::single(x); + same_as> auto v2 = views::single((const int)5); + same_as>> auto v3 = views::single(v2); + + // Verify changes to take_view. + auto v4 = views::take(x, 0ull); + + // Verify changes to drop_view. + auto v5 = views::drop(x, 0ull); + + // Verify changes to split_view. + auto v6 = views::split(x, 5u); +} -- 2.31.1.362.g311531c9de