From: marshall Date: Wed, 27 Nov 2019 15:13:00 +0000 (-0800) Subject: Optimize and fix basic_string move assignment operator. Reviewed as https://reviews... X-Git-Tag: llvmorg-11-init~3343 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=703c26f03be74daf6e483380e6b23029a3851081;p=platform%2Fupstream%2Fllvm.git Optimize and fix basic_string move assignment operator. Reviewed as https://reviews.llvm.org/D68623. Thanks to mvels for the patch. --- diff --git a/libcxx/include/string b/libcxx/include/string index c16dbed..4e0b211 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -2289,10 +2289,20 @@ basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, tr _NOEXCEPT_(is_nothrow_move_assignable::value) #endif { - __clear_and_shrink(); - __r_.first() = __str.__r_.first(); - __move_assign_alloc(__str); - __str.__zero(); + if (__is_long()) { + __alloc_traits::deallocate(__alloc(), __get_long_pointer(), + __get_long_cap()); +#if _LIBCPP_STD_VER <= 14 + if (!is_nothrow_move_assignable::value) { + __set_short_size(0); + traits_type::assign(__get_short_pointer()[0], value_type()); + } +#endif + } + __move_assign_alloc(__str); + __r_.first() = __str.__r_.first(); + __str.__set_short_size(0); + traits_type::assign(__str.__get_short_pointer()[0], value_type()); } template