Fix some more moving-from-moved-from objects issues in SmallVector
[oota-llvm.git] / unittests / ADT / SmallVectorTest.cpp
index cccf93b6bc50f00de4fd213a4517ce09d9064f4c..935c761ca78ef63fd86c5e5dd266e1c1f11f2cbc 100644 (file)
@@ -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");