diff --git a/include/llvm/ADT/FlatArrayMap.h b/include/llvm/ADT/FlatArrayMap.h index f794c9c22f2..b414cde7a16 100644 --- a/include/llvm/ADT/FlatArrayMap.h +++ b/include/llvm/ADT/FlatArrayMap.h @@ -162,10 +162,10 @@ namespace llvm { } iterator end() { - return iterator(Array + MaxArraySize); + return iterator(Array + NumElements); } const_iterator end() const { - return const_iterator(Array + MaxArraySize); + return const_iterator(Array + NumElements); } // Modifiers diff --git a/unittests/ADT/SmallMapTest.cpp b/unittests/ADT/SmallMapTest.cpp index b2079243fd5..10ba0ef2bfb 100644 --- a/unittests/ADT/SmallMapTest.cpp +++ b/unittests/ADT/SmallMapTest.cpp @@ -144,4 +144,19 @@ TEST(SmallMapTest, GeneralTest) { (i->first == &buf[1] && i->second == 1) || (i->first == &buf[2] && i->second == 2)); } + + // Check that iteration only visits elements that actually exist. + SmallMap d; + d[0] = 2; + d[1] = 3; + unsigned counts[2] = { 0, 0 }; + for (SmallMap::iterator I = d.begin(), E = d.end(); I != E; + ++I) { + EXPECT_TRUE(I->first == 0 || I->first == 1); + EXPECT_TRUE(I->second == 2 || I->second == 3); + EXPECT_EQ(I->second, I->first + 2); + ++counts[I->first]; + } + EXPECT_EQ(counts[0], 1); + EXPECT_EQ(counts[1], 1); }