aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2017-07-06 12:54:10 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2017-07-06 12:54:10 +0100
commit318c48e30402eadaeee86dee9486733678c5fef4 (patch)
treee5525d528a0fa911bbca4a5b836c9fd1a0a559c1
parent68d872d728caced187cfef59c8a5a04af34b2c64 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--libstdc++-v3/include/bits/uses_allocator.h5
-rw-r--r--libstdc++-v3/include/experimental/memory_resource10
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),