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

--- Comment #7 from Marc Glisse <glisse at gcc dot gnu.org> ---
It seems to help if we save the values before the allocation in vector.tcc,
although I cannot promise it won't pessimize something else... And that's just
a workaround, not a solution.

@@ -766,13 +766,16 @@
              {
                const size_type __len =
                  _M_check_len(__n, "vector::_M_range_insert");
+               pointer __old_start(this->_M_impl._M_start);
+               pointer __old_finish(this->_M_impl._M_finish);
+               pointer __old_end_of_storage(this->_M_impl._M_end_of_storage);
                pointer __new_start(this->_M_allocate(__len));
                pointer __new_finish(__new_start);
                __try
                  {
                    __new_finish
                      = std::__uninitialized_move_if_noexcept_a
-                     (this->_M_impl._M_start, __position.base(),
+                     (__old_start, __position.base(),
                       __new_start, _M_get_Tp_allocator());
                    __new_finish
                      = std::__uninitialized_copy_a(__first, __last,
@@ -780,7 +783,7 @@
                                                    _M_get_Tp_allocator());
                    __new_finish
                      = std::__uninitialized_move_if_noexcept_a
-                     (__position.base(), this->_M_impl._M_finish,
+                     (__position.base(), __old_finish,
                       __new_finish, _M_get_Tp_allocator());
                  }
                __catch(...)
@@ -790,12 +793,12 @@
                    _M_deallocate(__new_start, __len);
                    __throw_exception_again;
                  }
-               std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
+               std::_Destroy(__old_start, __old_finish,
                              _M_get_Tp_allocator());
                _GLIBCXX_ASAN_ANNOTATE_REINIT;
-               _M_deallocate(this->_M_impl._M_start,
-                             this->_M_impl._M_end_of_storage
-                             - this->_M_impl._M_start);
+               _M_deallocate(__old_start,
+                             __old_end_of_storage
+                             - __old_start);
                this->_M_impl._M_start = __new_start;
                this->_M_impl._M_finish = __new_finish;
                this->_M_impl._M_end_of_storage = __new_start + __len;

Reply via email to