Index: include/llvm/ADT/iterator.h =================================================================== --- include/llvm/ADT/iterator.h +++ include/llvm/ADT/iterator.h @@ -155,7 +155,14 @@ typename T = typename std::iterator_traits::value_type, typename DifferenceTypeT = typename std::iterator_traits::difference_type, - typename PointerT = T *, typename ReferenceT = T &, + typename PointerT = typename std::conditional< + std::is_same::value_type>::value, + typename std::iterator_traits::pointer, T *>::type, + typename ReferenceT = typename std::conditional< + std::is_same::value_type>::value, + typename std::iterator_traits::reference, T &>::type, // Don't provide these, they are mostly to act as aliases below. typename WrappedTraitsT = std::iterator_traits> class iterator_adaptor_base Index: unittests/Support/IteratorTest.cpp =================================================================== --- unittests/Support/IteratorTest.cpp +++ unittests/Support/IteratorTest.cpp @@ -98,4 +98,15 @@ EXPECT_EQ(End, I); } +TEST(IteratorAdaptorBaseTest, ForwardTypedefs) { + struct WeirdIter + : std::iterator {}; + struct AdaptedIter : iterator_adaptor_base {}; + static_assert(std::is_same::value, ""); + static_assert(std::is_same::value, + ""); + static_assert(std::is_same::value, ""); + static_assert(std::is_same::value, ""); +} + } // anonymous namespace