Fix crash when IntervalMapOverlaps::advanceTo moves past the last overlap.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 17 Dec 2010 19:18:38 +0000 (19:18 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 17 Dec 2010 19:18:38 +0000 (19:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122081 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 3f7a4c7d894562fb9b47da6f3560a4441b7cddd4..25be57430a6731846b3904aa9cc75b057c7f5a93 100644 (file)
@@ -2036,6 +2036,8 @@ class IntervalMapOverlaps {
   /// either meets end.
   /// Don't move the iterators if they are already overlapping.
   void advance() {
+    if (!valid())
+      return;
     for (;;) {
       // Make a.end > b.start.
       posA.advanceTo(posB.start());
@@ -2052,10 +2054,7 @@ public:
   /// IntervalMapOverlaps - Create an iterator for the overlaps of a and b.
   IntervalMapOverlaps(const MapA &a, const MapB &b)
     : posA(b.empty() ? a.end() : a.find(b.start())),
-      posB(posA.valid() ? b.find(posA.start()) : b.end()) {
-    if (valid())
-      advance();
-  }
+      posB(posA.valid() ? b.find(posA.start()) : b.end()) { advance(); }
 
   /// valid - Return true if iterator is at an overlap.
   bool valid() const {
@@ -2090,7 +2089,7 @@ public:
     // Second half-loop of advance().
     posB.advanceTo(posA.start());
     if (!posB.valid() || !Traits::stopLess(posA.stop(), posB.start()))
-      return ;
+      return;
     advance();
   }
 
@@ -2098,7 +2097,7 @@ public:
   void skipB() {
     ++posB;
     if (!posB.valid() || !Traits::stopLess(posA.stop(), posB.start()))
-        return;
+      return;
     advance();
   }
 
index e0d95a1408faffed90e2ec58ebdc572063706c58..eb1f1a4b033ee4d31752704c32a225d5ee4df0d8 100644 (file)
@@ -586,7 +586,11 @@ TEST(IntervalMapOverlapsTest, SmallMaps) {
   ASSERT_TRUE(BA.valid());
   EXPECT_EQ(3u, BA.a().start());
   EXPECT_EQ(4u, BA.b().start());
-  ++BA;
+  // advance past end.
+  BA.advanceTo(6);
+  EXPECT_FALSE(BA.valid());
+  // advance an invalid iterator.
+  BA.advanceTo(7);
   EXPECT_FALSE(BA.valid());
 }