https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90192

--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Something like this:

--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -1153,8 +1153,48 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       void
       resize(size_type __new_size, const value_type& __x)
       {
-       if (__new_size > size())
-         _M_fill_insert(end(), __new_size - size(), __x);
+       if (__new_size > capacity())
+         {
+           struct _Guard : _Guard_alloc
+           {
+             // Elements to destroy:
+             pointer _M_first{};
+             pointer _M_last{};
+
+             using _Guard_alloc::_Guard_alloc;
+
+             _GLIBCXX20_CONSTEXPR
+             ~_Guard()
+             {
+               std::_Destroy(this->_M_first, this->_M_last,
+                             this->_M_vect._M_get_Tp_allocator());
+             }
+           };
+
+           allocator_type& __a = _M_get_Tp_allocator();
+           const size_type __sz = size();
+           const size_type __n = __new_size - size();
+           const pointer __start = this->_M_allocate(__new_size);
+           _Guard __guard(__start, __new_size, *this);
+           const pointer __mid = __start + __sz;
+           __guard._M_last
+                  = std::__uninitialized_fill_n_a(__mid, __n, __x, __a);
+           __guard._M_first = __mid;
+           std::__uninitialized_move_if_noexcept_a(this->_M_impl._M_start,
+                                                   this->_M_impl._M_finish,
+                                                   __start, __a);
+           __guard._M_storage = this->_M_impl._M_start;
+           __guard._M_first = this->_M_impl._M_start;
+           __guard._M_last = this->_M_impl._M_last;
+           this->_M_impl._M_start = __start;
+           this->_M_impl._M_finish = __start + __new_size;
+           this->_M_impl._M_end_of_storage = this->_M_impl._M_finish;
+         }
+       else if (__new_size > size())
+         this->_M_impl._M_finish
+             = std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
+                                             __new_size - size(),
+                                             __x, _M_get_Tp_allocator());
        else if (__new_size < size())
          _M_erase_at_end(this->_M_impl._M_start + __new_size);
       }

Reply via email to