aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-07-04 13:59:42 +0000
committerJonathan Wakely <jwakely@redhat.com>2018-07-04 13:59:42 +0000
commite44a6b6bcf2b8afd6d1d335cf48bb3116b57985e (patch)
treeb5701eec95755dff60e1997f62ff5ac87e833a1e
parent0e919deaf050b3283c840f0991022c30d87fb614 (diff)
PR libstdc++/86127 avoid unnecessary allocator conversions
There is no need to use an allocator of the correct value_type when calling allocator_traits::construct and allocator_traits::destroy. The existing node allocator can be used, instead of constructing a new allocator object every time. There's also no benefit to using __gnu_cxx::__alloc_traits instead of std::allocator_traits to get the pointer and const_pointer types. std::forward_list is only available for C++11 and later, when std::allocator_traits is available too. Backport from mainline 2018-06-13 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/86127 * include/bits/forward_list.h (_Fwd_list_base::_Tp_alloc_type): Remove unused typedef. (_Fwd_list_base::_M_create_node, _Fwd_list_base::_M_erase_after): Use node allocator to create and destroy elements. (forward_list::_Tp_alloc_type): Remove unused typedef. (forward_list::_Alloc_traits): Use allocator_traits instead of __gnu_cxx::__alloc_traits. * include/bits/forward_list.tcc (_Fwd_list_base::_M_erase_after): Use node allocator to create and destroy elements. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@262411 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog14
-rw-r--r--libstdc++-v3/include/bits/forward_list.h11
-rw-r--r--libstdc++-v3/include/bits/forward_list.tcc8
3 files changed, 22 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index e174d8d24d1..772c62fce40 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,6 +1,20 @@
2018-07-04 Jonathan Wakely <jwakely@redhat.com>
Backport from mainline
+ 2018-06-13 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/86127
+ * include/bits/forward_list.h (_Fwd_list_base::_Tp_alloc_type): Remove
+ unused typedef.
+ (_Fwd_list_base::_M_create_node, _Fwd_list_base::_M_erase_after):
+ Use node allocator to create and destroy elements.
+ (forward_list::_Tp_alloc_type): Remove unused typedef.
+ (forward_list::_Alloc_traits): Use allocator_traits instead of
+ __gnu_cxx::__alloc_traits.
+ * include/bits/forward_list.tcc (_Fwd_list_base::_M_erase_after):
+ Use node allocator to create and destroy elements.
+
+ Backport from mainline
2018-05-29 Jonathan Wakely <jwakely@redhat.com>
* include/std/variant (__erased_dtor): Qualify call to __get.
diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h
index c37bf01345a..338e7b3dc6f 100644
--- a/libstdc++-v3/include/bits/forward_list.h
+++ b/libstdc++-v3/include/bits/forward_list.h
@@ -274,7 +274,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
struct _Fwd_list_base
{
protected:
- typedef __alloc_rebind<_Alloc, _Tp> _Tp_alloc_type;
typedef __alloc_rebind<_Alloc, _Fwd_list_node<_Tp>> _Node_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Node_alloc_type> _Node_alloc_traits;
@@ -345,11 +344,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Node* __node = this->_M_get_node();
__try
{
- _Tp_alloc_type __a(_M_get_Node_allocator());
- typedef allocator_traits<_Tp_alloc_type> _Alloc_traits;
::new ((void*)__node) _Node;
- _Alloc_traits::construct(__a, __node->_M_valptr(),
- std::forward<_Args>(__args)...);
+ _Node_alloc_traits::construct(_M_get_Node_allocator(),
+ __node->_M_valptr(),
+ std::forward<_Args>(__args)...);
}
__catch(...)
{
@@ -412,10 +410,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef _Fwd_list_base<_Tp, _Alloc> _Base;
typedef _Fwd_list_node<_Tp> _Node;
typedef _Fwd_list_node_base _Node_base;
- typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef typename _Base::_Node_alloc_type _Node_alloc_type;
typedef typename _Base::_Node_alloc_traits _Node_alloc_traits;
- typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
+ typedef allocator_traits<__alloc_rebind<_Alloc, _Tp>> _Alloc_traits;
public:
// types:
diff --git a/libstdc++-v3/include/bits/forward_list.tcc b/libstdc++-v3/include/bits/forward_list.tcc
index b823b09e1af..c852aa1b716 100644
--- a/libstdc++-v3/include/bits/forward_list.tcc
+++ b/libstdc++-v3/include/bits/forward_list.tcc
@@ -69,8 +69,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
{
_Node* __curr = static_cast<_Node*>(__pos->_M_next);
__pos->_M_next = __curr->_M_next;
- _Tp_alloc_type __a(_M_get_Node_allocator());
- allocator_traits<_Tp_alloc_type>::destroy(__a, __curr->_M_valptr());
+ _Node_alloc_traits::destroy(_M_get_Node_allocator(),
+ __curr->_M_valptr());
__curr->~_Node();
_M_put_node(__curr);
return __pos->_M_next;
@@ -87,8 +87,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
{
_Node* __temp = __curr;
__curr = static_cast<_Node*>(__curr->_M_next);
- _Tp_alloc_type __a(_M_get_Node_allocator());
- allocator_traits<_Tp_alloc_type>::destroy(__a, __temp->_M_valptr());
+ _Node_alloc_traits::destroy(_M_get_Node_allocator(),
+ __temp->_M_valptr());
__temp->~_Node();
_M_put_node(__temp);
}