SmallVector: return a valid iterator for the rare case of inserting an empty range...
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 17 Jun 2012 11:52:22 +0000 (11:52 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 17 Jun 2012 11:52:22 +0000 (11:52 +0000)
Patch by Johannes Schaub!

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

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

index 973e0284ab0694800473a1eaf39222d9afafd947..02eee622900a8d1112eadee3426405e8f83e4c43 100644 (file)
@@ -542,7 +542,7 @@ public:
   iterator insert(iterator I, size_type NumToInsert, const T &Elt) {
     if (I == this->end()) {  // Important special case for empty vector.
       append(NumToInsert, Elt);
-      return this->end()-1;
+      return NumToInsert == 0 ? this->end() : this->end()-1;
     }
 
     // Convert iterator to elt# to avoid invalidating iterator when we reserve()
@@ -590,7 +590,7 @@ public:
   iterator insert(iterator I, ItTy From, ItTy To) {
     if (I == this->end()) {  // Important special case for empty vector.
       append(From, To);
-      return this->end()-1;
+      return From == To ? this->end() : this->end()-1;
     }
 
     size_t NumToInsert = std::distance(From, To);
index c2542d614e2a67776e53c7ce5acc91e79fa7eaa4..8f6d2f4ac1509054489b8222dc70c8cf887b0516 100644 (file)
@@ -353,6 +353,9 @@ TEST_F(SmallVectorTest, InsertRepeatedTest) {
   makeSequence(theVector, 10, 15);
   theVector.insert(theVector.begin() + 1, 2, Constructable(16));
   assertValuesInOrder(theVector, 8u, 10, 16, 16, 11, 12, 13, 14, 15);
+
+  EXPECT_EQ(theVector.end(),
+            theVector.insert(theVector.end(), 0, Constructable(42)));
 }
 
 // Insert range.
@@ -362,6 +365,10 @@ TEST_F(SmallVectorTest, InsertRangeTest) {
   makeSequence(theVector, 1, 3);
   theVector.insert(theVector.begin() + 1, 3, Constructable(77));
   assertValuesInOrder(theVector, 6u, 1, 77, 77, 77, 2, 3);
+
+  EXPECT_EQ(theVector.end(), theVector.insert(theVector.end(),
+                                              theVector.begin(),
+                                              theVector.begin()));
 }
 
 // Comparison tests.