OSDN Git Service

Ensure moved-from container is cleared on move
authorGeorge Burgess IV <george.burgess.iv@gmail.com>
Mon, 11 Dec 2017 19:22:59 +0000 (19:22 +0000)
committerGeorge Burgess IV <george.burgess.iv@gmail.com>
Mon, 11 Dec 2017 19:22:59 +0000 (19:22 +0000)
In all cases except for this optimistic attempt to reuse memory, the
moved-from TinyPtrVector was left `empty()` at the end of this
assignment. Though using a container after it's been moved from can be a
bit sketchy, it's probably best to just be consistent here.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320408 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/TinyPtrVector.h
unittests/ADT/TinyPtrVectorTest.cpp

index 7974071..73573d6 100644 (file)
@@ -97,6 +97,7 @@ public:
       if (RHS.Val.template is<EltTy>()) {
         V->clear();
         V->push_back(RHS.front());
+        RHS.Val = (EltTy)nullptr;
         return *this;
       }
       delete V;
index 8d5fa40..cc14ccc 100644 (file)
@@ -152,6 +152,12 @@ TYPED_TEST(TinyPtrVectorTest, CopyAndMoveCtorTest) {
   TypeParam Move(std::move(Copy2));
   this->expectValues(Move, this->testArray(42));
   this->expectValues(Copy2, this->testArray(0));
+
+  TypeParam MultipleElements(this->testArray(2));
+  TypeParam SingleElement(this->testArray(1));
+  MultipleElements = std::move(SingleElement);
+  this->expectValues(MultipleElements, this->testArray(1));
+  this->expectValues(SingleElement, this->testArray(0));
 }
 
 TYPED_TEST(TinyPtrVectorTest, CopyAndMoveTest) {