Respect pointer_traits on node deallocation in _ReuseOrAllocNode parenthesis operator.
authorFrançois Dumont <fdumont@gcc.gnu.org>
Sun, 23 Dec 2018 18:05:23 +0000 (18:05 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Sun, 23 Dec 2018 18:05:23 +0000 (18:05 +0000)
2018-12-23  François Dumont  <fdumont@gcc.gnu.org>

Respect pointer_traits on node deallocation in _ReuseOrAllocNode
parenthesis operator.

* include/bits/hashtable_policy.h
(_Hashtable_alloc<>::_M_deallocate_node_ptr(__node_type*)): New.
(_Hashtable_alloc<>::_M_deallocate_node(__node_type*)): Use latter.
(_ReuseOrAllocNode<>::operator<_Arg>()(_Arg&&)): Likewise.

From-SVN: r267380

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/hashtable_policy.h

index a0ec66b..dd67656 100644 (file)
@@ -1,3 +1,13 @@
+2018-12-23  François Dumont  <fdumont@gcc.gnu.org>
+
+       Respect pointer_traits on node deallocation in _ReuseOrAllocNode
+       parenthesis operator.
+
+       * include/bits/hashtable_policy.h
+       (_Hashtable_alloc<>::_M_deallocate_node_ptr(__node_type*)): New.
+       (_Hashtable_alloc<>::_M_deallocate_node(__node_type*)): Use latter.
+       (_ReuseOrAllocNode<>::operator<_Arg>()(_Arg&&)): Likewise.
+
 2018-12-22  Iain Sandoe  <iain@sandoe.co.uk>
 
        * /config/os/bsd/darwin/ppc-extra.ver: Append long double symbols.
index 66fbfbe..a02396b 100644 (file)
@@ -135,8 +135,7 @@ namespace __detail
                }
              __catch(...)
                {
-                 __node->~__node_type();
-                 __node_alloc_traits::deallocate(__a, __node, 1);
+                 _M_h._M_deallocate_node_ptr(__node);
                  __throw_exception_again;
                }
              return __node;
@@ -2047,6 +2046,9 @@ namespace __detail
       void
       _M_deallocate_node(__node_type* __n);
 
+      void
+      _M_deallocate_node_ptr(__node_type* __n);
+
       // Deallocate the linked list of nodes pointed to by __n
       void
       _M_deallocate_nodes(__node_type* __n);
@@ -2086,9 +2088,16 @@ namespace __detail
     void
     _Hashtable_alloc<_NodeAlloc>::_M_deallocate_node(__node_type* __n)
     {
+      __node_alloc_traits::destroy(_M_node_allocator(), __n->_M_valptr());
+      _M_deallocate_node_ptr(__n);
+    }
+
+  template<typename _NodeAlloc>
+    void
+    _Hashtable_alloc<_NodeAlloc>::_M_deallocate_node_ptr(__node_type* __n)
+    {
       typedef typename __node_alloc_traits::pointer _Ptr;
       auto __ptr = std::pointer_traits<_Ptr>::pointer_to(*__n);
-      __node_alloc_traits::destroy(_M_node_allocator(), __n->_M_valptr());
       __n->~__node_type();
       __node_alloc_traits::deallocate(_M_node_allocator(), __ptr, 1);
     }