From patchwork Wed Mar 8 14:35:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 66261 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp370670wrd; Wed, 8 Mar 2023 06:36:35 -0800 (PST) X-Google-Smtp-Source: AK7set+Yw2tcNvwtzh14kflJ4rKMzqkwAcsBfdRpOkOZVD9GheoBo8/zcTHZqaZzeuYBjSxMmY6q X-Received: by 2002:a17:907:8b98:b0:8b1:76dd:f5f6 with SMTP id tb24-20020a1709078b9800b008b176ddf5f6mr24209744ejc.50.1678286195702; Wed, 08 Mar 2023 06:36:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1678286195; cv=none; d=google.com; s=arc-20160816; b=PIBLjBSsAJccQqY6/5pqV7CkasHOnYzvX1LKAXsfBhjT/CIP1NfAAh+SsB5HcP38hq 2UzamuzAOviZWXpFdGQPh93PZWAv4V++9PtXKdqczRqGfIvyWCCFN83AKWrfKooXeBn9 LmWK2eQgA5o6L1kp+WQHN1PWjBgiKAhOxa1P3Xk69lV1zQZw3i0pUtd2328iv5kgYy2m tO+gzsof7Zpej/4KF2wDhaF4ECN/wHndDWxdfL7IXn61PzJwfeaYnCdGgDWXOehmKHjg 1wZOxnfnuzNUyFMopvz/3uEVvzNrmlnCOJ29ChdElT+ADPaLPZ02vfAF/xGcqZ4TBj9g hCNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:message-id:date:subject:cc :to:dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=c5GhCg10ZSeJ4BhCwtf99Amj6Lzk5/2JnBOehEhJpsA=; b=gGjGdy7CwEQLv7vHz/ytS3u9tXMJUKOhtHaTfsyOqxwC5AdZYv+Z281OI/v7Pzdzwm St75ts9OJjQALH6gC5GSEBhDoQRiqmfTlZYAeKLcmSdE1jzQZSNdoaJIk79TTEBxiZ8Q 6THKLfMNIjpVMm2tdv/5DXzxU1ofzN64nue2XBZCSILZcJu9ombYsV902hiqC+ZE1T9q f3sIkFaoNYp2WsHMXc2OqkzMBf+DrDEE9GLVyIB4XUoAO4Z4EgfECN6qWDzcwM7VualK 33AIk7uAFNrLqH/CO7kvBQ9nL5CHXkqd4Wvy6t/uKRAaM1iyJvZ837Yo2Kb875dy960y FyQA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=HgubEj9X; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id gz27-20020a170907a05b00b008eb6f52bf2bsi4134850ejc.936.2023.03.08.06.36.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Mar 2023 06:36:35 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=HgubEj9X; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7F7793851143 for ; Wed, 8 Mar 2023 14:36:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7F7793851143 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1678286180; bh=c5GhCg10ZSeJ4BhCwtf99Amj6Lzk5/2JnBOehEhJpsA=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=HgubEj9XXScsdkY399t9P+W0re+wgcyQUSAGpKnPr6uLNCcvb4GxSN27wPSelYluY +6fS9H9QkJer7q81no9CD/HP7auSANpMyRb1xM5M463DYM7aINJE7FTj3r1wjOkRAJ SdxFdNLUv1li27499umcwOX9GGQB9AIV8vqDX0Mg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 C9A0738582B0 for ; Wed, 8 Mar 2023 14:35:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C9A0738582B0 Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-463-JoDV09tLOOu2aSGr1yvEmA-1; Wed, 08 Mar 2023 09:35:34 -0500 X-MC-Unique: JoDV09tLOOu2aSGr1yvEmA-1 Received: by mail-qv1-f69.google.com with SMTP id x10-20020ad440ca000000b005800220da38so8178406qvp.14 for ; Wed, 08 Mar 2023 06:35:33 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678286133; 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=c5GhCg10ZSeJ4BhCwtf99Amj6Lzk5/2JnBOehEhJpsA=; b=kVkDYGyDK9h7EOpOFvi/Rs1jB9yM/BU+8t/656hPHf38Id7JoLx9oNfyBreVw0RS+4 1ZVhtXNCKHFOhQ1+5bX25Uoc7P3YFdMbrgAmt4JBoNigYy1PaXUQ/scruKQHoI3kGFwV McZWvqIv34a4zAmSLSOZj9hGhdG0j8zg9I6+XsN231O97ih3OpeDQc8FabKq5QEOsklf pH7NCtJJakBYwd8q4EZzH3+Ly2d4CtdWCuOxeR6GUzmy1jBF8WrSs2upd2NM3YLm7rDz Z9zCfMw7d/iEXeuBRMcKB3v2AemZU/DPgP426q2sX8L5/zAPsSsDuuPUdZVMOY6/r54q yAFA== X-Gm-Message-State: AO0yUKX8vLmzodQZcWmB6ocS4k7XLJ5PZiJTI7V78tS2IEW+hQx36KCk pisXPvnjSWNVrOJkvPqdIQrsnTr647SrRHYzZnQLP+XkHAPe+I3WShO1ekJ/KqQNOGsjQkzGFlt oJc8bpNuHz36WfoiJthEC5Mvu057cYjeTVp+Qy4y8Qmv5l8GlMH68+UC18rNMzmRlh5FQTT/Ndk s= X-Received: by 2002:a05:6214:b6e:b0:56e:a6c6:445a with SMTP id ey14-20020a0562140b6e00b0056ea6c6445amr33262848qvb.31.1678286133123; Wed, 08 Mar 2023 06:35:33 -0800 (PST) X-Received: by 2002:a05:6214:b6e:b0:56e:a6c6:445a with SMTP id ey14-20020a0562140b6e00b0056ea6c6445amr33262796qvb.31.1678286132716; Wed, 08 Mar 2023 06:35:32 -0800 (PST) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id 6-20020a05620a040600b006f9ddaaf01esm11436322qkp.102.2023.03.08.06.35.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Mar 2023 06:35:32 -0800 (PST) To: gcc-patches@gcc.gnu.org Cc: libstdc++@gcc.gnu.org, Patrick Palka Subject: [PATCH] libstdc++: Make views::single/iota/istream SFINAE-friendly [PR108362] Date: Wed, 8 Mar 2023 09:35:27 -0500 Message-Id: <20230308143527.113337-1-ppalka@redhat.com> X-Mailer: git-send-email 2.40.0.rc0.57.g454dfcbddf MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-Patchwork-Original-From: Patrick Palka via Gcc-patches From: Patrick Palka Reply-To: Patrick Palka Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759810625750427560?= X-GMAIL-MSGID: =?utf-8?q?1759810625750427560?= Tested on x86_64-pc-linux-gnu, does this look OK for trunk and perhaps 12? PR libstdc++/108362 libstdc++-v3/ChangeLog: * include/std/ranges (__detail::__can_single_view): New concept. (_Single::operator()): Constrain it. Move [[nodiscard]] to the end of the function declarator. (__detail::__can_iota_view): New concept. (_Iota::operator()): Constrain it. Move [[nodiscard]] to the end of the function declarator. (__detail::__can_istream_view): New concept. (_Istream::operator()): Constrain it. Move [[nodiscard]] to the end of the function declarator. * testsuite/std/ranges/iota/iota_view.cc (test07): New test. * testsuite/std/ranges/istream_view.cc (test08): New test. * testsuite/std/ranges/single_view.cc (test07): New test. --- libstdc++-v3/include/std/ranges | 40 ++++++++++++++----- .../testsuite/std/ranges/iota/iota_view.cc | 10 +++++ .../testsuite/std/ranges/istream_view.cc | 12 ++++++ .../testsuite/std/ranges/single_view.cc | 13 ++++++ 4 files changed, 65 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 0a65d74bb5b..67566c6ebcf 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -675,30 +675,41 @@ namespace views template inline constexpr empty_view<_Tp> empty{}; + namespace __detail + { + template + concept __can_single_view + = requires { single_view>(std::declval<_Tp>()); }; + } // namespace __detail + struct _Single { - template - [[nodiscard]] + template<__detail::__can_single_view _Tp> constexpr auto - operator()(_Tp&& __e) const + operator() [[nodiscard]] (_Tp&& __e) const noexcept(noexcept(single_view>(std::forward<_Tp>(__e)))) { return single_view>(std::forward<_Tp>(__e)); } }; inline constexpr _Single single{}; + namespace __detail + { + template + concept __can_iota_view = requires { iota_view(std::declval<_Args>()...); }; + } // namespace __detail + struct _Iota { - template - [[nodiscard]] + template<__detail::__can_iota_view _Tp> constexpr auto - operator()(_Tp&& __e) const + operator() [[nodiscard]] (_Tp&& __e) const { return iota_view(std::forward<_Tp>(__e)); } template - [[nodiscard]] + requires __detail::__can_iota_view<_Tp, _Up> constexpr auto - operator()(_Tp&& __e, _Up&& __f) const + operator() [[nodiscard]] (_Tp&& __e, _Up&& __f) const { return iota_view(std::forward<_Tp>(__e), std::forward<_Up>(__f)); } }; @@ -796,13 +807,22 @@ namespace views namespace views { + namespace __detail + { + template + concept __can_istream_view + = requires (_Up __e) { + basic_istream_view<_Tp, typename _Up::char_type, typename _Up::traits_type>(__e); + }; + }; + template struct _Istream { template - [[nodiscard]] constexpr auto - operator()(basic_istream<_CharT, _Traits>& __e) const + operator() [[nodiscard]] (basic_istream<_CharT, _Traits>& __e) const + requires __detail::__can_istream_view<_Tp, std::remove_reference_t> { return basic_istream_view<_Tp, _CharT, _Traits>(__e); } }; diff --git a/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc b/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc index 2dd17113536..0d2eaf1d0c2 100644 --- a/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc +++ b/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc @@ -110,6 +110,15 @@ test06() VERIFY( std::ranges::equal(v3, w3) ); } +template +void +test07() +{ + // Verify SFINAE behavior. + static_assert(!requires { iota(nullptr); }); + static_assert(!requires { iota(nullptr, nullptr); }); +} + int main() { @@ -119,4 +128,5 @@ main() test04(); test05(); test06(); + test07(); } diff --git a/libstdc++-v3/testsuite/std/ranges/istream_view.cc b/libstdc++-v3/testsuite/std/ranges/istream_view.cc index 26f109fdeaa..cc1c3e006b9 100644 --- a/libstdc++-v3/testsuite/std/ranges/istream_view.cc +++ b/libstdc++-v3/testsuite/std/ranges/istream_view.cc @@ -115,6 +115,17 @@ test07() VERIFY( sum == 10 ); } +template +concept can_istream_view = requires (U u) { views::istream(u); }; + +void +test08() +{ + // Verify SFINAE behavior. + struct S { }; + static_assert(!can_istream_view); +} + int main() { @@ -125,4 +136,5 @@ main() test05(); test06(); test07(); + test08(); } diff --git a/libstdc++-v3/testsuite/std/ranges/single_view.cc b/libstdc++-v3/testsuite/std/ranges/single_view.cc index 063caeb8785..38a3946ca43 100644 --- a/libstdc++-v3/testsuite/std/ranges/single_view.cc +++ b/libstdc++-v3/testsuite/std/ranges/single_view.cc @@ -111,6 +111,18 @@ test06() auto y = std::views::single(std::move(obj)); } +template +void +test07() +{ + // Verify SFINAE behavior. + struct uncopyable { + uncopyable(); + uncopyable(const uncopyable&) = delete; + }; + static_assert(!requires { single(uncopyable{}); }); +} + int main() { test01(); @@ -119,4 +131,5 @@ int main() test04(); test05(); test06(); + test07(); }