SmallVector: Don't rely on having an assignment operator around in push_back for...
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 29 Apr 2012 10:53:29 +0000 (10:53 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 29 Apr 2012 10:53:29 +0000 (10:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155791 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/SmallVector.h
unittests/ADT/SmallVectorTest.cpp

index 0d9d0d12e868e7898ed99cbe8395daa0f5211081..8b75ff56a3c6541b58b3a827915a84f8805bd400 100644 (file)
@@ -252,7 +252,7 @@ public:
   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;
     }
index d5bfe768003af3e7cabc40639e5120598b4d1611..c2542d614e2a67776e53c7ce5acc91e79fa7eaa4 100644 (file)
@@ -413,4 +413,17 @@ TEST_F(SmallVectorTest, IteratorTest) {
   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);
+}
+
 }