From patchwork Tue Jan 11 15:20:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 49872 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 A83C438A9431 for ; Tue, 11 Jan 2022 15:21:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A83C438A9431 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1641914504; bh=BIlIA0oEG46g+ol4KyXe1xlNECWiyy0nI7ulsh0EHJ4=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=miAbEU6QgyAFblKFmqRez8cc6t2RHUIYGdn55ROH8+TJa42x+d5zsBbem48uehl+R nXAJu4c2UxVDcFZfjJtLbNIw0CsOo00+ljK1AIKI5wy0BhOiDuOv2NW/jOBy7AEA04 ChuPqASZWvw30rck3Bzv9Dx7HkWifIR+4B9mLCiY= 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 6FE9038A1425 for ; Tue, 11 Jan 2022 15:20:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6FE9038A1425 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-467-arep9E36PlWmLmVULn6w2Q-1; Tue, 11 Jan 2022 10:20:43 -0500 X-MC-Unique: arep9E36PlWmLmVULn6w2Q-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0674C1006AA6; Tue, 11 Jan 2022 15:20:42 +0000 (UTC) Received: from localhost (unknown [10.33.36.252]) by smtp.corp.redhat.com (Postfix) with ESMTP id 980DF7DE23; Tue, 11 Jan 2022 15:20:41 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Make copyable-box completely constexpr (LWG 3572) Date: Tue, 11 Jan 2022 15:20:40 +0000 Message-Id: <20220111152040.2577391-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.9 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_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=unavailable autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Jonathan Wakely via Gcc-patches From: Jonathan Wakely Reply-To: Jonathan Wakely Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Tested powerpc64le-linux. Pushed to trunk. This LWG issue was approved at the October 2021 plenary and can be implemented now that std::optional is fully constexpr. libstdc++-v3/ChangeLog: * include/std/ranges (ranges::__detail::__box): Add constexpr to assignment operators (LWG 3572). * testsuite/std/ranges/adaptors/filter.cc: Check assignment of a view that uses copyable-box. --- libstdc++-v3/include/std/ranges | 5 ++-- .../testsuite/std/ranges/adaptors/filter.cc | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index c90d33c89fb..780a3633417 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -109,7 +109,8 @@ namespace ranges // _GLIBCXX_RESOLVE_LIB_DEFECTS // 3477. Simplify constraints for semiregular-box - __box& + // 3572. copyable-box should be fully constexpr + constexpr __box& operator=(const __box& __that) noexcept(is_nothrow_copy_constructible_v<_Tp>) requires (!copyable<_Tp>) @@ -124,7 +125,7 @@ namespace ranges return *this; } - __box& + constexpr __box& operator=(__box&& __that) noexcept(is_nothrow_move_constructible_v<_Tp>) requires (!movable<_Tp>) diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/filter.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/filter.cc index b8d081e1d5e..ed5a01ca595 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/filter.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/filter.cc @@ -140,6 +140,33 @@ test06() static_assert(!requires { views::all | filter; }); } +constexpr bool +test07() +{ + struct Pred + { + constexpr Pred() { } + constexpr Pred(const Pred&) { } + constexpr Pred(Pred&&) { } + // These make it non-copyable, so non-copyable-box will provide + // assignment. + Pred& operator=(const Pred&) = delete; + Pred& operator=(Pred&&) = delete; + + bool operator()(int i) const { return i < 10; } + }; + + int i = 0; + ranges::filter_view v(views::single(i), Pred{}); + // LWG 3572. copyable-box should be fully constexpr + v = v; + v = std::move(v); + + return true; +} + +static_assert( test07() ); + int main() { @@ -150,4 +177,5 @@ main() test05(); test05(); test06(); + test07(); }