[llvm-commits] [llvm] r155791 - in /llvm/trunk: include/llvm/ADT/SmallVector.h unittests/ADT/SmallVectorTest.cpp

Benjamin Kramer benny.kra at googlemail.com
Sun Apr 29 03:53:30 PDT 2012


Author: d0k
Date: Sun Apr 29 05:53:29 2012
New Revision: 155791

URL: http://llvm.org/viewvc/llvm-project?rev=155791&view=rev
Log:
SmallVector: Don't rely on having an assignment operator around in push_back for POD-like types.

Modified:
    llvm/trunk/include/llvm/ADT/SmallVector.h
    llvm/trunk/unittests/ADT/SmallVectorTest.cpp

Modified: llvm/trunk/include/llvm/ADT/SmallVector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallVector.h?rev=155791&r1=155790&r2=155791&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/SmallVector.h (original)
+++ llvm/trunk/include/llvm/ADT/SmallVector.h Sun Apr 29 05:53:29 2012
@@ -252,7 +252,7 @@
   void push_back(const T &Elt) {
     if (this->EndX < this->CapacityX) {
     Retry:
-      *this->end() = Elt;
+      memcpy(this->end(), &Elt, sizeof(T));
       this->setEnd(this->end()+1);
       return;
     }

Modified: llvm/trunk/unittests/ADT/SmallVectorTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SmallVectorTest.cpp?rev=155791&r1=155790&r2=155791&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/SmallVectorTest.cpp (original)
+++ llvm/trunk/unittests/ADT/SmallVectorTest.cpp Sun Apr 29 05:53:29 2012
@@ -413,4 +413,17 @@
   theVector.insert(theVector.end(), L.begin(), L.end());
 }
 
+struct notassignable {
+  int &x;
+  notassignable(int &x) : x(x) {}
+};
+
+TEST_F(SmallVectorTest, NoAssignTest) {
+  int x = 0;
+  SmallVector<notassignable, 2> vec;
+  vec.push_back(notassignable(x));
+  x = 42;
+  EXPECT_EQ(42, vec.pop_back_val().x);
+}
+
 }





More information about the llvm-commits mailing list