From patchwork Wed Jan 5 15:30:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 1575746 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=wh8AZsyO; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JTYRL1bGMz9sPC for ; Thu, 6 Jan 2022 02:33:34 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B7B883858433 for ; Wed, 5 Jan 2022 15:33:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B7B883858433 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1641396808; bh=40xCj6P14DaMqKJtNSGLR3RR463MqFqIw6PsZZwk0OA=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=wh8AZsyOV7DO6LSE3tD+I46tIRh15PMOz2GR79Rgu8YEW+liLPyjYdPqnizUd6QZS 93sEJHMmZwlb014ZlUlbRcW1gLWoPSeEg9Xphq74SdvnALGSlekAiNkrJCadBJOM4I aWj7bPUNAcS9naP833IMXifcQSLYKSvfzTIykxBE= 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 6058A3858008 for ; Wed, 5 Jan 2022 15:30:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6058A3858008 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-437-yp48VTj5OoWYb1HJIM0NFw-1; Wed, 05 Jan 2022 10:30:45 -0500 X-MC-Unique: yp48VTj5OoWYb1HJIM0NFw-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B4686874981; Wed, 5 Jan 2022 15:30:44 +0000 (UTC) Received: from localhost (unknown [10.33.36.252]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6162D4EC66; Wed, 5 Jan 2022 15:30:44 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Improvements to standard error category objects (part deux) Date: Wed, 5 Jan 2022 15:30:43 +0000 Message-Id: <20220105153043.1775917-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.8 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+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Tested powerpc64le-linux, pushed to trunk. In r12-3860 the error categories in were made final and immortal, but I missed the categories for and . This makes the same changes to those. libstdc++-v3/ChangeLog: * src/c++11/cxx11-ios_failure.cc (io_error_category): Define class and virtual functions as 'final'. (io_category_instance): Use constinit union to make the object immortal. * src/c++11/future.cc (future_error_category): Define class and virtual functions as 'final'. (future_category_instance): Use constinit union. --- libstdc++-v3/src/c++11/cxx11-ios_failure.cc | 25 ++++++++++++-------- libstdc++-v3/src/c++11/future.cc | 26 +++++++++++++-------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/libstdc++-v3/src/c++11/cxx11-ios_failure.cc b/libstdc++-v3/src/c++11/cxx11-ios_failure.cc index 5a151b6ec5c..ba4b1413bf9 100644 --- a/libstdc++-v3/src/c++11/cxx11-ios_failure.cc +++ b/libstdc++-v3/src/c++11/cxx11-ios_failure.cc @@ -44,14 +44,15 @@ namespace { - struct io_error_category : std::error_category + struct io_error_category final : std::error_category { - virtual const char* - name() const noexcept + const char* + name() const noexcept final { return "iostream"; } _GLIBCXX_DEFAULT_ABI_TAG - virtual std::string message(int __ec) const + std::string + message(int __ec) const final { std::string __msg; switch (std::io_errc(__ec)) @@ -67,13 +68,17 @@ namespace } }; - const io_error_category& - __io_category_instance() noexcept + struct constant_init { - static const io_error_category __ec{}; - return __ec; - } + union { + unsigned char unused; + io_error_category cat; + }; + constexpr constant_init() : cat() { } + ~constant_init() { /* do nothing, union member is not destroyed */ } + }; + __constinit constant_init io_category_instance{}; } // namespace namespace std _GLIBCXX_VISIBILITY(default) @@ -82,7 +87,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const error_category& iostream_category() noexcept - { return __io_category_instance(); } + { return io_category_instance.cat; } ios_base::failure::failure(const string& __str) : system_error(io_errc::stream, __str) { } diff --git a/libstdc++-v3/src/c++11/future.cc b/libstdc++-v3/src/c++11/future.cc index c5423931eb3..488ff17a1e6 100644 --- a/libstdc++-v3/src/c++11/future.cc +++ b/libstdc++-v3/src/c++11/future.cc @@ -27,14 +27,15 @@ namespace { - struct future_error_category : public std::error_category + struct future_error_category final : public std::error_category { - virtual const char* - name() const noexcept + const char* + name() const noexcept final { return "future"; } _GLIBCXX_DEFAULT_ABI_TAG - virtual std::string message(int __ec) const + std::string + message(int __ec) const final { std::string __msg; switch (std::future_errc(__ec)) @@ -59,12 +60,17 @@ namespace } }; - const future_error_category& - __future_category_instance() noexcept + struct constant_init { - static const future_error_category __fec{}; - return __fec; - } + union { + unsigned char unused; + future_error_category cat; + }; + constexpr constant_init() : cat() { } + ~constant_init() { /* do nothing, union member is not destroyed */ } + }; + + __constinit constant_init future_category_instance{}; } namespace std _GLIBCXX_VISIBILITY(default) @@ -76,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { _GLIBCXX_THROW_OR_ABORT(future_error(make_error_code(future_errc(__i)))); } const error_category& future_category() noexcept - { return __future_category_instance(); } + { return future_category_instance.cat; } future_error::~future_error() noexcept { }