diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-12-17 19:18:38 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-12-17 19:18:38 +0000 |
commit | 4aec85ae01188f87e45e5e91baab4f303cbcd336 (patch) | |
tree | 70c1d2c1852f26f6476fd10f789c98122988de6f | |
parent | a3dbd3a2444f2531763ba05b64a30932542a631f (diff) | |
download | external_llvm-4aec85ae01188f87e45e5e91baab4f303cbcd336.tar.gz external_llvm-4aec85ae01188f87e45e5e91baab4f303cbcd336.tar.bz2 external_llvm-4aec85ae01188f87e45e5e91baab4f303cbcd336.zip |
Fix crash when IntervalMapOverlaps::advanceTo moves past the last overlap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122081 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/ADT/IntervalMap.h | 11 | ||||
-rw-r--r-- | unittests/ADT/IntervalMapTest.cpp | 6 |
2 files changed, 10 insertions, 7 deletions
diff --git a/include/llvm/ADT/IntervalMap.h b/include/llvm/ADT/IntervalMap.h index 3f7a4c7d89..25be57430a 100644 --- a/include/llvm/ADT/IntervalMap.h +++ b/include/llvm/ADT/IntervalMap.h @@ -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(); } diff --git a/unittests/ADT/IntervalMapTest.cpp b/unittests/ADT/IntervalMapTest.cpp index e0d95a1408..eb1f1a4b03 100644 --- a/unittests/ADT/IntervalMapTest.cpp +++ b/unittests/ADT/IntervalMapTest.cpp @@ -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()); } |