From patchwork Wed Jul 20 23:00:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Pan2 via Gcc-patches" X-Patchwork-Id: 85 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e252:0:0:0:0:0 with SMTP id bl18csp1178178wrb; Wed, 20 Jul 2022 16:02:59 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vILImqoxI+XPXYorA79+gbb9/aQuvlixqEbc9z8PLEq/LVEujPJRcixg2Ry1FICHMy59Ao X-Received: by 2002:a17:906:98c8:b0:72b:41dc:c271 with SMTP id zd8-20020a17090698c800b0072b41dcc271mr38555651ejb.36.1658358179103; Wed, 20 Jul 2022 16:02:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658358179; cv=none; d=google.com; s=arc-20160816; b=D3/KPen9DfI+VHF2tKeBO1SKkMguGXkVUG4zw0aHxWQt2xPznyZyBXciHcpEhvrOuh Bx3CjNNugbKsG+Z8H1VDWbj+Q48XR0/24TxjfWdn/Czd3qIWa2wNnd0rKc9euBVb/5eQ wHBK10ng2Z69/vqCkHQ/ws+TQY9vs5P9ZwI3iyoL2mwFFaDXI1wWZFLlou1p0M9O0yED dL9XdlI2kmMjGAD3Sr/+d92GnyvByQR+ymzFnOgEB8bbdFkGwrWIeA+sDsRBDxp6QxGm RL5jUiTIxVVCqfhsTAJ1m+zd+QTQsuPlBUjPoScaG58X5HzmFnB/lYC6tDt9P9XEZo81 gfvA== 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:references:in-reply-to :message-id:date:subject:to:dmarc-filter:delivered-to:dkim-signature :dkim-filter; bh=rpvfRu0tTT+jedW+BiQVSSFbdugQrw08ak5XXRK9eN8=; b=uX6LDdEeB1hLz4aWVaSd3VkaLy0RDW10s7BLlfBoEv1+QO7FUTyiRC1eqRvsv8zk60 95P42dibi3Tpife0xPu/DYOSS7BL+47t5dLWldTQeJaYa9YaQwkqsXXFbk2PwdgP+j4a 0q4XbOz0HB58X2FCiSL/lgzJj8fj+kdh8OXTDFzqrS1nRt+n6NyB1NieFpv/LA4dtHSh 2w8MuLM6KP+6SKDTsS+yuDLWKhnI38wfVSESugEtNgxKBqlJedpXAYfXK/abY8/qwkUe M5yYNONjwl4BVob5UIeEX/XPszcrx3KEaP8RmXDtQ6+BWPJyOzTOV6UMq/U2iUP58ARD x+8A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=lNkMI4SU; 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 b13-20020a056402084d00b0043b5531e9acsi384848edz.469.2022.07.20.16.02.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 16:02:59 -0700 (PDT) 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=lNkMI4SU; 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 07FF43857407 for ; Wed, 20 Jul 2022 23:02:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 07FF43857407 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1658358122; bh=rpvfRu0tTT+jedW+BiQVSSFbdugQrw08ak5XXRK9eN8=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=lNkMI4SUYKlqxbvzaigl7fjw/yUkDRoLWESdUtHPGlxM20wyX+q1wzQ0Vha3pshGv 55CaO93zxamLkWC58vWxDynSqKqkVHyyEhc+ASRYO9dndt1f2UA2BQB3Yqo5iWSpbm D1GvvHalDbly9dX+XjMXGTtNmipgDRCxnxAm6v2U= 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.133.124]) by sourceware.org (Postfix) with ESMTPS id 557493858C2C for ; Wed, 20 Jul 2022 23:00:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 557493858C2C Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-458-BqNoneFfMNyVnzDiXNAj0Q-1; Wed, 20 Jul 2022 19:00:14 -0400 X-MC-Unique: BqNoneFfMNyVnzDiXNAj0Q-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A86CC185A7BA; Wed, 20 Jul 2022 23:00:13 +0000 (UTC) Received: from localhost (unknown [10.33.36.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7565F492C3B; Wed, 20 Jul 2022 23:00:13 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed 3/3] libstdc++: Fix std::common_iterator triviality [PR100823] Date: Thu, 21 Jul 2022 00:00:11 +0100 Message-Id: <20220720230011.2732391-3-jwakely@redhat.com> In-Reply-To: <20220720230011.2732391-1-jwakely@redhat.com> References: <20220720230011.2732391-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.2 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, SPF_HELO_NONE, SPF_NONE, TXREP, URI_HEX autolearn=ham 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: Jonathan Wakely via Gcc-patches From: "Li, Pan2 via Gcc-patches" Reply-To: Jonathan Wakely 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?1738914585981909818?= X-GMAIL-MSGID: =?utf-8?q?1738914585981909818?= Tested powerpc64le-linux, pushed to trunk. -- >8 -- This fixes the remaining problem reported in the PR, that the special members should be trivial. This can be done by constraining the non-trivial versions and adding defaulted overloads that will be used when the union members are trivial. Making these members trivial alters the argument passing ABI and so isn't suitable for backporting to release branches. libstdc++-v3/ChangeLog: PR libstdc++/100823 * include/bits/stl_iterator.h (common_iterator): Define destructor, copy constructor and move constructor as trivial when the underlying types allow. * testsuite/24_iterators/common_iterator/100823.cc: Check triviality of special members. --- libstdc++-v3/include/bits/stl_iterator.h | 15 +++++++++++++++ .../24_iterators/common_iterator/100823.cc | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index a913c04deaa..9cd262cd1d9 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -1925,9 +1925,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } + common_iterator(const common_iterator&) = default; + constexpr common_iterator(const common_iterator& __x) noexcept(_S_noexcept()) + requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>) : _M_valueless(), _M_index(__x._M_index) { if (_M_index == 0) @@ -1946,9 +1949,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } + common_iterator(common_iterator&&) = default; + constexpr common_iterator(common_iterator&& __x) noexcept(_S_noexcept<_It, _Sent>()) + requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>) : _M_valueless(), _M_index(__x._M_index) { if (_M_index == 0) @@ -2017,8 +2023,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return *this; } +#if __cpp_concepts >= 202002L // Constrained special member functions + ~common_iterator() = default; + constexpr ~common_iterator() + requires (!is_trivially_destructible_v<_It> + || !is_trivially_destructible_v<_Sent>) +#else + constexpr + ~common_iterator() +#endif { if (_M_index == 0) _M_it.~_It(); diff --git a/libstdc++-v3/testsuite/24_iterators/common_iterator/100823.cc b/libstdc++-v3/testsuite/24_iterators/common_iterator/100823.cc index 4f2b23de8cc..b42dd087ab2 100644 --- a/libstdc++-v3/testsuite/24_iterators/common_iterator/100823.cc +++ b/libstdc++-v3/testsuite/24_iterators/common_iterator/100823.cc @@ -4,6 +4,21 @@ #include #include +void +test_triviality() +{ + using I = std::common_iterator; + + // Cannot be trivial, because it has to initialize members. + static_assert( ! std::is_trivially_default_constructible_v ); + + static_assert( std::is_trivially_destructible_v ); + static_assert( std::is_trivially_copy_constructible_v ); + static_assert( std::is_trivially_copy_assignable_v ); + static_assert( std::is_trivially_move_constructible_v ); + static_assert( std::is_trivially_move_assignable_v ); +} + void test_valueless_assignment() {