From patchwork Thu Nov 30 15:47:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 81040 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 43FEE3860750 for ; Thu, 30 Nov 2023 15:48:05 +0000 (GMT) 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 4BEC03858C66 for ; Thu, 30 Nov 2023 15:47:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4BEC03858C66 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4BEC03858C66 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701359270; cv=none; b=DXah5oF8iIZoJbr4knUuBoj+PrRhR/AD70en9FU2oF6bFZWP2XwffYs29zasz1shm+q8YamxGQrczKqkNHczbjcyI3M1DaA1O+6OKGt62ZMTSpVh3WuEtvlatscL0R4XsvEwSApjz6tGadAO1sXEF2lJf2yI83F++YJc68OETx4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701359270; c=relaxed/simple; bh=1ZJkSXvIF49pqzBBRoQbg2doI/dCLJ3dfljPC6WjtXk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=h8d1yLuyqNHWEEd8y3hCo40M09RrZ6XpVajh69J1Ewc+Kd0EgTKRmm0ubxbw9icfDX2cw6fmPMYw29AnKzpDlSHrwGvGeRHBk5o8Me2T3oF2HS7TTlsq3eQ9VGydhCPfR6kKoMVrzLMwt/Mk4jQVE+F3PrRLvP25zrccg7P5Ycg= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1701359269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=0lvDeG+uWKUH69X5oCZgCzXN72v0eief8t8LxeYCy/s=; b=K9qPZRbjZLfa4l6lASMKy7kFF+5GWe8QM3HGG9/WMZXs3jnrcB6s7Qexf1O2m7YgYEU7Lc lXs++yfnQDu0yuCoXrxSUXvNEAuKH/UEuMqDkCFbSkvD82HcXNA7siMUBHaZFmg9UfOM+x aPNEYaRV+VrgqMEt92iJ/sc0/tmUau0= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-599-3UidK9UfOzGxNMzvZPHfaw-1; Thu, 30 Nov 2023 10:47:45 -0500 X-MC-Unique: 3UidK9UfOzGxNMzvZPHfaw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8B2D838117F3; Thu, 30 Nov 2023 15:47:45 +0000 (UTC) Received: from localhost (unknown [10.42.28.7]) by smtp.corp.redhat.com (Postfix) with ESMTP id 51FCE492BFC; Thu, 30 Nov 2023 15:47:45 +0000 (UTC) From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Fix std::ranges::to errors Date: Thu, 30 Nov 2023 15:47:24 +0000 Message-ID: <20231130154744.74164-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.1 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_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Tested x86_64-linux. Pushed to trunk. -- >8 -- Fix some errors that Patrick noticed, and remove a #if 0 group that I didn't mean to leave in the file. libstdc++-v3/ChangeLog: * include/std/ranges (__detail::__toable): Fix incorrect use of _Range instead of _Cont. (__detail::_ToClosure, __detail::_ToClosure2): Add missing constexpr specifier on constructors. * testsuite/std/ranges/conv/1.cc (_Cont, _Cont2, _Cont3): Remove unnecessary begin() and end() members. (test_constexpr): New function to check range adaptors are usable in constant expressions. --- libstdc++-v3/include/std/ranges | 26 +++--------------- libstdc++-v3/testsuite/std/ranges/conv/1.cc | 29 +++++++++++---------- 2 files changed, 19 insertions(+), 36 deletions(-) diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 63bea862c05..9d4c2e01c4d 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -9251,7 +9251,7 @@ namespace __detail template constexpr bool __toable = requires { - requires (!input_range<_Range> + requires (!input_range<_Cont> || convertible_to, range_value_t<_Cont>>); }; @@ -9290,7 +9290,7 @@ namespace __detail else if constexpr (constructible_from<_Cont, from_range_t, _Rg, _Args...>) return _Cont(from_range, std::forward<_Rg>(__r), std::forward<_Args>(__args)...); - else if constexpr (requires { common_range<_Rg>; + else if constexpr (requires { requires common_range<_Rg>; typename __iter_category_t>; requires derived_from<__iter_category_t>, input_iterator_tag>; @@ -9346,26 +9346,6 @@ namespace __detail bool operator==(const _InputIter&) const; }; -#if 0 - template typename _Cont, typename _Rg, - typename... _Args> - concept __deduce_expr_1 = requires { - _Cont(std::declval<_Rg>(), std::declval<_Args>()...); - }; - - template typename _Cont, typename _Rg, - typename... _Args> - concept __deduce_expr_2 = requires { - _Cont(from_range, std::declval<_Rg>(), std::declval<_Args>()...); - }; - - template typename _Cont, typename _Rg, - typename... _Args> - concept __deduce_expr_3 = requires(_InputIter<_Rg> __i) { - _Cont(std::move(__i), std::move(__i), std::declval<_Args>()...); - }; -#endif - template typename _Cont, input_range _Rg, typename... _Args> using _DeduceExpr1 @@ -9418,6 +9398,7 @@ namespace __detail tuple...> _M_bound_args; public: + constexpr _ToClosure(_Args&&... __args) : _M_bound_args(std::forward<_Args>(__args)...) { } @@ -9498,6 +9479,7 @@ namespace __detail tuple...> _M_bound_args; public: + constexpr _ToClosure2(_Args&&... __args) : _M_bound_args(std::forward<_Args>(__args)...) { } diff --git a/libstdc++-v3/testsuite/std/ranges/conv/1.cc b/libstdc++-v3/testsuite/std/ranges/conv/1.cc index 0032cf32688..4b6814b1add 100644 --- a/libstdc++-v3/testsuite/std/ranges/conv/1.cc +++ b/libstdc++-v3/testsuite/std/ranges/conv/1.cc @@ -89,9 +89,6 @@ struct Cont1 : c(r, args...) { } - typename C::iterator begin(); - typename C::iterator end(); - C c; }; @@ -153,9 +150,6 @@ struct Cont2 : c(r, args...) { } - typename C::iterator begin(); - typename C::iterator end(); - C c; }; @@ -186,9 +180,6 @@ struct Cont3 : c(first, last, args...) { } - typename C::iterator begin(); - typename C::iterator end(); - C c; }; @@ -222,10 +213,6 @@ struct Cont4 Cont4() { } Cont4(typename C::allocator_type a) : c(a) { } - // Required to satisfy range - typename C::iterator begin() { return c.begin(); } - typename C::iterator end() { return c.end(); } - // Satisfying container-insertable requires either this ... template requires UsePushBack @@ -254,7 +241,9 @@ struct Cont4 used_reserve = true; } - // Required to satisfy reservable-container + // Satisfying sized_range is required to satisfy reservable-container + typename C::iterator begin() { return c.begin(); } + typename C::iterator end() { return c.end(); } auto size() const { return c.size(); } // Required to satisfy reservable-container @@ -355,6 +344,17 @@ test_nodiscard() std::ranges::to(); // { dg-warning "ignoring return" } } +void +test_constexpr() +{ + constexpr int x = [](int i) { + auto c1 = std::views::iota(1, i) | std::ranges::to>(); + auto c2 = std::views::iota(i, 10) | std::ranges::to(); + return c1[0] + c2[0]; + }(5); + static_assert(x == 6); +} + int main() { test_p1206r7_examples(); @@ -366,4 +366,5 @@ int main() test_2_2(); test_lwg3984(); test_nodiscard(); + test_constexpr(); }