_M_get_allocator() const
{ return _M_dataplus; }
+ // Ensure that _M_local_buf is the active member of the union.
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
+ pointer
+ _M_use_local_data() _GLIBCXX_NOEXCEPT
+ {
+#if __cpp_lib_is_constant_evaluated
+ if (__builtin_is_constant_evaluated())
+ _M_local_buf[0] = _CharT();
+#endif
+ return _M_local_data();
+ }
+
private:
#ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
if (__str.size() <= _S_local_capacity)
{
_M_destroy(_M_allocated_capacity);
- _M_data(_M_local_data());
+ _M_data(_M_use_local_data());
_M_set_length(0);
}
else
size_type __len = 0;
size_type __capacity = size_type(_S_local_capacity);
+ pointer __p = _M_use_local_data();
+
while (__beg != __end && __len < __capacity)
{
- _M_data()[__len++] = *__beg;
+ __p[__len++] = *__beg;
++__beg;
}
_M_data(_M_create(__dnew, size_type(0)));
_M_capacity(__dnew);
}
+ else
+ _M_use_local_data();
// Check for out_of_range and length_error exceptions.
__try
_M_data(_M_create(__n, size_type(0)));
_M_capacity(__n);
}
+ else
+ _M_use_local_data();
if (__n)
this->_S_assign(_M_data(), __n, __c);
if (__length <= size_type(_S_local_capacity))
{
- this->_S_copy(_M_local_data(), _M_data(), __length + 1);
+ this->_S_copy(_M_use_local_data(), _M_data(), __length + 1);
_M_destroy(__capacity);
_M_data(_M_local_data());
}