From patchwork Mon Jun 27 10:17:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 55435 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 979043841885 for ; Mon, 27 Jun 2022 10:20:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 979043841885 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1656325253; bh=kQGh6CLnkXQdBcwoXm0ai51IfRmEyYvaMPbN2fA5psY=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=QDgRDJRUcgavdOFgOFjLTRlcUT2XiiytwWdnD7qH4GeYH+OL4qkdsLOZHQr3w5ARu 5BepD2a8eHKAotI4+Bm7sf5j7vB19dT9YpAECo3hdkJqUBCjuHtatavSQuE3hSqHDI sn5cqdvXTYZgGE8OPFsQU6GAbY/O+F9/REUmwpZM= 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 3855A3841892 for ; Mon, 27 Jun 2022 10:17:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3855A3841892 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-331-_pWJcsogOIqhXd3Y0dJrWQ-1; Mon, 27 Jun 2022 06:17:14 -0400 X-MC-Unique: _pWJcsogOIqhXd3Y0dJrWQ-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 468733C16195; Mon, 27 Jun 2022 10:17:14 +0000 (UTC) Received: from localhost (unknown [10.33.36.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0ACA32026D64; Mon, 27 Jun 2022 10:17:13 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Simplify std::variant construction using variable templates Date: Mon, 27 Jun 2022 11:17:13 +0100 Message-Id: <20220627101713.33900-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.0 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, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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: 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. -- >8 -- libstdc++-v3/ChangeLog: * include/std/variant (_Build_FUN::_S_fun): Define fallback case as deleted. (__accepted_index, _Extra_visit_slot_needed): Replace class templates with variable templates. --- libstdc++-v3/include/std/variant | 43 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index c5f25ef6b47..5ff1e3edcdf 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -764,7 +764,7 @@ namespace __variant { // This function means 'using _Build_FUN::_S_fun;' is valid, // but only static functions will be considered in the call below. - void _S_fun(); + void _S_fun() = delete; }; // "... for which Ti x[] = {std::forward(t)}; is well-formed." @@ -795,29 +795,28 @@ namespace __variant // The index selected for FUN(std::forward(t)), or variant_npos if none. template - struct __accepted_index - : integral_constant - { }; + inline constexpr size_t + __accepted_index = variant_npos; template - struct __accepted_index<_Tp, _Variant, void_t<_FUN_type<_Tp, _Variant>>> - : _FUN_type<_Tp, _Variant> - { }; + inline constexpr size_t + __accepted_index<_Tp, _Variant, void_t<_FUN_type<_Tp, _Variant>>> + = _FUN_type<_Tp, _Variant>::value; - template - struct _Extra_visit_slot_needed - { - template struct _Variant_never_valueless; + template> + inline constexpr bool + __extra_visit_slot_needed = false; - template - struct _Variant_never_valueless> - : bool_constant<__variant::__never_valueless<_Types...>()> {}; + template + inline constexpr bool + __extra_visit_slot_needed<__variant_cookie, _Var, variant<_Types...>> + = !__variant::__never_valueless<_Types...>(); - static constexpr bool value = - (is_same_v<_Maybe_variant_cookie, __variant_cookie> - || is_same_v<_Maybe_variant_cookie, __variant_idx_cookie>) - && !_Variant_never_valueless<__remove_cvref_t<_Variant>>::value; - }; + template + inline constexpr bool + __extra_visit_slot_needed<__variant_idx_cookie, _Var, variant<_Types...>> + = !__variant::__never_valueless<_Types...>(); // Used for storing a multi-dimensional vtable. template @@ -874,7 +873,7 @@ namespace __variant using _Variant = typename _Nth_type<__index, _Variants...>::type; static constexpr int __do_cookie = - _Extra_visit_slot_needed<_Ret, _Variant>::value ? 1 : 0; + __extra_visit_slot_needed<_Ret, _Variant> ? 1 : 0; using _Tp = _Ret(*)(_Visitor, _Variants...); @@ -953,7 +952,7 @@ namespace __variant _S_apply_all_alts(_Array_type& __vtable, std::index_sequence<__var_indices...>) { - if constexpr (_Extra_visit_slot_needed<_Result_type, _Next>::value) + if constexpr (__extra_visit_slot_needed<_Result_type, _Next>) (_S_apply_single_alt( __vtable._M_arr[__var_indices + 1], &(__vtable._M_arr[0])), ...); @@ -1372,7 +1371,7 @@ namespace __variant template static constexpr size_t __accepted_index - = __detail::__variant::__accepted_index<_Tp, variant>::value; + = __detail::__variant::__accepted_index<_Tp, variant>; template> using __to_type = typename _Nth_type<_Np, _Types...>::type;