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>&)

Reply via email to