Fix crash when IntervalMapOverlaps::advanceTo moves past the last overlap.

llvm-svn: 122081
This commit is contained in:
Jakob Stoklund Olesen 2010-12-17 19:18:38 +00:00
parent 4698e938b1
commit 213de04d75
2 changed files with 10 additions and 7 deletions

View 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();
}

View 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());
}