summaryrefslogtreecommitdiffstats
path: root/libcxx/include/memory
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2016-07-11 21:38:08 +0000
committerMarshall Clow <mclow.lists@gmail.com>2016-07-11 21:38:08 +0000
commitdc3eb83d08d63d41824d87e64c10021faee44c6e (patch)
tree817e696bbdaaadc91e760d0e08b2fd7f8f554ae2 /libcxx/include/memory
parent83a25792c5c2fc658736af63b7fc51172642be01 (diff)
downloadbcm5719-llvm-dc3eb83d08d63d41824d87e64c10021faee44c6e.tar.gz
bcm5719-llvm-dc3eb83d08d63d41824d87e64c10021faee44c6e.zip
Always use the allocator to construct/destruct elements of a deque/vector. Fixes PR#28412. Thanks to Jonathan Wakely for the report.
llvm-svn: 275105
Diffstat (limited to 'libcxx/include/memory')
-rw-r--r--libcxx/include/memory20
1 files changed, 20 insertions, 0 deletions
diff --git a/libcxx/include/memory b/libcxx/include/memory
index 50a1f00a5e5..7a3281e1793 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -5674,6 +5674,26 @@ struct __noexcept_move_assign_container : public integral_constant<bool,
#endif
> {};
+
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+template <class _Tp, class _Alloc>
+struct __temp_value {
+ typedef allocator_traits<_Alloc> _Traits;
+
+ typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v;
+ _Alloc &__a;
+
+ _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); }
+ _Tp & get() { return *__addr(); }
+
+ template<class... _Args>
+ __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc)
+ { _Traits::construct(__a, __addr(), _VSTD::forward<_Args>(__args)...); }
+
+ ~__temp_value() { _Traits::destroy(__a, __addr()); }
+ };
+#endif
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP_MEMORY
OpenPOWER on IntegriCloud