diff --git a/libcxx/include/__iterator/reverse_iterator.h b/libcxx/include/__iterator/reverse_iterator.h --- a/libcxx/include/__iterator/reverse_iterator.h +++ b/libcxx/include/__iterator/reverse_iterator.h @@ -86,7 +86,7 @@ template ::value && is_convertible<_Up const&, _Iter>::value && - is_assignable<_Up const&, _Iter>::value + is_assignable<_Iter, _Up const&>::value > > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator=(const reverse_iterator<_Up>& __u) { @@ -111,7 +111,7 @@ template ::value && is_convertible<_Up const&, _Iter>::value && - is_assignable<_Up const&, _Iter>::value + is_assignable<_Iter, _Up const&>::value > > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator=(const reverse_iterator<_Up>& __u) { diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.cons/assign.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.cons/assign.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.cons/assign.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.cons/assign.pass.cpp @@ -39,8 +39,36 @@ return true; } +struct from_iter : bidirectional_iterator { + from_iter(char *p) : bidirectional_iterator(p) {} +}; + +typedef bidirectional_iterator const_bidir_iter; + +struct to_iter : const_bidir_iter { + to_iter() {} + to_iter(const from_iter &fi) : const_bidir_iter(fi) { + // Ensure that the conversion constructor is not called + assert(false); + } + to_iter& operator=(const from_iter &fi) { + static_cast(*this) = fi; + return *this; + } +}; + +void test_assign_convertible() { + char c; + from_iter fi(&c); + to_iter ti; + const std::reverse_iterator rev_fi(fi); + std::reverse_iterator rev_ti; + rev_ti = rev_fi; +} + int main(int, char**) { tests(); + test_assign_convertible(); #if TEST_STD_VER > 14 static_assert(tests(), ""); #endif