diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-07-06 12:54:10 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-07-06 12:54:10 +0100 |
commit | 318c48e30402eadaeee86dee9486733678c5fef4 (patch) | |
tree | e5525d528a0fa911bbca4a5b836c9fd1a0a559c1 | |
parent | 68d872d728caced187cfef59c8a5a04af34b2c64 (diff) | |
download | gcc-318c48e30402eadaeee86dee9486733678c5fef4.zip gcc-318c48e30402eadaeee86dee9486733678c5fef4.tar.gz gcc-318c48e30402eadaeee86dee9486733678c5fef4.tar.bz2 |
Prevent __uses_alloc from holding dangling references
* include/bits/uses_allocator.h (__use_alloc(const _Alloc&&)): Add
deleted overload to prevent dangling references to rvalues.
* include/experimental/memory_resource
(polymorphic_allocator::construct): Do not call __use_alloc with
rvalue arguments.
From-SVN: r250019
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/uses_allocator.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/memory_resource | 10 |
3 files changed, 19 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 770b578..1c50a3b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2017-07-06 Jonathan Wakely <jwakely@redhat.com> + + * include/bits/uses_allocator.h (__use_alloc(const _Alloc&&)): Add + deleted overload to prevent dangling references to rvalues. + * include/experimental/memory_resource + (polymorphic_allocator::construct): Do not call __use_alloc with + rvalue arguments. + 2017-06-27 Tim Shen <timshen@google.com> PR libstdc++/80187 diff --git a/libstdc++-v3/include/bits/uses_allocator.h b/libstdc++-v3/include/bits/uses_allocator.h index 89d4e43..4d60716 100644 --- a/libstdc++-v3/include/bits/uses_allocator.h +++ b/libstdc++-v3/include/bits/uses_allocator.h @@ -109,6 +109,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __ret._M_a = std::__addressof(__a); return __ret; } + + template<typename _Tp, typename _Alloc, typename... _Args> + void + __use_alloc(const _Alloc&&) = delete; + #if __cplusplus > 201402L template <typename _Tp, typename _Alloc> inline constexpr bool uses_allocator_v = diff --git a/libstdc++-v3/include/experimental/memory_resource b/libstdc++-v3/include/experimental/memory_resource index 653189c..99ace7a 100644 --- a/libstdc++-v3/include/experimental/memory_resource +++ b/libstdc++-v3/include/experimental/memory_resource @@ -168,8 +168,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template <typename _Tp1, typename... _Args> //used here void construct(_Tp1* __p, _Args&&... __args) { - auto __use_tag = __use_alloc<_Tp1, memory_resource*, - _Args...>(this->resource()); + memory_resource* const __resource = this->resource(); + auto __use_tag + = __use_alloc<_Tp1, memory_resource*, _Args...>(__resource); _M_construct(__use_tag, __p, std::forward<_Args>(__args)...); } @@ -180,10 +181,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION tuple<_Args1...> __x, tuple<_Args2...> __y) { + memory_resource* const __resource = this->resource(); auto __x_use_tag = - __use_alloc<_Tp1, memory_resource*, _Args1...>(this->resource()); + __use_alloc<_Tp1, memory_resource*, _Args1...>(__resource); auto __y_use_tag = - __use_alloc<_Tp2, memory_resource*, _Args2...>(this->resource()); + __use_alloc<_Tp2, memory_resource*, _Args2...>(__resource); ::new(__p) std::pair<_Tp1, _Tp2>(piecewise_construct, _M_construct_p(__x_use_tag, __x), |