diff options
author | Howard Hinnant <hhinnant@apple.com> | 2011-08-17 20:36:18 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2011-08-17 20:36:18 +0000 |
commit | 3fdbbd2a6fabd404639fb3cece67a71be34677b2 (patch) | |
tree | a6d91dc978a501f30ce0cf7b6bf7e1b84472bebc /include/string | |
parent | 43edf2d1e18e19767d175518d0897e36d80e74c3 (diff) | |
download | external_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/string | 24 |
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(); } |