From: David Blaikie Date: Sun, 8 Jun 2014 16:55:13 +0000 (+0000) Subject: Fix some more moving-from-moved-from objects issues in SmallVector X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=9262e52075b293289f91ccab06d04536d3d53a46 Fix some more moving-from-moved-from objects issues in SmallVector (& because it makes it easier to test, this also improves correctness/performance slightly by moving the last element in an insert operation, rather than copying it) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210429 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/SmallVector.h b/include/llvm/ADT/SmallVector.h index 29ad250010e..94bd9cc7b2c 100644 --- a/include/llvm/ADT/SmallVector.h +++ b/include/llvm/ADT/SmallVector.h @@ -516,10 +516,10 @@ public: this->grow(); I = this->begin()+EltNo; } - ::new ((void*) this->end()) T(this->back()); - this->setEnd(this->end()+1); + ::new ((void*) this->end()) T(std::move(this->back())); // Push everything else over. this->move_backward(I, this->end()-1, this->end()); + this->setEnd(this->end()+1); // If we just moved the element we're inserting, be sure to update // the reference. diff --git a/unittests/ADT/SmallVectorTest.cpp b/unittests/ADT/SmallVectorTest.cpp index cccf93b6bc5..935c761ca78 100644 --- a/unittests/ADT/SmallVectorTest.cpp +++ b/unittests/ADT/SmallVectorTest.cpp @@ -42,12 +42,15 @@ public: } Constructable(const Constructable & src) : constructed(true) { + EXPECT_TRUE(src.constructed); value = src.value; ++numConstructorCalls; } Constructable(Constructable && src) : constructed(true) { + EXPECT_TRUE(src.constructed); value = src.value; + src.value = -1; ++numConstructorCalls; } @@ -59,6 +62,7 @@ public: Constructable & operator=(const Constructable & src) { EXPECT_TRUE(constructed); + EXPECT_TRUE(src.constructed); value = src.value; ++numAssignmentCalls; return *this; @@ -66,7 +70,9 @@ public: Constructable & operator=(Constructable && src) { EXPECT_TRUE(constructed); + EXPECT_TRUE(src.constructed); value = src.value; + src.value = -1; ++numAssignmentCalls; return *this; } @@ -413,6 +419,18 @@ TYPED_TEST(SmallVectorTest, InsertTest) { this->assertValuesInOrder(this->theVector, 4u, 1, 77, 2, 3); } +// Insert a copy of a single element. +TYPED_TEST(SmallVectorTest, InsertCopy) { + SCOPED_TRACE("InsertTest"); + + this->makeSequence(this->theVector, 1, 3); + Constructable C(77); + typename TypeParam::iterator I = + this->theVector.insert(this->theVector.begin() + 1, C); + EXPECT_EQ(this->theVector.begin() + 1, I); + this->assertValuesInOrder(this->theVector, 4u, 1, 77, 2, 3); +} + // Insert repeated elements. TYPED_TEST(SmallVectorTest, InsertRepeatedTest) { SCOPED_TRACE("InsertRepeatedTest");