On 20/10/16 11:12 +0100, Jonathan Wakely wrote:
This let's std::allocator<void> be used in situations like:
std::allocate_shared<int>(std::allocator<void>(), 1);
where a "proto-allocator" is required. The other members such as
allocate() and max_size() don't make sense for void, but construct and
destroy don't depend on value_type.
PR libstdc++/78052
* include/bits/allocator.h (allocator<void>::construct)
(allocator<void>::destroy): Define.
* testsuite/20_util/allocator/void.cc: New test.
Tested x86_64-linux, committed to trunk. Also applying to gcc-5 and
gcc-6 branches, because this used to work before I put in the
allocator_traits<allocator<T>> partial specialization.
Some whitespace cleanup in the allocator files.
Committed to trunk.
commit 5612ef6e6ed6ffec81b8499f8a72753ae017ca92
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Thu Oct 20 12:02:06 2016 +0100
Tweak whitespace in std::allocator files
* include/bits/allocator.h: Remove trailing whitespace, tab-indent.
* include/ext/new_allocator.h: Likewise.
diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h
index 9fb5842..327e250 100644
--- a/libstdc++-v3/include/bits/allocator.h
+++ b/libstdc++-v3/include/bits/allocator.h
@@ -75,8 +75,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef void value_type;
template<typename _Tp1>
- struct rebind
- { typedef allocator<_Tp1> other; };
+ struct rebind
+ { typedef allocator<_Tp1> other; };
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -86,13 +86,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
- void
- construct(_Up* __p, _Args&&... __args)
+ void
+ construct(_Up* __p, _Args&&... __args)
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
template<typename _Up>
- void
- destroy(_Up* __p) { __p->~_Up(); }
+ void
+ destroy(_Up* __p) { __p->~_Up(); }
#endif
};
@@ -117,8 +117,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef _Tp value_type;
template<typename _Tp1>
- struct rebind
- { typedef allocator<_Tp1> other; };
+ struct rebind
+ { typedef allocator<_Tp1> other; };
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -134,7 +134,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: __allocator_base<_Tp>(__a) { }
template<typename _Tp1>
- allocator(const allocator<_Tp1>&) throw() { }
+ allocator(const allocator<_Tp1>&) throw() { }
~allocator() throw() { }
diff --git a/libstdc++-v3/include/ext/new_allocator.h b/libstdc++-v3/include/ext/new_allocator.h
index 2ff4780..7633029 100644
--- a/libstdc++-v3/include/ext/new_allocator.h
+++ b/libstdc++-v3/include/ext/new_allocator.h
@@ -48,7 +48,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @brief An allocator that uses global new, as per [20.4].
* @ingroup allocators
*
- * This is precisely the allocator defined in the C++ Standard.
+ * This is precisely the allocator defined in the C++ Standard.
* - all allocation calls operator new
* - all deallocation calls operator delete
*
@@ -67,8 +67,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef _Tp value_type;
template<typename _Tp1>
- struct rebind
- { typedef new_allocator<_Tp1> other; };
+ struct rebind
+ { typedef new_allocator<_Tp1> other; };
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -81,7 +81,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
- new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
+ new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
~new_allocator() _GLIBCXX_USE_NOEXCEPT { }
@@ -97,7 +97,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// about what the return value is when __n == 0.
pointer
allocate(size_type __n, const void* = 0)
- {
+ {
if (__n > this->max_size())
std::__throw_bad_alloc();
@@ -131,21 +131,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus >= 201103L
template<typename _Up, typename... _Args>
- void
- construct(_Up* __p, _Args&&... __args)
+ void
+ construct(_Up* __p, _Args&&... __args)
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
template<typename _Up>
- void
- destroy(_Up* __p) { __p->~_Up(); }
+ void
+ destroy(_Up* __p) { __p->~_Up(); }
#else
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_] allocator::construct
- void
- construct(pointer __p, const _Tp& __val)
+ void
+ construct(pointer __p, const _Tp& __val)
{ ::new((void *)__p) _Tp(__val); }
- void
+ void
destroy(pointer __p) { __p->~_Tp(); }
#endif
};
@@ -154,7 +154,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline bool
operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
{ return true; }
-
+
template<typename _Tp>
inline bool
operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)