Index: include/llvm/ADT/ilist_iterator.h =================================================================== --- include/llvm/ADT/ilist_iterator.h +++ include/llvm/ADT/ilist_iterator.h @@ -86,10 +86,10 @@ ilist_iterator() : NodePtr(nullptr) {} // This is templated so that we can allow constructing a const iterator from - // a nonconst iterator... - template + // a nonconst iterator and switch between reverse/forward iterators... + template ilist_iterator( - const ilist_iterator &RHS, + const ilist_iterator &RHS, typename std::enable_if::type = nullptr) : NodePtr(RHS.NodePtr) {} Index: unittests/ADT/SimpleIListTest.cpp =================================================================== --- unittests/ADT/SimpleIListTest.cpp +++ unittests/ADT/SimpleIListTest.cpp @@ -193,6 +193,20 @@ EXPECT_EQ(A.getReverseIterator(), ReverseIter); ++ReverseIter; EXPECT_EQ(L.rend(), ReverseIter); + + // Check conversion between reverse/forward iterators. + typedef simple_ilist::reverse_iterator reverse_iterator; + typedef simple_ilist::iterator iterator; + EXPECT_EQ(reverse_iterator(L.begin()), std::prev(L.rend())); + EXPECT_EQ(reverse_iterator(std::prev(L.end())), L.rbegin()); + EXPECT_EQ(iterator(L.rbegin()), std::prev(L.end())); + EXPECT_EQ(iterator(std::prev(L.rend())), L.begin()); + for (Node &N : L) { + EXPECT_EQ(iterator(reverse_iterator(N.getIterator())), + N.getIterator()); + EXPECT_EQ(reverse_iterator(iterator(N.getReverseIterator())), + N.getReverseIterator()); + } } TEST(SimpleIListTest, eraseAndDispose) {