diff --git a/libcxx/include/string b/libcxx/include/string --- a/libcxx/include/string +++ b/libcxx/include/string @@ -806,7 +806,7 @@ if (__size > max_size()) __throw_length_error(); if (__fits_in_sso(__size)) { - __zero(); + __r_.first() = __rep(); __set_short_size(__size); } else { auto __capacity = __recommend(__size) + 1; @@ -1525,7 +1525,7 @@ } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __default_init() { - __zero(); + __r_.first() = __rep(); if (__libcpp_is_constant_evaluated()) { size_type __sz = __recommend(0) + 1; pointer __ptr = __alloc_traits::allocate(__alloc(), __sz); @@ -1632,11 +1632,6 @@ const_pointer __get_pointer() const _NOEXCEPT {return __is_long() ? __get_long_pointer() : __get_short_pointer();} - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 - void __zero() _NOEXCEPT { - __r_.first() = __rep(); - } - template static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __align_it(size_type __s) _NOEXCEPT @@ -1936,7 +1931,7 @@ size_type __reserve) { if (__libcpp_is_constant_evaluated()) - __zero(); + __r_.first() = __rep(); if (__reserve > max_size()) __throw_length_error(); pointer __p; @@ -1964,7 +1959,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz) { if (__libcpp_is_constant_evaluated()) - __zero(); + __r_.first() = __rep(); if (__sz > max_size()) __throw_length_error(); pointer __p; @@ -2023,7 +2018,7 @@ : __r_(__default_init_tag(), __alloc_traits::select_on_container_copy_construction(__str.__alloc())) { if (!__str.__is_long()) - __r_.first().__r = __str.__r_.first().__r; + __r_.first() = __str.__r_.first(); else __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()), __str.__get_long_size()); @@ -2037,7 +2032,7 @@ : __r_(__default_init_tag(), __a) { if (!__str.__is_long()) - __r_.first().__r = __str.__r_.first().__r; + __r_.first() = __str.__r_.first(); else __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()), __str.__get_long_size()); @@ -2049,7 +2044,8 @@ void basic_string<_CharT, _Traits, _Allocator>::__init_copy_ctor_external( const value_type* __s, size_type __sz) { if (__libcpp_is_constant_evaluated()) - __zero(); + __r_.first() = __rep(); + pointer __p; if (__fits_in_sso(__sz)) { __p = __get_short_pointer(); @@ -2094,12 +2090,9 @@ __init(std::__to_address(__str.__get_long_pointer()), __str.__get_long_size()); else { - if (__libcpp_is_constant_evaluated()) { - __zero(); - __r_.first().__l = __str.__r_.first().__l; - } else { - __r_.first().__r = __str.__r_.first().__r; - } + if (__libcpp_is_constant_evaluated()) + __r_.first() = __rep(); + __r_.first() = __str.__r_.first(); __str.__default_init(); } std::__debug_db_insert_c(this); @@ -2115,7 +2108,8 @@ basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c) { if (__libcpp_is_constant_evaluated()) - __zero(); + __r_.first() = __rep(); + if (__n > max_size()) __throw_length_error(); pointer __p; @@ -2255,7 +2249,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last) { if (__libcpp_is_constant_evaluated()) - __zero(); + __r_.first() = __rep(); size_type __sz = static_cast(std::distance(__first, __last)); if (__sz > max_size()) __throw_length_error(); @@ -2511,7 +2505,7 @@ __copy_assign_alloc(__str); if (!__is_long()) { if (!__str.__is_long()) { - __r_.first().__r = __str.__r_.first().__r; + __r_.first() = __str.__r_.first(); } else { return __assign_no_alias(__str.data(), __str.size()); }