From: Jakob Stoklund Olesen Date: Fri, 17 Dec 2010 22:07:51 +0000 (+0000) Subject: It is allowed to call IntervalMap::const_iterator::advanceTo() with a key that X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5049ee5b11fe55e5a553b5388406aab874717672;p=oota-llvm.git It is allowed to call IntervalMap::const_iterator::advanceTo() with a key that 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 --- diff --git a/include/llvm/ADT/IntervalMap.h b/include/llvm/ADT/IntervalMap.h index 25be57430a6..c13846dce70 100644 --- a/include/llvm/ADT/IntervalMap.h +++ b/include/llvm/ADT/IntervalMap.h @@ -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 diff --git a/unittests/ADT/IntervalMapTest.cpp b/unittests/ADT/IntervalMapTest.cpp index eb1f1a4b033..fad73183876 100644 --- a/unittests/ADT/IntervalMapTest.cpp +++ b/unittests/ADT/IntervalMapTest.cpp @@ -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());