_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());
        }