Index: llvm/trunk/include/llvm/ADT/DenseSet.h =================================================================== --- llvm/trunk/include/llvm/ADT/DenseSet.h +++ llvm/trunk/include/llvm/ADT/DenseSet.h @@ -90,9 +90,12 @@ // Iterators. + class ConstIterator; + class Iterator { typename MapTy::iterator I; friend class DenseSetImpl; + friend class ConstIterator; public: typedef typename MapTy::iterator::difference_type difference_type; @@ -101,6 +104,7 @@ typedef value_type &reference; typedef std::forward_iterator_tag iterator_category; + Iterator() = default; Iterator(const typename MapTy::iterator &i) : I(i) {} ValueT &operator*() { return I->getFirst(); } @@ -110,13 +114,14 @@ Iterator& operator++() { ++I; return *this; } Iterator operator++(int) { auto T = *this; ++I; return T; } - bool operator==(const Iterator& X) const { return I == X.I; } - bool operator!=(const Iterator& X) const { return I != X.I; } + bool operator==(const ConstIterator& X) const { return I == X.I; } + bool operator!=(const ConstIterator& X) const { return I != X.I; } }; class ConstIterator { typename MapTy::const_iterator I; friend class DenseSet; + friend class Iterator; public: typedef typename MapTy::const_iterator::difference_type difference_type; @@ -125,6 +130,10 @@ typedef value_type &reference; typedef std::forward_iterator_tag iterator_category; + ConstIterator(const Iterator &B) : I(B.I) {} + + ConstIterator() = default; + ConstIterator(const typename MapTy::const_iterator &i) : I(i) {} const ValueT &operator*() const { return I->getFirst(); } Index: llvm/trunk/unittests/ADT/DenseSetTest.cpp =================================================================== --- llvm/trunk/unittests/ADT/DenseSetTest.cpp +++ llvm/trunk/unittests/ADT/DenseSetTest.cpp @@ -73,6 +73,15 @@ EXPECT_EQ(0u, set.count(3)); } +TYPED_TEST(DenseSetTest, ConstIteratorComparison){ + TypeParam set({1}); + const TypeParam &cset = set; + EXPECT_EQ(set.begin(), cset.begin()); + EXPECT_EQ(set.end(), cset.end()); + EXPECT_NE(set.end(), cset.begin()); + EXPECT_NE(set.begin(), cset.end()); +} + TYPED_TEST(DenseSetTest, EmptyInitializerList) { TypeParam set({}); EXPECT_EQ(0u, set.size());