Adjust tr1::_Hashtable to work with std::allocator in C++20
authorJonathan Wakely <jwakely@redhat.com>
Fri, 4 Oct 2019 12:17:01 +0000 (13:17 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 4 Oct 2019 12:17:01 +0000 (13:17 +0100)
In C++20 std::allocator will no longer define construct and destroy
member functions, so using them needs to go via allocator_traits.

* include/tr1/hashtable.h (tr1::_Hashtable::_M_allocate_node): Use
__gnu_cxx::__alloc_traits for allocator construct function.
(tr1::_Hashtable::_M_deallocate_node): Likewise for destroy function.

From-SVN: r276575

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/hashtable.h

index 0076d95..6a3b614 100644 (file)
@@ -1,5 +1,9 @@
 2019-10-04  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/tr1/hashtable.h (tr1::_Hashtable::_M_allocate_node): Use
+       __gnu_cxx::__alloc_traits for allocator construct function.
+       (tr1::_Hashtable::_M_deallocate_node): Likewise for destroy function.
+
        * include/precompiled/stdc++.h: Include <span> for C++20.
        * testsuite/17_intro/names.cc: Do not define 'e' for C++20.
 
index c1b5c9e..85fec6a 100644 (file)
@@ -429,7 +429,9 @@ namespace tr1
       _Node* __n = _M_node_allocator.allocate(1);
       __try
        {
-         _M_get_Value_allocator().construct(&__n->_M_v, __v);
+         _Value_allocator_type __a = _M_get_Value_allocator();
+         typedef __gnu_cxx::__alloc_traits<_Value_allocator_type> _Traits;
+         _Traits::construct(__a, &__n->_M_v, __v);
          __n->_M_next = 0;
          return __n;
        }
@@ -449,7 +451,9 @@ namespace tr1
               _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
     _M_deallocate_node(_Node* __n)
     {
-      _M_get_Value_allocator().destroy(&__n->_M_v);
+      _Value_allocator_type __a = _M_get_Value_allocator();
+      typedef __gnu_cxx::__alloc_traits<_Value_allocator_type> _Traits;
+      _Traits::destroy(__a, &__n->_M_v);
       _M_node_allocator.deallocate(__n, 1);
     }