Respect pointer_traits on node deallocation in _ReuseOrAllocNode parenthesis operator.

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
This commit is contained in:
François Dumont 2018-12-23 18:05:23 +00:00
parent 18246c420f
commit 23d5fd6cd6
2 changed files with 22 additions and 3 deletions

View 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.

View 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);
@ -2085,10 +2087,17 @@ namespace __detail
template<typename _NodeAlloc>
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);
}