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 <[email protected]> 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>&)
