[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