OSDN Git Service

It is allowed to call IntervalMap::const_iterator::advanceTo() with a key that
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 17 Dec 2010 22:07:51 +0000 (22:07 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 17 Dec 2010 22:07:51 +0000 (22:07 +0000)
moves the iterator to end(), and it is valid to call it on end().

That means it is valid to call advanceTo() with any monotonic key sequence.

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

include/llvm/ADT/IntervalMap.h
unittests/ADT/IntervalMapTest.cpp

index 25be574..c13846d 100644 (file)
@@ -1411,6 +1411,8 @@ public:
   /// The search is started from the current position, and no earlier positions
   /// can be found. This is much faster than find() for small moves.
   void advanceTo(KeyT x) {
+    if (!valid())
+      return;
     if (branched())
       treeAdvanceTo(x);
     else
index eb1f1a4..fad7318 100644 (file)
@@ -247,6 +247,12 @@ TEST(IntervalMapTest, RootMultiCoalescing) {
   EXPECT_EQ(140u, I.start());
   EXPECT_EQ(150u, I.stop());
 
+  I.advanceTo(200);
+  EXPECT_FALSE(I.valid());
+
+  I.advanceTo(300);
+  EXPECT_FALSE(I.valid());
+
   // Coalesce left with followers.
   // [100;110] [120;130] [140;150] [160;170]
   map.insert(111, 115, 1);
@@ -520,6 +526,14 @@ TEST(IntervalMapTest, Branched2) {
   EXPECT_EQ(2000u, I.start());
   EXPECT_EQ(2005u, I.stop());
 
+  // advanceTo beyond end()
+  I.advanceTo(20000);
+  EXPECT_FALSE(I.valid());
+
+  // end().advanceTo() is valid as long as x > map.stop()
+  I.advanceTo(30000);
+  EXPECT_FALSE(I.valid());
+
   // Test clear() on branched map.
   map.clear();
   EXPECT_TRUE(map.empty());