https://gcc.gnu.org/g:42046a0f5d29013b1c016ee92b28f819686ddcc0
commit r16-278-g42046a0f5d29013b1c016ee92b28f819686ddcc0 Author: Jonathan Wakely <jwak...@redhat.com> Date: Tue Dec 10 20:40:42 2024 +0000 libstdc++: Use constexpr-if to simplify std::vector relocation Simplify std::vector's use of std::__relocate_a by using 'if constexpr' even in C++11 and C++14, with diagnostic pragmas to disable warnings. This allows us to call std::__relocate_a directly, instead of via _S_relocate and tag distpatching. Preserve _S_relocate so that explicit instantiations still get it, but make it a no-op when _S_use_relocate() is false, so that we don't instantiate __relocate_a if it isn't needed. libstdc++-v3/ChangeLog: * include/bits/stl_vector.h (_S_do_relocate): Remove. (_S_relocate): Remove tag dispatching path. * include/bits/vector.tcc (reserve, _M_realloc_insert) (_M_realloc_append, _M_default_append): Add diagnostic pragmas and use 'if constexpr' in C++11 and C++14. Call std::__relocate_a directly instead of _S_relocate. Reviewed-by: Tomasz KamiĆski <tkami...@redhat.com> Diff: --- libstdc++-v3/include/bits/stl_vector.h | 26 ++++++--------------- libstdc++-v3/include/bits/vector.tcc | 41 ++++++++++++++++++++++------------ 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index aff9d5d9ca5b..57680b7bbcf3 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -518,29 +518,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{}); } - static pointer - _S_do_relocate(pointer __first, pointer __last, pointer __result, - _Tp_alloc_type& __alloc, true_type) noexcept - { - return std::__relocate_a(__first, __last, __result, __alloc); - } - - static pointer - _S_do_relocate(pointer, pointer, pointer __result, - _Tp_alloc_type&, false_type) noexcept - { return __result; } - static _GLIBCXX20_CONSTEXPR pointer _S_relocate(pointer __first, pointer __last, pointer __result, _Tp_alloc_type& __alloc) noexcept { -#if __cpp_if_constexpr - // All callers have already checked _S_use_relocate() so just do it. - return std::__relocate_a(__first, __last, __result, __alloc); -#else - using __do_it = __bool_constant<_S_use_relocate()>; - return _S_do_relocate(__first, __last, __result, __alloc, __do_it{}); -#endif +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr + if constexpr (_S_use_relocate()) + return std::__relocate_a(__first, __last, __result, __alloc); + else + return __result; +#pragma GCC diagnostic pop } #endif // C++11 diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index b21e1d3b7a2c..e18f01ab0ae8 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -61,6 +61,9 @@ namespace std _GLIBCXX_VISIBILITY(default) _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_CONTAINER +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr + template<typename _Tp, typename _Alloc> _GLIBCXX20_CONSTEXPR void @@ -74,11 +77,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER const size_type __old_size = size(); pointer __tmp; #if __cplusplus >= 201103L - if _GLIBCXX17_CONSTEXPR (_S_use_relocate()) + if constexpr (_S_use_relocate()) { __tmp = this->_M_allocate(__n); - _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish, - __tmp, _M_get_Tp_allocator()); + std::__relocate_a(this->_M_impl._M_start, this->_M_impl._M_finish, + __tmp, _M_get_Tp_allocator()); } else #endif @@ -98,6 +101,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; } } +#pragma GCC diagnostic pop #if __cplusplus >= 201103L template<typename _Tp, typename _Alloc> @@ -444,6 +448,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr #if __cplusplus >= 201103L template<typename _Tp, typename _Alloc> template<typename... _Args> @@ -488,14 +494,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif #if __cplusplus >= 201103L - if _GLIBCXX17_CONSTEXPR (_S_use_relocate()) + if constexpr (_S_use_relocate()) { // Relocation cannot throw. - __new_finish = _S_relocate(__old_start, __position.base(), - __new_start, _M_get_Tp_allocator()); + __new_finish = std::__relocate_a(__old_start, __position.base(), + __new_start, + _M_get_Tp_allocator()); ++__new_finish; - __new_finish = _S_relocate(__position.base(), __old_finish, - __new_finish, _M_get_Tp_allocator()); + __new_finish = std::__relocate_a(__position.base(), __old_finish, + __new_finish, + _M_get_Tp_allocator()); } else #endif @@ -593,11 +601,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif #if __cplusplus >= 201103L - if _GLIBCXX17_CONSTEXPR (_S_use_relocate()) + if constexpr (_S_use_relocate()) { // Relocation cannot throw. - __new_finish = _S_relocate(__old_start, __old_finish, - __new_start, _M_get_Tp_allocator()); + __new_finish = std::__relocate_a(__old_start, __old_finish, + __new_start, + _M_get_Tp_allocator()); ++__new_finish; } else @@ -645,6 +654,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER this->_M_impl._M_finish = __new_finish; this->_M_impl._M_end_of_storage = __new_start + __len; } +#pragma GCC diagnostic pop template<typename _Tp, typename _Alloc> _GLIBCXX20_CONSTEXPR @@ -751,6 +761,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } #if __cplusplus >= 201103L +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr template<typename _Tp, typename _Alloc> _GLIBCXX20_CONSTEXPR void @@ -794,10 +806,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER std::__uninitialized_default_n_a(__new_start + __size, __n, _M_get_Tp_allocator()); - if _GLIBCXX17_CONSTEXPR (_S_use_relocate()) + if constexpr (_S_use_relocate()) { - _S_relocate(__old_start, __old_finish, - __new_start, _M_get_Tp_allocator()); + std::__relocate_a(__old_start, __old_finish, + __new_start, _M_get_Tp_allocator()); } else { @@ -842,6 +854,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } } } +#pragma GCC diagnostic pop template<typename _Tp, typename _Alloc> _GLIBCXX20_CONSTEXPR