[cfe-commits] [libcxx] r159918 - in /libcxx/trunk/include: deque vector
Richard Smith
richard at metafoo.co.uk
Sun Jul 8 18:29:27 PDT 2012
Perhaps this would benefit from a test case? It seems subtle enough that I
could imagine it breaking in the future.
On Sun, Jul 8, 2012 at 4:23 PM, Howard Hinnant <hhinnant at apple.com> wrote:
> Author: hhinnant
> Date: Sun Jul 8 18:23:04 2012
> New Revision: 159918
>
> URL: http://llvm.org/viewvc/llvm-project?rev=159918&view=rev
> Log:
> Change emplace for vector and deque to create the temporary (when
> necessary) before any changes to the container are made. Nikolay Ivchenkov
> deserves the credit for pushing this problem and the solution for it.
>
> Modified:
> libcxx/trunk/include/deque
> libcxx/trunk/include/vector
>
> Modified: libcxx/trunk/include/deque
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/deque?rev=159918&r1=159917&r2=159918&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/deque (original)
> +++ libcxx/trunk/include/deque Sun Jul 8 18:23:04 2012
> @@ -1966,6 +1966,7 @@
> }
> else
> {
> + value_type __tmp(_VSTD::forward<_Args>(__args)...);
> iterator __b = __base::begin();
> iterator __bm1 = _VSTD::prev(__b);
> __alloc_traits::construct(__a, _VSTD::addressof(*__bm1),
> _VSTD::move(*__b));
> @@ -1973,7 +1974,7 @@
> ++__base::size();
> if (__pos > 1)
> __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
> - *__b = value_type(_VSTD::forward<_Args>(__args)...);
> + *__b = _VSTD::move(__tmp);
> }
> }
> else
> @@ -1989,13 +1990,14 @@
> }
> else
> {
> + value_type __tmp(_VSTD::forward<_Args>(__args)...);
> iterator __e = __base::end();
> iterator __em1 = _VSTD::prev(__e);
> __alloc_traits::construct(__a, _VSTD::addressof(*__e),
> _VSTD::move(*__em1));
> ++__base::size();
> if (__de > 1)
> __e = _VSTD::move_backward(__e - __de, __em1, __e);
> - *--__e = value_type(_VSTD::forward<_Args>(__args)...);
> + *--__e = _VSTD::move(__tmp);
> }
> }
> return __base::begin() + __pos;
>
> Modified: libcxx/trunk/include/vector
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/vector?rev=159918&r1=159917&r2=159918&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/vector (original)
> +++ libcxx/trunk/include/vector Sun Jul 8 18:23:04 2012
> @@ -1681,8 +1681,9 @@
> }
> else
> {
> + value_type __tmp(_VSTD::forward<_Args>(__args)...);
> __move_range(__p, this->__end_, __p + 1);
> - *__p = value_type(_VSTD::forward<_Args>(__args)...);
> + *__p = _VSTD::move(__tmp);
> }
> }
> else
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120708/7f1e5219/attachment.html>
More information about the cfe-commits
mailing list