diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1907,8 +1907,7 @@ : public iterator_facade_base< enumerator_iter, std::forward_iterator_tag, result_pair, typename std::iterator_traits>::difference_type, - typename std::iterator_traits>::pointer, - typename std::iterator_traits>::reference> { + typename std::iterator_traits>::pointer> { using result_type = result_pair; public: diff --git a/llvm/include/llvm/ADT/iterator.h b/llvm/include/llvm/ADT/iterator.h --- a/llvm/include/llvm/ADT/iterator.h +++ b/llvm/include/llvm/ADT/iterator.h @@ -296,7 +296,8 @@ return LHS.I < RHS.I; } - ReferenceT operator*() const { return *I; } + const ReferenceT operator*() const { return *I; } + ReferenceT operator*() { return *I; } }; /// An iterator type that allows iterating over the pointees via some diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/unittests/ADT/IteratorTest.cpp @@ -178,6 +178,16 @@ EXPECT_EQ((SmallVector{1, 3, 5}), Actual); } +TEST(FilterIteratorTest, Enumerate) { + auto IsOdd = [](auto N) { return N.value() % 2 == 1; }; + int A[] = {0, 1, 2, 3, 4, 5, 6}; + auto Enumerate = llvm::enumerate(A); + SmallVector Actual; + for (auto IndexedValue : make_filter_range(Enumerate, IsOdd)) + Actual.push_back(IndexedValue.value()); + EXPECT_EQ((SmallVector{1, 3, 5}), Actual); +} + TEST(FilterIteratorTest, CallableObject) { int Counter = 0; struct Callable {