https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57272
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |potswa at mac dot com --- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- In PR55409#c15 David Krauss pointed out that ... > the simplest case of a fancy pointer is a raw pointer to a class derived from > value_type I hadn't considered that case, and should ensure it works. Currently I am working on something like this, which should handle it correctly: template<typename _Traits, typename _Tp = typename _Traits::value_type, typename _Ptr = typename _Traits::pointer> struct _List_node_traits; // For C++03 allocators, and C++11 allocators without non-fancy pointers. template<typename _Traits, typename _Tp> struct _List_node_traits<_Traits, _Tp, _Tp*> { typedef _List_iterator<_Tp> iterator; typedef _List_const_iterator<_Tp> const_iterator; typedef _List_node<_Tp> _Node; typedef __detail::_List_node_base _Node_base; typedef _Node_base* _Node_base_ptr; typedef const _Node_base* _Node_base_const_ptr; typedef typename _Traits::template rebind<_Node>::other _Alloc_type; typedef __gnu_cxx::__alloc_traits<_Alloc_type> _Alloc_traits; ... }; #if __cplusplus >= 201103L // For C++11 allocators with fancy pointers. template<typename _Traits, typename _Tp, typename _Ptr> struct _List_node_traits { typedef typename _Traits::void_pointer void_pointer; typedef _List_ptr_iterator<_Ptr> iterator; typedef _List_ptr_const_iterator<_Ptr> const_iterator; typedef _List_ptr_node<_Ptr> _Node; typedef _List_ptr_node_base<void_pointer> _Node_base; typedef typename _Node_base::_SelfPtr _Node_base_ptr; typedef typename _Node_base::_ConstSelfPtr _Node_base_const_ptr; typedef typename _Traits::template rebind<_Node>::other _Alloc_type; typedef __gnu_cxx::__alloc_traits<_Alloc_type> _Alloc_traits; ... }; #endif