[cfe-commits] [libcxx] r159918 - in /libcxx/trunk/include: deque vector

Howard Hinnant hhinnant at apple.com
Sun Jul 8 16:23:04 PDT 2012


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





More information about the cfe-commits mailing list