Hi Here is my proposal to add support for fancy allocator pointer. The only place where we still have C pointers is at the iterator::pointer level but it's consistent with std::list implementation and also logical considering that we do not get value_type pointers from the allocator. I also wondered if it was ok to use nullptr in different places or if I should rather do __node_ptr{}. But recent modifications are using nullptr so I think it's fine.     libstdc++: Use allocator::pointer in hashtable implementation     In _Hashtable implementation store the allocator::pointer returned by the allocate     call as-is and return it on the deallocate when necessary. This is true for both     the allocated nodes and the bucket array.     libstdc++-v3/ChangeLog:             * include/bits/hashtable_policy.h: Include .             (__alloc_val_ptr<>): New template alias.             (_Hash_pnode_base<>): New.             (_Hash_node<>::__node_ptr): New.             (_Hash_node<>::__node_type): New.             (_Hash_pnode): New.             (__get_node_type<>): New, template alias to _Hash_node<> if allocator pointer             type is a native pointer, _Hash_pnode<> otherwise.             (_Hashtable_iterator_base): New.             (_Node_iterator_base<>): Inherits from latter.             (_Hashtable_iterator):             New.             (_Hashtable_const_iterator):             New.             (_Insert_base<>::__alloc_ptr): New.             (_Insert_base<>::__hashtable_alloc): Remove.             (_Insert_base<>::__node_type): New.             (_Insert_base<>::__node_ptr): New.             (_Insert_base<>::iterator): Define conditionally to _Node_iterator<>             or _Hashtable_iterator<> depending on __alloc_ptr being a raw pointer.             (_Insert_base<>::const_iterator): Define conditionally to             _Node_const_iterator<> or _Hashtable_const_iterator<> depending on             __alloc_ptr being a raw pointer.             (_Hashtable_local_iter_base<>): New.             (_Hashtable_local_iterator<>): New.             (_Hashtable_const_local_iterator<>): New.             (__local_iterator<>): New template alias.             (__const_local_iterator<>): New template alias.             (_Hashtable_alloc<>::__get_node_base): New struct.             (_Hashtable_alloc<>::__value_alloc_traits): Remove.             (_Hashtable_alloc<>::__node_ptr): Define as __node_alloc_traits::pointer.             (_Hashtable_alloc<>::__node_base): Define as __get_node_base<>::pointer.             (_Hashtable_alloc<>::__node_base_ptr): Define as             __ptr_rebind<__node_ptr, __node_base>.             * include/bits/hashtable.h (_Hashtable<>): Adapt.             * testsuite/23_containers/unordered_map/allocator/ext_ptr.cc: New test.             * testsuite/23_containers/unordered_multimap/allocator/ext_ptr.cc:             New test.             * testsuite/23_containers/unordered_multiset/allocator/ext_ptr.cc:             New test.             * testsuite/23_containers/unordered_set/allocator/ext_ptr.cc: Adapt. Tested under Linux x64, ok to commit ? François