From patchwork Tue Oct 15 14:20:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 1997504 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=FPU4oz76; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4XSc0C48LJz1xv6 for ; Wed, 16 Oct 2024 01:28:23 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D8B3D3858C48 for ; Tue, 15 Oct 2024 14:28:19 +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 ESMTP id 3F1943858D28 for ; Tue, 15 Oct 2024 14:26:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3F1943858D28 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 3F1943858D28 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=1729002403; cv=none; b=A0X9ifnP4sVsiD9y69Dz+6D7CBaJkP/BAM0Rd05cwcmcil0UZ8WH67hqkKlm/svv5MvTHEjQYatz+yKDwWghX47n3cOWkqGKoqbb7cCuDq70M/2IYf/dY20h+nNlTMhspykxcSZ+7vbUlJO2lHBxpma/saFMrKk9x2wHvtE0qMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1729002403; c=relaxed/simple; bh=TFm7/PoroHw/MVqSSEVUqC8OrN2arPBA4PpH3kINHkU=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=hQGDbvQgQhblfIGCHFeIfIJBSuEZ2neIREfQWhBgUnT9kVlTYtClZQXmKQ9dYNl21d3MpP0lCOna3QdmU5VlkdhspSX1oiTSrnC8eFTimnfeo88vbFJKxWHCPRMo/8Zu1LS4fZwNBIHu3kV6cP0bk16AWW5UNU5cE8xhUSuEx3g= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1729002400; 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: in-reply-to:in-reply-to:references:references; bh=lpLMV/d4A4KIbQ0ktEFPSiWX9D4f+3bc93Aomh4S6uE=; b=FPU4oz76+TCdcfJjn4K4b48izj3YwdsO0flae8m5x5kWINP7qd4lECAAdOiW0X1iMtrTsQ xQFqYY1ESr/IdbPu///e7IUbXeDbeTcHVPslq5iWoU8vq90qrOUzAlNFxoWsUPRK0XZM5m 25TgfMCgl4DmlS6ksmbbLGoHhiwHF2o= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-661-FyNDlEi0OVanAru7VKz9WA-1; Tue, 15 Oct 2024 10:26:36 -0400 X-MC-Unique: FyNDlEi0OVanAru7VKz9WA-1 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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 mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id BAEAE1955D92; Tue, 15 Oct 2024 14:26:35 +0000 (UTC) Received: from localhost (unknown [10.42.28.16]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 176111956056; Tue, 15 Oct 2024 14:26:34 +0000 (UTC) From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [PATCH 2/7] libstdc++: Make __normal_iterator constexpr, always_inline, nodiscard Date: Tue, 15 Oct 2024 15:20:12 +0100 Message-ID: <20241015142630.2148792-2-jwakely@redhat.com> In-Reply-To: <20241015142630.2148792-1-jwakely@redhat.com> References: <20241015142630.2148792-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-10.4 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_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_SBL_CSS, SPF_HELO_NONE, SPF_NONE, TXREP 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~incoming=patchwork.ozlabs.org@gcc.gnu.org Tested x86_64-linux. -- >8 -- The __gnu_cxx::__normal_iterator type we use for std::vector::iterator is not specified by the standard, it's an implementation detail. This means it's not constrained by the rule that forbids strengthening constexpr. We can make it meet the constexpr iterator requirements for older standards, not only when it's required to be for C++20. For the non-const member functions they can't be constexpr in C++11, so use _GLIBCXX14_CONSTEXPR for those. For all constructors, const members and non-member operator overloads, use _GLIBCXX_CONSTEXPR or just constexpr. We can also liberally add [[nodiscard]] and [[gnu::always_inline]] attributes to those functions. Also change some internal helpers for std::move_iterator which can be unconditionally constexpr and marked nodiscard. libstdc++-v3/ChangeLog: * include/bits/stl_iterator.h (__normal_iterator): Make all members and overloaded operators constexpr before C++20. (__niter_base, __niter_wrap, __to_address): Add nodiscard and always_inline attributes. (__make_move_if_noexcept_iterator, __miter_base): Add nodiscard and make unconditionally constexpr. --- libstdc++-v3/include/bits/stl_iterator.h | 125 ++++++++++++++--------- 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 85b98ffff61..3cc10a160bd 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -656,7 +656,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template _GLIBCXX20_CONSTEXPR - auto + inline auto __niter_base(reverse_iterator<_Iterator> __it) -> decltype(__make_reverse_iterator(__niter_base(__it.base()))) { return __make_reverse_iterator(__niter_base(__it.base())); } @@ -668,7 +668,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template _GLIBCXX20_CONSTEXPR - auto + inline auto __miter_base(reverse_iterator<_Iterator> __it) -> decltype(__make_reverse_iterator(__miter_base(__it.base()))) { return __make_reverse_iterator(__miter_base(__it.base())); } @@ -1060,23 +1060,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION using iterator_concept = std::__detail::__iter_concept<_Iterator>; #endif - _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT - : _M_current(_Iterator()) { } + __attribute__((__always_inline__)) + _GLIBCXX_CONSTEXPR + __normal_iterator() _GLIBCXX_NOEXCEPT + : _M_current() { } - explicit _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) + explicit _GLIBCXX_CONSTEXPR __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT : _M_current(__i) { } // Allow iterator to const_iterator conversion #if __cplusplus >= 201103L template> - _GLIBCXX20_CONSTEXPR + [[__gnu__::__always_inline__]] + constexpr __normal_iterator(const __normal_iterator<_Iter, _Container>& __i) noexcept #else // N.B. _Container::pointer is not actually in container requirements, // but is present in std::vector and std::basic_string. template + __attribute__((__always_inline__)) __normal_iterator(const __normal_iterator<_Iter, typename __enable_if< (std::__are_same<_Iter, typename _Container::pointer>::__value), @@ -1085,17 +1090,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : _M_current(__i.base()) { } // Forward iterator requirements - _GLIBCXX20_CONSTEXPR + + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD + _GLIBCXX_CONSTEXPR reference operator*() const _GLIBCXX_NOEXCEPT { return *_M_current; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD + _GLIBCXX_CONSTEXPR pointer operator->() const _GLIBCXX_NOEXCEPT { return _M_current; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) + _GLIBCXX14_CONSTEXPR __normal_iterator& operator++() _GLIBCXX_NOEXCEPT { @@ -1103,13 +1112,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return *this; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) + _GLIBCXX14_CONSTEXPR __normal_iterator operator++(int) _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current++); } // Bidirectional iterator requirements - _GLIBCXX20_CONSTEXPR + + __attribute__((__always_inline__)) + _GLIBCXX14_CONSTEXPR __normal_iterator& operator--() _GLIBCXX_NOEXCEPT { @@ -1117,38 +1129,46 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return *this; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) + _GLIBCXX14_CONSTEXPR __normal_iterator operator--(int) _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current--); } // Random access iterator requirements - _GLIBCXX20_CONSTEXPR + + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD + _GLIBCXX_CONSTEXPR reference operator[](difference_type __n) const _GLIBCXX_NOEXCEPT { return _M_current[__n]; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) + _GLIBCXX14_CONSTEXPR __normal_iterator& operator+=(difference_type __n) _GLIBCXX_NOEXCEPT { _M_current += __n; return *this; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD + _GLIBCXX_CONSTEXPR __normal_iterator operator+(difference_type __n) const _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current + __n); } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) + _GLIBCXX14_CONSTEXPR __normal_iterator& operator-=(difference_type __n) _GLIBCXX_NOEXCEPT { _M_current -= __n; return *this; } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD + _GLIBCXX_CONSTEXPR __normal_iterator operator-(difference_type __n) const _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current - __n); } - _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD + _GLIBCXX_CONSTEXPR const _Iterator& base() const _GLIBCXX_NOEXCEPT { return _M_current; } @@ -1164,7 +1184,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cpp_lib_three_way_comparison template - [[nodiscard]] + [[nodiscard, __gnu__::__always_inline__]] constexpr bool operator==(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1175,7 +1195,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() == __rhs.base(); } template - [[nodiscard]] + [[nodiscard, __gnu__::__always_inline__]] constexpr std::__detail::__synth3way_t<_IteratorR, _IteratorL> operator<=>(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1183,7 +1203,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return std::__detail::__synth3way(__lhs.base(), __rhs.base()); } template - [[nodiscard]] + [[nodiscard, __gnu__::__always_inline__]] constexpr bool operator==(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1194,7 +1214,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() == __rhs.base(); } template - [[nodiscard]] + [[nodiscard, __gnu__::__always_inline__]] constexpr std::__detail::__synth3way_t<_Iterator> operator<=>(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1203,7 +1223,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #else // Forward iterator requirements template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator==(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1211,7 +1231,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() == __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator==(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1219,7 +1239,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() == __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1227,7 +1247,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() != __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1236,7 +1256,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Random access iterator requirements template - _GLIBCXX_NODISCARD + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator<(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1244,7 +1264,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() < __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR inline bool operator<(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1252,7 +1272,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() < __rhs.base(); } template - _GLIBCXX_NODISCARD + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator>(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1260,7 +1280,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() > __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator>(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1268,7 +1288,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() > __rhs.base(); } template - _GLIBCXX_NODISCARD + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1276,7 +1296,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() <= __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator<=(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1284,7 +1304,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() <= __rhs.base(); } template - _GLIBCXX_NODISCARD + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) @@ -1292,7 +1312,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() >= __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline bool operator>=(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1307,8 +1327,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template #if __cplusplus >= 201103L // DR 685. - [[__nodiscard__]] _GLIBCXX20_CONSTEXPR - inline auto + [[__nodiscard__, __gnu__::__always_inline__]] + constexpr auto operator-(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept -> decltype(__lhs.base() - __rhs.base()) @@ -1320,7 +1340,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() - __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline typename __normal_iterator<_Iterator, _Container>::difference_type operator-(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) @@ -1328,7 +1348,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __lhs.base() - __rhs.base(); } template - _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR inline __normal_iterator<_Iterator, _Container> operator+(typename __normal_iterator<_Iterator, _Container>::difference_type __n, const __normal_iterator<_Iterator, _Container>& __i) @@ -1349,24 +1369,26 @@ namespace std _GLIBCXX_VISIBILITY(default) _GLIBCXX_BEGIN_NAMESPACE_VERSION // Unwrap a __normal_iterator to get the underlying iterator - // (usually a pointer) + // (usually a pointer). See uses in std::copy, std::fill, etc. template + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR - _Iterator + inline _Iterator __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it) _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value) { return __it.base(); } - // Fallback implementation of the function in bits/stl_iterator.h used to - // remove the __normal_iterator wrapper. See std::copy, std::fill, etc. + // Fallback implementation used for iterators that can't be unwrapped. template + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR inline _Iterator __niter_base(_Iterator __it) _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value) { return __it; } - // Overload for _Safe_iterator needs to be declared before __niter_base uses. + // Overload for _Safe_iterator needs to be declared before uses of + // std::__niter_base because we call it qualified so isn't found by ADL. #if __cplusplus < 201103L template _Ite @@ -1391,6 +1413,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // __normal_iterator back again (this assumes that __normal_iterator // is only used to wrap random access iterators, like pointers). template + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR inline _From __niter_wrap(_From __from, _To __res) @@ -1398,6 +1421,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // No need to wrap, iterator already has the right type. template + __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR inline _Iterator __niter_wrap(const _Iterator&, _Iterator __res) @@ -1407,6 +1431,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Need to overload __to_address because the pointer_traits primary template // will deduce element_type of __normal_iterator as T* rather than T. template + [[__gnu__::__always_inline__]] _GLIBCXX_NODISCARD constexpr auto __to_address(const __gnu_cxx::__normal_iterator<_Iterator, _Container>& __it) noexcept @@ -1861,7 +1886,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = __conditional_t<__move_if_noexcept_cond ::value_type>::value, _Iterator, move_iterator<_Iterator>>> - inline _GLIBCXX17_CONSTEXPR _ReturnType + [[__nodiscard__]] + constexpr _ReturnType __make_move_if_noexcept_iterator(_Iterator __i) { return _ReturnType(__i); } @@ -1870,13 +1896,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template::value, const _Tp*, move_iterator<_Tp*>>> - inline _GLIBCXX17_CONSTEXPR _ReturnType + [[__nodiscard__]] + constexpr _ReturnType __make_move_if_noexcept_iterator(_Tp* __i) { return _ReturnType(__i); } template - _GLIBCXX20_CONSTEXPR - auto + [[__nodiscard__]] + constexpr auto __niter_base(move_iterator<_Iterator> __it) -> decltype(make_move_iterator(__niter_base(__it.base()))) { return make_move_iterator(__niter_base(__it.base())); } @@ -1889,8 +1916,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION }; template - _GLIBCXX20_CONSTEXPR - auto + [[__nodiscard__]] + constexpr auto __miter_base(move_iterator<_Iterator> __it) -> decltype(__miter_base(__it.base())) { return __miter_base(__it.base()); }