[gcc r16-278] libstdc++: Use constexpr-if to simplify std::vector relocation
Jonathan Wakely
redi@gcc.gnu.org
Tue Apr 29 10:15:17 GMT 2025
https://gcc.gnu.org/g:42046a0f5d29013b1c016ee92b28f819686ddcc0
commit r16-278-g42046a0f5d29013b1c016ee92b28f819686ddcc0
Author: Jonathan Wakely <jwakely@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 <tkaminsk@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
More information about the Libstdc++-cvs
mailing list