On 28/06/16 21:59 +0200, François Dumont wrote:
  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
-    _M_insert_aux(iterator __position, const _Tp& __x)
+    _M_insert_value_aux(iterator __position, const _Tp& __x)
#endif
    {
-      if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
+      const _Tp* __ptr = std::__addressof(__x);
+
+      _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
+                              _GLIBCXX_MOVE(*(this->_M_impl._M_finish - 1)));
+      ++this->_M_impl._M_finish;
+
+      _GLIBCXX_MOVE_BACKWARD3(__position.base(),
+                             this->_M_impl._M_finish - 2,
+                             this->_M_impl._M_finish - 1);
+
+      if (_M_data_ptr(__position.base()) <= __ptr
+         && __ptr < _M_data_ptr(this->_M_impl._M_finish - 1))

This is undefined behaviour. If the object is not contained in the
vector then you can't compare its address to addresses within the
vector.

I suggest forgetting about this optimisation unless we get a guarantee
from the compiler that we can do it safely. It's orthogonal to fixing
the correctness bug with emplacing an existing element of the vector.
We can fix the correctness bug now and worry about this optimisation
separately.


Reply via email to