]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/86127 avoid unnecessary allocator conversions
authorJonathan Wakely <jwakely@redhat.com>
Wed, 4 Jul 2018 13:59:42 +0000 (14:59 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 4 Jul 2018 13:59:42 +0000 (14:59 +0100)
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.

From-SVN: r262411

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/forward_list.h
libstdc++-v3/include/bits/forward_list.tcc

index e174d8d24d16688543d7aee9fb1da8d1fa274a5c..772c62fce40605f75b85ee452e535cd10781ccd5 100644 (file)
@@ -1,5 +1,19 @@
 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>
 
index c37bf01345a30739b0d83e43eda9940197657222..338e7b3dc6f92672a20c8bcf17af350dfdafb41d 100644 (file)
@@ -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:
index b823b09e1af379290ee5d47d3fb1ccc3d4f7e640..c852aa1b7162973b33a7934ed4c270e06f22b2a8 100644 (file)
@@ -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);
         }