Commit 6f1becb6 by François Dumont

2019-05-17 François Dumont <fdumont@gcc.gnu.org>

	* include/bits/stl_deque.h
	(_Deque_iterator<>::__ptr_to): Remove, use std::__ptr_rebind.
	(_Deque_base(_Deque_base&&, const allocator_type&)): New.
	(_Deque_base::_Deque_impl_data): New.
	(_Deque_base::_Deque_impl): Inherit latter.
	(_Deque_base::_Deque_impl::_M_swap_data): Move...
	(_Deque_base::_Deque_impl_data::_M_swap_data): ... here.
	(_Deque_base::_Deque_impl()): Add noexcept qualification.
	(_Deque_base::_Deque_impl(_Deque_impl&&, _Tp_alloc_type&&)): New.
	(_Deque_base::_Deque_impl::_M_get_Tp_allocator()): Remove static_cast.
	(deque<>::deque()): Default.
	(deque<>::deque(deque&&)): Default.
	(deque<>::deque(deque&&, const allocator_type&, false_type)): New.
	(deque<>::deque(deque&&, const allocator_type&, true_type)): New.
	(deque<>::deque(deque&&, const allocator_type&)): Delegate to latters.
	(deque<>::deque<_It>(_It, _It, const allocator_type&)): Use
	_M_range_initialize.
	(deque<>::assign<_It>(_It, _It)): Use _M_assign_aux.
	(deque<>::resize(size_type, const value_type&)): Share a single
	implementation.
	(deque<>::insert<_It>(const_iterator, _It, _It)): Use
	_M_range_insert_aux.
	[__cplusplus >= 201103L](_M_initialize_dispatch): Remove.
	[__cplusplus >= 201103L](_M_assign_dispatch): Remove.
	[__cplusplus >= 201103L](_M_insert_dispatch): Remove.
	* testsuite/23_containers/deque/allocator/default_init.cc: New.

From-SVN: r271330
parent 2a380e2e
2019-05-17 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_deque.h
(_Deque_iterator<>::__ptr_to): Remove, use std::__ptr_rebind.
(_Deque_base(_Deque_base&&, const allocator_type&)): New.
(_Deque_base::_Deque_impl_data): New.
(_Deque_base::_Deque_impl): Inherit latter.
(_Deque_base::_Deque_impl::_M_swap_data): Move...
(_Deque_base::_Deque_impl_data::_M_swap_data): ... here.
(_Deque_base::_Deque_impl()): Add noexcept qualification.
(_Deque_base::_Deque_impl(_Deque_impl&&, _Tp_alloc_type&&)): New.
(_Deque_base::_Deque_impl::_M_get_Tp_allocator()): Remove static_cast.
(deque<>::deque()): Default.
(deque<>::deque(deque&&)): Default.
(deque<>::deque(deque&&, const allocator_type&, false_type)): New.
(deque<>::deque(deque&&, const allocator_type&, true_type)): New.
(deque<>::deque(deque&&, const allocator_type&)): Delegate to latters.
(deque<>::deque<_It>(_It, _It, const allocator_type&)): Use
_M_range_initialize.
(deque<>::assign<_It>(_It, _It)): Use _M_assign_aux.
(deque<>::resize(size_type, const value_type&)): Share a single
implementation.
(deque<>::insert<_It>(const_iterator, _It, _It)): Use
_M_range_insert_aux.
[__cplusplus >= 201103L](_M_initialize_dispatch): Remove.
[__cplusplus >= 201103L](_M_assign_dispatch): Remove.
[__cplusplus >= 201103L](_M_insert_dispatch): Remove.
* testsuite/23_containers/deque/allocator/default_init.cc: New.
2019-05-17 Jonathan Wakely <jwakely@redhat.com> 2019-05-17 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/90246 PR libstdc++/90246
......
...@@ -116,15 +116,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -116,15 +116,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef _Tp** _Map_pointer; typedef _Tp** _Map_pointer;
#else #else
private: private:
template<typename _Up>
using __ptr_to = typename pointer_traits<_Ptr>::template rebind<_Up>;
template<typename _CvTp> template<typename _CvTp>
using __iter = _Deque_iterator<_Tp, _CvTp&, __ptr_to<_CvTp>>; using __iter = _Deque_iterator<_Tp, _CvTp&, __ptr_rebind<_Ptr, _CvTp>>;
public: public:
typedef __iter<_Tp> iterator; typedef __iter<_Tp> iterator;
typedef __iter<const _Tp> const_iterator; typedef __iter<const _Tp> const_iterator;
typedef __ptr_to<_Tp> _Elt_pointer; typedef __ptr_rebind<_Ptr, _Tp> _Elt_pointer;
typedef __ptr_to<_Elt_pointer> _Map_pointer; typedef __ptr_rebind<_Ptr, _Elt_pointer> _Map_pointer;
#endif #endif
static size_t _S_buffer_size() _GLIBCXX_NOEXCEPT static size_t _S_buffer_size() _GLIBCXX_NOEXCEPT
...@@ -473,7 +471,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -473,7 +471,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Map_alloc_type; _Map_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Map_alloc_type> _Map_alloc_traits; typedef __gnu_cxx::__alloc_traits<_Map_alloc_type> _Map_alloc_traits;
public:
typedef _Alloc allocator_type; typedef _Alloc allocator_type;
allocator_type allocator_type
...@@ -508,6 +505,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -508,6 +505,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
this->_M_impl._M_swap_data(__x._M_impl); this->_M_impl._M_swap_data(__x._M_impl);
} }
_Deque_base(_Deque_base&& __x, const allocator_type& __a)
: _M_impl(std::move(__x._M_impl), _Tp_alloc_type(__a))
{ __x._M_initialize_map(0); }
_Deque_base(_Deque_base&& __x, const allocator_type& __a, size_t __n) _Deque_base(_Deque_base&& __x, const allocator_type& __a, size_t __n)
: _M_impl(__a) : _M_impl(__a)
{ {
...@@ -528,56 +529,73 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -528,56 +529,73 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
~_Deque_base() _GLIBCXX_NOEXCEPT; ~_Deque_base() _GLIBCXX_NOEXCEPT;
protected:
typedef typename iterator::_Map_pointer _Map_pointer; typedef typename iterator::_Map_pointer _Map_pointer;
//This struct encapsulates the implementation of the std::deque struct _Deque_impl_data
//standard container and at the same time makes use of the EBO
//for empty allocators.
struct _Deque_impl
: public _Tp_alloc_type
{ {
_Map_pointer _M_map; _Map_pointer _M_map;
size_t _M_map_size; size_t _M_map_size;
iterator _M_start; iterator _M_start;
iterator _M_finish; iterator _M_finish;
_Deque_impl() _Deque_impl_data() _GLIBCXX_NOEXCEPT
: _Tp_alloc_type(), _M_map(), _M_map_size(0), : _M_map(), _M_map_size(), _M_start(), _M_finish()
_M_start(), _M_finish() { }
#if __cplusplus >= 201103L
_Deque_impl_data(const _Deque_impl_data&) = default;
_Deque_impl_data&
operator=(const _Deque_impl_data&) = default;
_Deque_impl_data(_Deque_impl_data&& __x) noexcept
: _Deque_impl_data(__x)
{ __x = _Deque_impl_data(); }
#endif
void
_M_swap_data(_Deque_impl_data& __x) _GLIBCXX_NOEXCEPT
{
// Do not use std::swap(_M_start, __x._M_start), etc as it loses
// information used by TBAA.
std::swap(*this, __x);
}
};
// This struct encapsulates the implementation of the std::deque
// standard container and at the same time makes use of the EBO
// for empty allocators.
struct _Deque_impl
: public _Tp_alloc_type, public _Deque_impl_data
{
_Deque_impl() _GLIBCXX_NOEXCEPT_IF(
is_nothrow_default_constructible<_Tp_alloc_type>::value)
: _Tp_alloc_type()
{ } { }
_Deque_impl(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT _Deque_impl(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
: _Tp_alloc_type(__a), _M_map(), _M_map_size(0), : _Tp_alloc_type(__a)
_M_start(), _M_finish()
{ } { }
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
_Deque_impl(_Deque_impl&&) = default; _Deque_impl(_Deque_impl&&) = default;
_Deque_impl(_Tp_alloc_type&& __a) noexcept _Deque_impl(_Tp_alloc_type&& __a) noexcept
: _Tp_alloc_type(std::move(__a)), _M_map(), _M_map_size(0), : _Tp_alloc_type(std::move(__a))
_M_start(), _M_finish()
{ } { }
#endif
void _M_swap_data(_Deque_impl& __x) _GLIBCXX_NOEXCEPT _Deque_impl(_Deque_impl&& __d, _Tp_alloc_type&& __a)
{ : _Tp_alloc_type(std::move(__a)), _Deque_impl_data(std::move(__d))
using std::swap; { }
swap(this->_M_start, __x._M_start); #endif
swap(this->_M_finish, __x._M_finish);
swap(this->_M_map, __x._M_map);
swap(this->_M_map_size, __x._M_map_size);
}
}; };
_Tp_alloc_type& _Tp_alloc_type&
_M_get_Tp_allocator() _GLIBCXX_NOEXCEPT _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
{ return *static_cast<_Tp_alloc_type*>(&this->_M_impl); } { return this->_M_impl; }
const _Tp_alloc_type& const _Tp_alloc_type&
_M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
{ return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); } { return this->_M_impl; }
_Map_alloc_type _Map_alloc_type
_M_get_map_allocator() const _GLIBCXX_NOEXCEPT _M_get_map_allocator() const _GLIBCXX_NOEXCEPT
...@@ -611,7 +629,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -611,7 +629,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Map_alloc_traits::deallocate(__map_alloc, __p, __n); _Map_alloc_traits::deallocate(__map_alloc, __p, __n);
} }
protected:
void _M_initialize_map(size_t); void _M_initialize_map(size_t);
void _M_create_nodes(_Map_pointer __nstart, _Map_pointer __nfinish); void _M_create_nodes(_Map_pointer __nstart, _Map_pointer __nfinish);
void _M_destroy_nodes(_Map_pointer __nstart, void _M_destroy_nodes(_Map_pointer __nstart,
...@@ -646,7 +663,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -646,7 +663,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Deque_base<_Tp, _Alloc>:: _Deque_base<_Tp, _Alloc>::
_M_initialize_map(size_t __num_elements) _M_initialize_map(size_t __num_elements)
{ {
const size_t __num_nodes = (__num_elements/ __deque_buf_size(sizeof(_Tp)) const size_t __num_nodes = (__num_elements / __deque_buf_size(sizeof(_Tp))
+ 1); + 1);
this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size, this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size,
...@@ -832,7 +849,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -832,7 +849,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type; typedef _Alloc allocator_type;
protected: private:
static size_t _S_buffer_size() _GLIBCXX_NOEXCEPT static size_t _S_buffer_size() _GLIBCXX_NOEXCEPT
{ return __deque_buf_size(sizeof(_Tp)); } { return __deque_buf_size(sizeof(_Tp)); }
...@@ -859,7 +876,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -859,7 +876,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
/** /**
* @brief Creates a %deque with no elements. * @brief Creates a %deque with no elements.
*/ */
deque() : _Base() { } #if __cplusplus >= 201103L
deque() = default;
#else
deque() { }
#endif
/** /**
* @brief Creates a %deque with no elements. * @brief Creates a %deque with no elements.
...@@ -928,13 +949,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -928,13 +949,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** /**
* @brief %Deque move constructor. * @brief %Deque move constructor.
* @param __x A %deque of identical element and allocator types.
* *
* The newly-created %deque contains the exact contents of @a __x. * The newly-created %deque contains the exact contents of the
* The contents of @a __x are a valid, but unspecified %deque. * moved instance.
* The contents of the moved instance are a valid, but unspecified
* %deque.
*/ */
deque(deque&& __x) deque(deque&&) = default;
: _Base(std::move(__x)) { }
/// Copy constructor with alternative allocator /// Copy constructor with alternative allocator
deque(const deque& __x, const allocator_type& __a) deque(const deque& __x, const allocator_type& __a)
...@@ -945,9 +966,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -945,9 +966,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
/// Move constructor with alternative allocator /// Move constructor with alternative allocator
deque(deque&& __x, const allocator_type& __a) deque(deque&& __x, const allocator_type& __a)
: deque(std::move(__x), __a, typename _Alloc_traits::is_always_equal{})
{ }
private:
deque(deque&& __x, const allocator_type& __a, true_type)
: _Base(std::move(__x), __a)
{ }
deque(deque&& __x, const allocator_type& __a, false_type)
: _Base(std::move(__x), __a, __x.size()) : _Base(std::move(__x), __a, __x.size())
{ {
if (__x.get_allocator() != __a) if (__x.get_allocator() != __a && !__x.empty())
{ {
std::__uninitialized_move_a(__x.begin(), __x.end(), std::__uninitialized_move_a(__x.begin(), __x.end(),
this->_M_impl._M_start, this->_M_impl._M_start,
...@@ -956,6 +986,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -956,6 +986,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
} }
} }
public:
/** /**
* @brief Builds a %deque from an initializer list. * @brief Builds a %deque from an initializer list.
* @param __l An initializer_list. * @param __l An initializer_list.
...@@ -997,7 +1028,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -997,7 +1028,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
deque(_InputIterator __first, _InputIterator __last, deque(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
: _Base(__a) : _Base(__a)
{ _M_initialize_dispatch(__first, __last, __false_type()); } {
_M_range_initialize(__first, __last,
std::__iterator_category(__first));
}
#else #else
template<typename _InputIterator> template<typename _InputIterator>
deque(_InputIterator __first, _InputIterator __last, deque(_InputIterator __first, _InputIterator __last,
...@@ -1098,7 +1132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1098,7 +1132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
void void
assign(_InputIterator __first, _InputIterator __last) assign(_InputIterator __first, _InputIterator __last)
{ _M_assign_dispatch(__first, __last, __false_type()); } { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
#else #else
template<typename _InputIterator> template<typename _InputIterator>
void void
...@@ -1284,14 +1318,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1284,14 +1318,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
void void
resize(size_type __new_size, const value_type& __x) resize(size_type __new_size, const value_type& __x)
{
const size_type __len = size();
if (__new_size > __len)
_M_fill_insert(this->_M_impl._M_finish, __new_size - __len, __x);
else if (__new_size < __len)
_M_erase_at_end(this->_M_impl._M_start
+ difference_type(__new_size));
}
#else #else
/** /**
* @brief Resizes the %deque to the specified number of elements. * @brief Resizes the %deque to the specified number of elements.
...@@ -1306,6 +1332,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1306,6 +1332,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
void void
resize(size_type __new_size, value_type __x = value_type()) resize(size_type __new_size, value_type __x = value_type())
#endif
{ {
const size_type __len = size(); const size_type __len = size();
if (__new_size > __len) if (__new_size > __len)
...@@ -1314,7 +1341,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1314,7 +1341,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_erase_at_end(this->_M_impl._M_start _M_erase_at_end(this->_M_impl._M_start
+ difference_type(__new_size)); + difference_type(__new_size));
} }
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** A non-binding request to reduce memory use. */ /** A non-binding request to reduce memory use. */
...@@ -1555,7 +1581,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1555,7 +1581,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
if (this->_M_impl._M_start._M_cur if (this->_M_impl._M_start._M_cur
!= this->_M_impl._M_start._M_last - 1) != this->_M_impl._M_start._M_last - 1)
{ {
_Alloc_traits::destroy(this->_M_impl, _Alloc_traits::destroy(_M_get_Tp_allocator(),
this->_M_impl._M_start._M_cur); this->_M_impl._M_start._M_cur);
++this->_M_impl._M_start._M_cur; ++this->_M_impl._M_start._M_cur;
} }
...@@ -1579,7 +1605,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1579,7 +1605,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
!= this->_M_impl._M_finish._M_first) != this->_M_impl._M_finish._M_first)
{ {
--this->_M_impl._M_finish._M_cur; --this->_M_impl._M_finish._M_cur;
_Alloc_traits::destroy(this->_M_impl, _Alloc_traits::destroy(_M_get_Tp_allocator(),
this->_M_impl._M_finish._M_cur); this->_M_impl._M_finish._M_cur);
} }
else else
...@@ -1643,6 +1669,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1643,6 +1669,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* @brief Inserts an initializer list into the %deque. * @brief Inserts an initializer list into the %deque.
* @param __p An iterator into the %deque. * @param __p An iterator into the %deque.
* @param __l An initializer_list. * @param __l An initializer_list.
* @return An iterator that points to the inserted data.
* *
* This function will insert copies of the data in the * This function will insert copies of the data in the
* initializer_list @a __l into the %deque before the location * initializer_list @a __l into the %deque before the location
...@@ -1656,9 +1683,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1656,9 +1683,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
std::random_access_iterator_tag()); std::random_access_iterator_tag());
return begin() + __offset; return begin() + __offset;
} }
#endif
#if __cplusplus >= 201103L
/** /**
* @brief Inserts a number of copies of given data into the %deque. * @brief Inserts a number of copies of given data into the %deque.
* @param __position A const_iterator into the %deque. * @param __position A const_iterator into the %deque.
...@@ -1710,8 +1735,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1710,8 +1735,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_InputIterator __last) _InputIterator __last)
{ {
difference_type __offset = __position - cbegin(); difference_type __offset = __position - cbegin();
_M_insert_dispatch(__position._M_const_cast(), _M_range_insert_aux(__position._M_const_cast(), __first, __last,
__first, __last, __false_type()); std::__iterator_category(__first));
return begin() + __offset; return begin() + __offset;
} }
#else #else
...@@ -1817,6 +1842,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1817,6 +1842,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
protected: protected:
// Internal constructor functions follow. // Internal constructor functions follow.
#if __cplusplus < 201103L
// called by the range constructor to implement [23.1.1]/9 // called by the range constructor to implement [23.1.1]/9
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
...@@ -1830,6 +1856,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1830,6 +1856,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_fill_initialize(__x); _M_fill_initialize(__x);
} }
// called by the range constructor to implement [23.1.1]/9
template<typename _InputIterator>
void
_M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
__false_type)
{
_M_range_initialize(__first, __last,
std::__iterator_category(__first));
}
#endif
static size_t static size_t
_S_check_init_len(size_t __n, const allocator_type& __a) _S_check_init_len(size_t __n, const allocator_type& __a)
{ {
...@@ -1847,16 +1884,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1847,16 +1884,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
return (std::min)(__diffmax, __allocmax); return (std::min)(__diffmax, __allocmax);
} }
// called by the range constructor to implement [23.1.1]/9
template<typename _InputIterator>
void
_M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
__false_type)
{
_M_range_initialize(__first, __last,
std::__iterator_category(__first));
}
// called by the second initialize_dispatch above // called by the second initialize_dispatch above
//@{ //@{
/** /**
...@@ -1903,6 +1930,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1903,6 +1930,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
// Internal assign functions follow. The *_aux functions do the actual // Internal assign functions follow. The *_aux functions do the actual
// assignment work for the range versions. // assignment work for the range versions.
#if __cplusplus < 201103L
// called by the range assign to implement [23.1.1]/9 // called by the range assign to implement [23.1.1]/9
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
...@@ -1918,6 +1946,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1918,6 +1946,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_assign_dispatch(_InputIterator __first, _InputIterator __last, _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
__false_type) __false_type)
{ _M_assign_aux(__first, __last, std::__iterator_category(__first)); } { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
#endif
// called by the second assign_dispatch above // called by the second assign_dispatch above
template<typename _InputIterator> template<typename _InputIterator>
...@@ -1983,6 +2012,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1983,6 +2012,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
// Internal insert functions follow. The *_aux functions do the actual // Internal insert functions follow. The *_aux functions do the actual
// insertion work when all shortcuts fail. // insertion work when all shortcuts fail.
#if __cplusplus < 201103L
// called by the range insert to implement [23.1.1]/9 // called by the range insert to implement [23.1.1]/9
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
...@@ -2003,6 +2033,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -2003,6 +2033,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_range_insert_aux(__pos, __first, __last, _M_range_insert_aux(__pos, __first, __last,
std::__iterator_category(__first)); std::__iterator_category(__first));
} }
#endif
// called by the second insert_dispatch above // called by the second insert_dispatch above
template<typename _InputIterator> template<typename _InputIterator>
......
// Copyright (C) 2019 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-do run { target c++11 } }
// { dg-options "-O0" }
// { dg-xfail-run-if "PR c++/65816" { *-*-* } }
#include <deque>
#include <testsuite_hooks.h>
#include <testsuite_allocator.h>
#include <ext/aligned_buffer.h>
using T = int;
using __gnu_test::default_init_allocator;
void test01()
{
typedef default_init_allocator<T> alloc_type;
typedef std::deque<T, alloc_type> test_type;
__gnu_cxx::__aligned_buffer<test_type> buf;
__builtin_memset(buf._M_addr(), ~0, sizeof(test_type));
test_type *tmp = ::new(buf._M_addr()) test_type;
VERIFY( tmp->get_allocator().state == 0 );
tmp->~test_type();
}
void test02()
{
typedef default_init_allocator<T> alloc_type;
typedef std::deque<T, alloc_type> test_type;
__gnu_cxx::__aligned_buffer<test_type> buf;
__builtin_memset(buf._M_addr(), ~0, sizeof(test_type));
test_type *tmp = ::new(buf._M_addr()) test_type();
VERIFY( tmp->get_allocator().state == 0 );
tmp->~test_type();
}
int main()
{
test01();
test02();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment