Index: libcxx/docs/Status/Cxx20Issues.csv =================================================================== --- libcxx/docs/Status/Cxx20Issues.csv +++ libcxx/docs/Status/Cxx20Issues.csv @@ -291,7 +291,7 @@ "`3387 `__","|sect|\ [range.reverse.view] ``reverse_view``\ unintentionally requires ``range``\ ","Prague","","","|ranges|" "`3388 `__","``view``\ iterator types have ill-formed ``<=>``\ operators","Prague","","","|ranges|" "`3389 `__","A move-only iterator still does not have a ``counted_iterator``\ ","Prague","","","|ranges|" -"`3390 `__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","Prague","","","|ranges|" +"`3390 `__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","Prague","|Complete|","14.0","|ranges|" "`3393 `__","Missing/incorrect feature test macro for coroutines","Prague","|Complete|","14.0" "`3395 `__","Definition for three-way comparison needs to be updated (US 152)","Prague","","","|spaceship|" "`3396 `__","Clarify point of reference for ``source_location::current()``\ (DE 169)","Prague","","" Index: libcxx/include/__iterator/move_iterator.h =================================================================== --- libcxx/include/__iterator/move_iterator.h +++ libcxx/include/__iterator/move_iterator.h @@ -12,6 +12,7 @@ #include <__config> #include <__iterator/iterator_traits.h> +#include <__utility/move.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -53,7 +54,7 @@ move_iterator() : __current_() {} _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX14 - explicit move_iterator(_Iter __i) : __current_(__i) {} + explicit move_iterator(_Iter __i) : __current_(_VSTD::move(__i)) {} template ::value && is_convertible::value @@ -176,7 +177,7 @@ move_iterator<_Iter> make_move_iterator(_Iter __i) { - return move_iterator<_Iter>(__i); + return move_iterator<_Iter>(_VSTD::move(__i)); } _LIBCPP_END_NAMESPACE_STD Index: libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp =================================================================== --- libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp +++ libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp @@ -16,33 +16,73 @@ #include #include +#include #include "test_macros.h" #include "test_iterators.h" template -void -test(It i) +TEST_CONSTEXPR_CXX17 bool test() { - std::move_iterator r(i); - assert(r.base() == i); + static_assert( std::is_constructible, const It&>::value, ""); + static_assert( std::is_constructible, It&&>::value, ""); + static_assert(!std::is_convertible>::value, ""); + static_assert(!std::is_convertible>::value, ""); + + char s[] = "123"; + { + It it = It(s); + std::move_iterator r(it); + assert(base(r.base()) == s); + } + { + It it = It(s); + std::move_iterator r(std::move(it)); + assert(base(r.base()) == s); + } + return true; +} + +template +TEST_CONSTEXPR_CXX17 bool test_moveonly() +{ + static_assert(!std::is_constructible, const It&>::value, ""); + static_assert( std::is_constructible, It&&>::value, ""); + static_assert(!std::is_convertible>::value, ""); + static_assert(!std::is_convertible>::value, ""); + + char s[] = "123"; + { + It it = It(s); + std::move_iterator r(std::move(it)); + assert(base(r.base()) == s); + } + return true; } int main(int, char**) { - char s[] = "123"; - test(cpp17_input_iterator(s)); - test(forward_iterator(s)); - test(bidirectional_iterator(s)); - test(random_access_iterator(s)); - test(s); + test >(); + test >(); + test >(); + test >(); + test(); + test(); #if TEST_STD_VER > 14 - { - constexpr const char *p = "123456789"; - constexpr std::move_iterator it(p); - static_assert(it.base() == p); - } + static_assert(test>()); + static_assert(test>()); + static_assert(test>()); + static_assert(test>()); + static_assert(test()); + static_assert(test()); +#endif + +#if TEST_STD_VER > 17 + test>(); + test_moveonly>(); + static_assert(test>()); + static_assert(test_moveonly>()); #endif return 0;