Prevent __uses_alloc from holding dangling references
authorJonathan Wakely <jwakely@redhat.com>
Thu, 6 Jul 2017 11:54:10 +0000 (12:54 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 6 Jul 2017 11:54:10 +0000 (12:54 +0100)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/uses_allocator.h
libstdc++-v3/include/experimental/memory_resource

index 770b5789da7355e353162167d646048059021b99..1c50a3b2b4c9b1fd10280d9eb9add5a2bc4d3425 100644 (file)
@@ -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
index 89d4e4356590f2bb9462a57e06c582ae2068f2c2..4d60716b494fedf800f3672c3ac6e754e830efd9 100644 (file)
@@ -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 =
index 653189c10797555df76d060a0b8d9cc61814c53b..99ace7a7f81b52a5f42f7d1ae9c5ce37a46aa3a8 100644 (file)
@@ -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),