+2019-07-18 François Dumont <fdumont@gcc.gnu.org>
+
+ * include/bits/stl_tempbuf.h (__detail::__return_temporary_buffer): New.
+ (~_Temporary_buffer()): Use latter.
+ (_Temporary_buffer(_FIterator, size_type)): Likewise.
+
2019-07-17 Andreas Schwab <schwab@suse.de>
* config/abi/post/ia64-linux-gnu/baseline_symbols.txt: Update.
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace __detail
+ {
+ template<typename _Tp>
+ inline void
+ __return_temporary_buffer(_Tp* __p,
+ size_t __len __attribute__((__unused__)))
+ {
+#if __cpp_sized_deallocation
+ ::operator delete(__p, __len);
+#else
+ ::operator delete(__p);
+#endif
+ }
+ }
+
/**
* @brief Allocates a temporary buffer.
* @param __len The number of objects of type Tp.
return_temporary_buffer(_Tp* __p)
{ ::operator delete(__p); }
-
/**
* This class is used in two places: stl_algo.h and ext/memory,
* where it is wrapped as the temporary_buffer class. See
~_Temporary_buffer()
{
std::_Destroy(_M_buffer, _M_buffer + _M_len);
- std::return_temporary_buffer(_M_buffer);
+ std::__detail::__return_temporary_buffer(_M_buffer, _M_len);
}
private:
__ucr(_Pointer __first, _Pointer __last,
_ForwardIterator __seed)
{
- if(__first == __last)
+ if (__first == __last)
return;
_Pointer __cur = __first;
_Temporary_buffer(_ForwardIterator __seed, size_type __original_len)
: _M_original_len(__original_len), _M_len(0), _M_buffer(0)
{
- __try
- {
- std::pair<pointer, size_type> __p(std::get_temporary_buffer<
- value_type>(_M_original_len));
- _M_buffer = __p.first;
- _M_len = __p.second;
- if (_M_buffer)
- std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len,
- __seed);
- }
- __catch(...)
+ std::pair<pointer, size_type> __p(
+ std::get_temporary_buffer<value_type>(_M_original_len));
+
+ if (__p.first)
{
- std::return_temporary_buffer(_M_buffer);
- _M_buffer = 0;
- _M_len = 0;
- __throw_exception_again;
+ __try
+ {
+ std::__uninitialized_construct_buf(__p.first, __p.first + __p.second,
+ __seed);
+ _M_buffer = __p.first;
+ _M_len = __p.second;
+ }
+ __catch(...)
+ {
+ std::__detail::__return_temporary_buffer(__p.first, __p.second);
+ __throw_exception_again;
+ }
}
}