mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/57263 (std::set with user-defined allocator - compile error)
PR libstdc++/57263 * include/bits/forward_list.h (_Fwd_list_base): Convert to/from allocator's pointer type. * include/bits/hashtable.h (_Hashtable): Likewise. * testsuite/util/testsuite_allocator.h (CustomPointerAlloc): Add. * testsuite/23_containers/forward_list/allocator/ext_ptr.cc: New. * testsuite/23_containers/unordered_set/allocator/ext_ptr.cc: New. * testsuite/23_containers/vector/allocator/ext_ptr.cc: New. From-SVN: r200136
This commit is contained in:
parent
8d2cddc125
commit
f038f5824b
|
|
@ -1,3 +1,14 @@
|
||||||
|
2013-06-16 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
|
PR libstdc++/57263
|
||||||
|
* include/bits/forward_list.h (_Fwd_list_base): Convert to/from
|
||||||
|
allocator's pointer type.
|
||||||
|
* include/bits/hashtable.h (_Hashtable): Likewise.
|
||||||
|
* testsuite/util/testsuite_allocator.h (CustomPointerAlloc): Add.
|
||||||
|
* testsuite/23_containers/forward_list/allocator/ext_ptr.cc: New.
|
||||||
|
* testsuite/23_containers/unordered_set/allocator/ext_ptr.cc: New.
|
||||||
|
* testsuite/23_containers/vector/allocator/ext_ptr.cc: New.
|
||||||
|
|
||||||
2013-06-16 Jonathan Wakely <jwakely.gcc@gmail.com>
|
2013-06-16 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
* include/std/shared_mutex: Implement N3659.
|
* include/std/shared_mutex: Implement N3659.
|
||||||
|
|
|
||||||
|
|
@ -338,7 +338,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
|
|
||||||
_Node*
|
_Node*
|
||||||
_M_get_node()
|
_M_get_node()
|
||||||
{ return _Node_alloc_traits::allocate(_M_get_Node_allocator(), 1); }
|
{
|
||||||
|
auto __ptr = _Node_alloc_traits::allocate(_M_get_Node_allocator(), 1);
|
||||||
|
return std::__addressof(*__ptr);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename... _Args>
|
template<typename... _Args>
|
||||||
_Node*
|
_Node*
|
||||||
|
|
@ -367,7 +370,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
|
|
||||||
void
|
void
|
||||||
_M_put_node(_Node* __p)
|
_M_put_node(_Node* __p)
|
||||||
{ _Node_alloc_traits::deallocate(_M_get_Node_allocator(), __p, 1); }
|
{
|
||||||
|
typedef typename _Node_alloc_traits::pointer _Ptr;
|
||||||
|
auto __ptr = std::pointer_traits<_Ptr>::pointer_to(*__p);
|
||||||
|
_Node_alloc_traits::deallocate(_M_get_Node_allocator(), __ptr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
_Fwd_list_node_base*
|
_Fwd_list_node_base*
|
||||||
_M_erase_after(_Fwd_list_node_base* __pos);
|
_M_erase_after(_Fwd_list_node_base* __pos);
|
||||||
|
|
|
||||||
|
|
@ -775,7 +775,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
|
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
|
||||||
_M_allocate_node(_Args&&... __args)
|
_M_allocate_node(_Args&&... __args)
|
||||||
{
|
{
|
||||||
__node_type* __n = _Node_alloc_traits::allocate(_M_node_allocator(), 1);
|
auto __nptr = _Node_alloc_traits::allocate(_M_node_allocator(), 1);
|
||||||
|
__node_type* __n = std::__addressof(*__nptr);
|
||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
_Value_alloc_type __a(_M_node_allocator());
|
_Value_alloc_type __a(_M_node_allocator());
|
||||||
|
|
@ -786,7 +787,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
}
|
}
|
||||||
__catch(...)
|
__catch(...)
|
||||||
{
|
{
|
||||||
_Node_alloc_traits::deallocate(_M_node_allocator(), __n, 1);
|
_Node_alloc_traits::deallocate(_M_node_allocator(), __nptr, 1);
|
||||||
__throw_exception_again;
|
__throw_exception_again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -800,10 +801,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
|
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
|
||||||
_M_deallocate_node(__node_type* __n)
|
_M_deallocate_node(__node_type* __n)
|
||||||
{
|
{
|
||||||
|
typedef typename _Node_alloc_traits::pointer _Ptr;
|
||||||
|
auto __ptr = std::pointer_traits<_Ptr>::pointer_to(*__n);
|
||||||
_Value_alloc_type __a(_M_node_allocator());
|
_Value_alloc_type __a(_M_node_allocator());
|
||||||
_Value_alloc_traits::destroy(__a, __n->_M_valptr());
|
_Value_alloc_traits::destroy(__a, __n->_M_valptr());
|
||||||
__n->~__node_type();
|
__n->~__node_type();
|
||||||
_Node_alloc_traits::deallocate(_M_node_allocator(), __n, 1);
|
_Node_alloc_traits::deallocate(_M_node_allocator(), __ptr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename _Key, typename _Value,
|
template<typename _Key, typename _Value,
|
||||||
|
|
@ -835,7 +838,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
{
|
{
|
||||||
_Bucket_alloc_type __alloc(_M_node_allocator());
|
_Bucket_alloc_type __alloc(_M_node_allocator());
|
||||||
|
|
||||||
__bucket_type* __p = _Bucket_alloc_traits::allocate(__alloc, __n);
|
auto __ptr = _Bucket_alloc_traits::allocate(__alloc, __n);
|
||||||
|
__bucket_type* __p = std::__addressof(*__ptr);
|
||||||
__builtin_memset(__p, 0, __n * sizeof(__bucket_type));
|
__builtin_memset(__p, 0, __n * sizeof(__bucket_type));
|
||||||
return __p;
|
return __p;
|
||||||
}
|
}
|
||||||
|
|
@ -849,8 +853,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
|
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
|
||||||
_M_deallocate_buckets(__bucket_type* __bkts, size_type __n)
|
_M_deallocate_buckets(__bucket_type* __bkts, size_type __n)
|
||||||
{
|
{
|
||||||
|
typedef typename _Bucket_alloc_traits::pointer _Ptr;
|
||||||
|
auto __ptr = std::pointer_traits<_Ptr>::pointer_to(*__bkts);
|
||||||
_Bucket_alloc_type __alloc(_M_node_allocator());
|
_Bucket_alloc_type __alloc(_M_node_allocator());
|
||||||
_Bucket_alloc_traits::deallocate(__alloc, __bkts, __n);
|
_Bucket_alloc_traits::deallocate(__alloc, __ptr, __n);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename _Key, typename _Value,
|
template<typename _Key, typename _Value,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// { dg-options "-std=gnu++11" }
|
||||||
|
|
||||||
|
#include <forward_list>
|
||||||
|
#include <memory>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
#include <testsuite_allocator.h>
|
||||||
|
|
||||||
|
struct T { int i; };
|
||||||
|
bool operator==(const T& l, const T& r) { return l.i == r.i; }
|
||||||
|
bool operator<(const T& l, const T& r) { return l.i < r.i; }
|
||||||
|
|
||||||
|
using __gnu_test::CustomPointerAlloc;
|
||||||
|
|
||||||
|
template class std::forward_list<T, CustomPointerAlloc<T>>;
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
typedef CustomPointerAlloc<T> alloc_type;
|
||||||
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
|
test_type v;
|
||||||
|
v.push_front(T());
|
||||||
|
VERIFY( ++v.begin() == v.end() );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// { dg-options "-std=gnu++11" }
|
||||||
|
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <memory>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
#include <testsuite_allocator.h>
|
||||||
|
|
||||||
|
struct T { int i; };
|
||||||
|
bool operator==(const T& l, const T& r) { return l.i == r.i; }
|
||||||
|
struct H { std::size_t operator()(const T& t) const noexcept { return t.i; }
|
||||||
|
};
|
||||||
|
struct E : std::equal_to<T> { };
|
||||||
|
|
||||||
|
using __gnu_test::CustomPointerAlloc;
|
||||||
|
|
||||||
|
template class std::unordered_set<T, H, E, CustomPointerAlloc<T>>;
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
typedef CustomPointerAlloc<T> alloc_type;
|
||||||
|
typedef std::unordered_set<T, H, E, alloc_type> test_type;
|
||||||
|
test_type v;
|
||||||
|
v.insert(T());
|
||||||
|
VERIFY( ++v.begin() == v.end() );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// { dg-options "-std=gnu++11" }
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
#include <testsuite_allocator.h>
|
||||||
|
|
||||||
|
struct T { int i; };
|
||||||
|
|
||||||
|
using __gnu_test::CustomPointerAlloc;
|
||||||
|
|
||||||
|
template class std::vector<T, CustomPointerAlloc<T>>;
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
typedef CustomPointerAlloc<T> alloc_type;
|
||||||
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
|
test_type v;
|
||||||
|
v.push_back(T());
|
||||||
|
VERIFY( ++v.begin() == v.end() );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
}
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include <tr1/unordered_map>
|
#include <tr1/unordered_map>
|
||||||
#include <bits/move.h>
|
#include <bits/move.h>
|
||||||
|
#include <ext/pointer.h>
|
||||||
#include <testsuite_hooks.h>
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
namespace __gnu_test
|
namespace __gnu_test
|
||||||
|
|
@ -488,6 +489,36 @@ namespace __gnu_test
|
||||||
{ typedef ExplicitConsAlloc<Up> other; };
|
{ typedef ExplicitConsAlloc<Up> other; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
template<typename Tp>
|
||||||
|
class CustomPointerAlloc : public std::allocator<Tp>
|
||||||
|
{
|
||||||
|
template<typename Up, typename Sp = __gnu_cxx::_Std_pointer_impl<Up>>
|
||||||
|
using Ptr = __gnu_cxx::_Pointer_adapter<Sp>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CustomPointerAlloc() = default;
|
||||||
|
|
||||||
|
template<typename Up>
|
||||||
|
CustomPointerAlloc(const CustomPointerAlloc<Up>&) { }
|
||||||
|
|
||||||
|
template<typename Up>
|
||||||
|
struct rebind
|
||||||
|
{ typedef CustomPointerAlloc<Up> other; };
|
||||||
|
|
||||||
|
typedef Ptr<Tp> pointer;
|
||||||
|
typedef Ptr<const Tp> const_pointer;
|
||||||
|
typedef Ptr<void> void_pointer;
|
||||||
|
typedef Ptr<const void> const_void_pointer;
|
||||||
|
|
||||||
|
pointer allocate(std::size_t n, pointer = {})
|
||||||
|
{ return pointer(std::allocator<Tp>::allocate(n)); }
|
||||||
|
|
||||||
|
void deallocate(pointer p, std::size_t n)
|
||||||
|
{ std::allocator<Tp>::deallocate(std::addressof(*p), n); }
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace __gnu_test
|
} // namespace __gnu_test
|
||||||
|
|
||||||
#endif // _GLIBCXX_TESTSUITE_ALLOCATOR_H
|
#endif // _GLIBCXX_TESTSUITE_ALLOCATOR_H
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue