https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69862

            Bug ID: 69862
           Summary: STL containers not using allocator's definition of
                    pointers
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: philippeb8 at gmail dot com
  Target Milestone: ---

This is about STL containers and allocators.  When I look at the code of GCC's
std::list:

  template<typename _Tp, typename _Alloc>
    void
    _List_base<_Tp, _Alloc>::
    _M_clear()
    {
      typedef _List_node<_Tp>  _Node;
      _Node* __cur = static_cast<_Node*>(_M_impl._M_node._M_next);
      while (__cur != &_M_impl._M_node)
    {
      _Node* __tmp = __cur;
      __cur = static_cast<_Node*>(__cur->_M_next);
#if __cplusplus >= 201103L
      _M_get_Node_allocator().destroy(__tmp);
#else
      _M_get_Tp_allocator().destroy(std::__addressof(__tmp->_M_data));
#endif
      _M_put_node(__tmp);
    }
    }


I think it should make use of the allocator's specific pointer as such:

  template<typename _Tp, typename _Alloc>
    void
    _List_base<_Tp, _Alloc>::
    _M_clear()
    {
      typedef _List_node<_Tp>  _Node;
      typedef typename _Alloc::rebind<_Node>::other::pointer _NodePtr;

      _NodePtr __cur = static_cast<_NodePtr>(_M_impl._M_node._M_next);
      while (__cur != &_M_impl._M_node)
    {
      _NodePtr __tmp = __cur;
      __cur = static_cast<_NodePtr>(__cur->_M_next);
#if __cplusplus >= 201103L
      _M_get_Node_allocator().destroy(__tmp);
#else
      _M_get_Tp_allocator().destroy(std::__addressof(__tmp->_M_data));
#endif
      _M_put_node(__tmp);
    }
    }

Reply via email to