summaryrefslogtreecommitdiffstats
path: root/include/string
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2011-08-17 20:36:18 +0000
committerHoward Hinnant <hhinnant@apple.com>2011-08-17 20:36:18 +0000
commit3fdbbd2a6fabd404639fb3cece67a71be34677b2 (patch)
treea6d91dc978a501f30ce0cf7b6bf7e1b84472bebc /include/string
parent43edf2d1e18e19767d175518d0897e36d80e74c3 (diff)
downloadexternal_libcxx-3fdbbd2a6fabd404639fb3cece67a71be34677b2.tar.gz
external_libcxx-3fdbbd2a6fabd404639fb3cece67a71be34677b2.tar.bz2
external_libcxx-3fdbbd2a6fabd404639fb3cece67a71be34677b2.zip
Don't move assign string::allocator_type when propagate_on_container_move_assignment is false.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@137862 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/string')
-rw-r--r--include/string24
1 files changed, 23 insertions, 1 deletions
diff --git a/include/string b/include/string
index 7fdf0d890..a1dba310b 100644
--- a/include/string
+++ b/include/string
@@ -1592,6 +1592,27 @@ private:
#endif
_LIBCPP_INLINE_VISIBILITY
+ void
+ __move_assign_alloc(const basic_string& __str)
+ _NOEXCEPT_(
+ !__alloc_traits::propagate_on_container_move_assignment::value ||
+ is_nothrow_move_assignable<allocator_type>::value)
+ {__move_assign_alloc(__str, integral_constant<bool,
+ __alloc_traits::propagate_on_container_move_assignment::value>());}
+
+ _LIBCPP_INLINE_VISIBILITY
+ void __move_assign_alloc(const basic_string& __c, true_type)
+ _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
+ {
+ __alloc() = _VSTD::move(__c.__alloc());
+ }
+
+ _LIBCPP_INLINE_VISIBILITY
+ void __move_assign_alloc(const basic_string& __c, false_type)
+ _NOEXCEPT
+ {}
+
+ _LIBCPP_INLINE_VISIBILITY
static void __swap_alloc(allocator_type& __x, allocator_type& __y)
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
__is_nothrow_swappable<allocator_type>::value)
@@ -2138,7 +2159,8 @@ basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, tr
{
clear();
shrink_to_fit();
- __r_ = _VSTD::move(__str.__r_);
+ __r_.first() = __str.__r_.first();
+ __move_assign_alloc(__str);
__str.__zero();
}