[libcxx-commits] [libcxx] d004aa7 - [libc++][pstl] Implement LWG3552: Parallel specialized memory algorithms should require forward iterators (#228462)

via libcxx-commits libcxx-commits at lists.llvm.org
Wed Oct 7 08:55:00 PDT 2026


Author: Michael G. Kazakov
Date: 2026-10-07T15:54:45Z
New Revision: d004aa76f5fab67fc789bbe7d2491345c218bab6

URL: https://github.com/llvm/llvm-project/commit/d004aa76f5fab67fc789bbe7d2491345c218bab6
DIFF: https://github.com/llvm/llvm-project/commit/d004aa76f5fab67fc789bbe7d2491345c218bab6.diff

LOG: [libc++][pstl] Implement LWG3552: Parallel specialized memory algorithms should require forward iterators (#228462)

This PR changes these parallel functions to no longer support input
iterators and instead to require at least forward iterators, according
to https://cplusplus.github.io/LWG/issue3552:
- `std::uninitialized_copy`
- `std::uninitialized_copy_n`
- `std::uninitialized_move`
- `std::uninitialized_move_n`

Fixes #104357

Added: 
    

Modified: 
    libcxx/docs/Status/Cxx23Issues.csv
    libcxx/include/__memory/pstl.h
    libcxx/include/__pstl/backend_fwd.h
    libcxx/include/__pstl/backends/default.h
    libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
    libcxx/test/libcxx/algorithms/pstl.iterator-requirements.verify.cpp
    libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy.pass.cpp
    libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy_n.pass.cpp
    libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move.pass.cpp
    libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move_n.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv
index 68420a74f4878..58ea67732f808 100644
--- a/libcxx/docs/Status/Cxx23Issues.csv
+++ b/libcxx/docs/Status/Cxx23Issues.csv
@@ -93,7 +93,7 @@
 "`LWG3548 <https://wg21.link/LWG3548>`__","``shared_ptr`` construction from ``unique_ptr`` should move (not copy) the deleter","2021-06 (Virtual)","|Complete|","15","`#104354 <https://github.com/llvm/llvm-project/issues/104354>`__",""
 "`LWG3549 <https://wg21.link/LWG3549>`__","``view_interface`` is overspecified to derive from ``view_base``","2021-06 (Virtual)","|Complete|","14","`#104355 <https://github.com/llvm/llvm-project/issues/104355>`__",""
 "`LWG3551 <https://wg21.link/LWG3551>`__","``borrowed_{iterator,subrange}_t`` are overspecified","2021-06 (Virtual)","|Nothing To Do|","","`#104356 <https://github.com/llvm/llvm-project/issues/104356>`__",""
-"`LWG3552 <https://wg21.link/LWG3552>`__","Parallel specialized memory algorithms should require forward iterators","2021-06 (Virtual)","","","`#104357 <https://github.com/llvm/llvm-project/issues/104357>`__",""
+"`LWG3552 <https://wg21.link/LWG3552>`__","Parallel specialized memory algorithms should require forward iterators","2021-06 (Virtual)","|Complete|","24","`#104357 <https://github.com/llvm/llvm-project/issues/104357>`__",""
 "`LWG3553 <https://wg21.link/LWG3553>`__","Useless constraint in ``split_view::outer-iterator::value_type::begin()``","2021-06 (Virtual)","","","`#104358 <https://github.com/llvm/llvm-project/issues/104358>`__",""
 "`LWG3555 <https://wg21.link/LWG3555>`__","``{transform,elements}_view::iterator::iterator_concept`` should consider const-qualification of the underlying range","2021-06 (Virtual)","","","`#104359 <https://github.com/llvm/llvm-project/issues/104359>`__",""
 "","","","","","",""

diff  --git a/libcxx/include/__memory/pstl.h b/libcxx/include/__memory/pstl.h
index 6c1fd6f10ee23..7dbc9fdcb51d4 100644
--- a/libcxx/include/__memory/pstl.h
+++ b/libcxx/include/__memory/pstl.h
@@ -84,29 +84,29 @@ uninitialized_default_construct_n(_ExecutionPolicy&& __policy, _ForwardIterator
 }
 
 template <class _ExecutionPolicy,
-          class _InputIterator,
-          class _ForwardIterator,
+          class _ForwardIterator1,
+          class _ForwardIterator2,
           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
-_LIBCPP_HIDE_FROM_ABI _ForwardIterator uninitialized_copy(
-    _ExecutionPolicy&& __policy, _InputIterator __first, _InputIterator __last, _ForwardIterator __result) {
-  _LIBCPP_REQUIRE_CPP17_INPUT_ITERATOR(_InputIterator, "uninitialized_copy requires InputIterators");
-  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "uninitialized_copy requires ForwardIterators");
+_LIBCPP_HIDE_FROM_ABI _ForwardIterator2 uninitialized_copy(
+    _ExecutionPolicy&& __policy, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result) {
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "uninitialized_copy requires ForwardIterators");
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "uninitialized_copy requires ForwardIterators");
   using _Implementation = __pstl::__dispatch<__pstl::__uninitialized_copy, __pstl::__current_configuration, _RawPolicy>;
   return __pstl::__handle_exception<_Implementation>(
       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
 }
 
 template <class _ExecutionPolicy,
-          class _InputIterator,
+          class _ForwardIterator1,
           class _Size,
-          class _ForwardIterator,
+          class _ForwardIterator2,
           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
-_LIBCPP_HIDE_FROM_ABI _ForwardIterator
-uninitialized_copy_n(_ExecutionPolicy&& __policy, _InputIterator __first, _Size __n, _ForwardIterator __result) {
-  _LIBCPP_REQUIRE_CPP17_INPUT_ITERATOR(_InputIterator, "uninitialized_copy_n requires InputIterators");
-  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "uninitialized_copy_n requires ForwardIterators");
+_LIBCPP_HIDE_FROM_ABI _ForwardIterator2
+uninitialized_copy_n(_ExecutionPolicy&& __policy, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result) {
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "uninitialized_copy_n requires ForwardIterators");
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "uninitialized_copy_n requires ForwardIterators");
   using _Implementation =
       __pstl::__dispatch<__pstl::__uninitialized_copy_n, __pstl::__current_configuration, _RawPolicy>;
   return __pstl::__handle_exception<_Implementation>(
@@ -168,29 +168,29 @@ uninitialized_fill_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Siz
 }
 
 template <class _ExecutionPolicy,
-          class _InputIterator,
-          class _ForwardIterator,
+          class _ForwardIterator1,
+          class _ForwardIterator2,
           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
-_LIBCPP_HIDE_FROM_ABI _ForwardIterator uninitialized_move(
-    _ExecutionPolicy&& __policy, _InputIterator __first, _InputIterator __last, _ForwardIterator __result) {
-  _LIBCPP_REQUIRE_CPP17_INPUT_ITERATOR(_InputIterator, "uninitialized_move requires InputIterators");
-  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "uninitialized_move requires ForwardIterators");
+_LIBCPP_HIDE_FROM_ABI _ForwardIterator2 uninitialized_move(
+    _ExecutionPolicy&& __policy, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result) {
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "uninitialized_move requires ForwardIterators");
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "uninitialized_move requires ForwardIterators");
   using _Implementation = __pstl::__dispatch<__pstl::__uninitialized_move, __pstl::__current_configuration, _RawPolicy>;
   return __pstl::__handle_exception<_Implementation>(
       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
 }
 
 template <class _ExecutionPolicy,
-          class _InputIterator,
+          class _ForwardIterator1,
           class _Size,
-          class _ForwardIterator,
+          class _ForwardIterator2,
           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
-_LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator>
-uninitialized_move_n(_ExecutionPolicy&& __policy, _InputIterator __first, _Size __n, _ForwardIterator __result) {
-  _LIBCPP_REQUIRE_CPP17_INPUT_ITERATOR(_InputIterator, "uninitialized_move_n requires InputIterators");
-  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "uninitialized_move_n requires ForwardIterators");
+_LIBCPP_HIDE_FROM_ABI pair<_ForwardIterator1, _ForwardIterator2>
+uninitialized_move_n(_ExecutionPolicy&& __policy, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result) {
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "uninitialized_move_n requires ForwardIterators");
+  _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "uninitialized_move_n requires ForwardIterators");
   using _Implementation =
       __pstl::__dispatch<__pstl::__uninitialized_move_n, __pstl::__current_configuration, _RawPolicy>;
   return __pstl::__handle_exception<_Implementation>(

diff  --git a/libcxx/include/__pstl/backend_fwd.h b/libcxx/include/__pstl/backend_fwd.h
index a5b83f977b709..2665209887944 100644
--- a/libcxx/include/__pstl/backend_fwd.h
+++ b/libcxx/include/__pstl/backend_fwd.h
@@ -439,16 +439,16 @@ struct __destroy_n;
 
 template <class _Backend, class _ExecutionPolicy>
 struct __uninitialized_copy;
-// template <class _Policy, class _InputIterator, class _ForwardIterator>
-// optional<_ForwardIterator>
-// operator()(_Policy&& __policy, _InputIterator __first, _InputIterator __last, _ForwardIterator __result) const
+// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2>
+// optional<_ForwardIterator2>
+// operator()(_Policy&& __policy, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result) const
 // noexcept;
 
 template <class _Backend, class _ExecutionPolicy>
 struct __uninitialized_copy_n;
-// template <class _Policy, class _InputIterator, class _Size, class _ForwardIterator>
-// optional<_ForwardIterator>
-// operator()(_Policy&& __policy, _InputIterator __first, _Size __n, _ForwardIterator __result) const
+// template <class _Policy, class _ForwardIterator1, class _Size, class _ForwardIterator2>
+// optional<_ForwardIterator2>
+// operator()(_Policy&& __policy, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result) const
 // noexcept;
 
 template <class _Backend, class _ExecutionPolicy>
@@ -465,16 +465,16 @@ struct __uninitialized_default_construct_n;
 
 template <class _Backend, class _ExecutionPolicy>
 struct __uninitialized_move;
-// template <class _Policy, class _InputIterator, class _ForwardIterator>
-// optional<_ForwardIterator>
-// operator()(_Policy&& __policy, _InputIterator __first, _InputIterator __last, _ForwardIterator __result) const
+// template <class _Policy, class _ForwardIterator1, class _ForwardIterator2>
+// optional<_ForwardIterator2>
+// operator()(_Policy&& __policy, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result) const
 // noexcept;
 
 template <class _Backend, class _ExecutionPolicy>
 struct __uninitialized_move_n;
-// template <class _Policy, class _InputIterator, class _Size, class _ForwardIterator>
-// optional<pair<_InputIterator, _ForwardIterator>>
-// operator()(_Policy&& __policy, _InputIterator __first, _Size __n, _ForwardIterator __result) const
+// template <class _Policy, class _ForwardIterator1, class _Size, class _ForwardIterator2>
+// optional<pair<_ForwardIterator1, _ForwardIterator2>>
+// operator()(_Policy&& __policy, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result) const
 // noexcept;
 
 template <class _Backend, class _ExecutionPolicy>

diff  --git a/libcxx/include/__pstl/backends/default.h b/libcxx/include/__pstl/backends/default.h
index 648c2e10d033f..61f5b0c342baa 100644
--- a/libcxx/include/__pstl/backends/default.h
+++ b/libcxx/include/__pstl/backends/default.h
@@ -925,13 +925,13 @@ struct __adjacent_
diff erence<__default_backend_tag, _ExecutionPolicy> {
 
 template <class _ExecutionPolicy>
 struct __uninitialized_copy_n<__default_backend_tag, _ExecutionPolicy> {
-  template <class _Policy, class _InputIterator, class _Size, class _ForwardIterator>
-  optional<_ForwardIterator>
-  operator()(_Policy&& __policy, _InputIterator __first, _Size __n, _ForwardIterator __result) const noexcept {
-    if constexpr (__has_random_access_iterator_category_or_concept<_InputIterator>::value &&
-                  __has_random_access_iterator_category_or_concept<_ForwardIterator>::value) {
+  template <class _Policy, class _ForwardIterator1, class _Size, class _ForwardIterator2>
+  optional<_ForwardIterator2>
+  operator()(_Policy&& __policy, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result) const noexcept {
+    if constexpr (__has_random_access_iterator_category_or_concept<_ForwardIterator1>::value &&
+                  __has_random_access_iterator_category_or_concept<_ForwardIterator2>::value) {
       using _UninitializedCopy = __dispatch<__uninitialized_copy, __current_configuration, _ExecutionPolicy>;
-      _InputIterator __last    = __first + __n;
+      _ForwardIterator1 __last = __first + __n;
       return _UninitializedCopy()(__policy, std::move(__first), std::move(__last), std::move(__result));
     } else {
       return std::uninitialized_copy_n(std::move(__first), __n, std::move(__result));
@@ -945,13 +945,13 @@ struct __uninitialized_copy_n<__default_backend_tag, _ExecutionPolicy> {
 
 template <class _ExecutionPolicy>
 struct __uninitialized_move_n<__default_backend_tag, _ExecutionPolicy> {
-  template <class _Policy, class _InputIterator, class _Size, class _ForwardIterator>
-  optional<pair<_InputIterator, _ForwardIterator>>
-  operator()(_Policy&& __policy, _InputIterator __first, _Size __n, _ForwardIterator __result) const noexcept {
-    if constexpr (__has_random_access_iterator_category_or_concept<_InputIterator>::value &&
-                  __has_random_access_iterator_category_or_concept<_ForwardIterator>::value) {
+  template <class _Policy, class _ForwardIterator1, class _Size, class _ForwardIterator2>
+  optional<pair<_ForwardIterator1, _ForwardIterator2>>
+  operator()(_Policy&& __policy, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result) const noexcept {
+    if constexpr (__has_random_access_iterator_category_or_concept<_ForwardIterator1>::value &&
+                  __has_random_access_iterator_category_or_concept<_ForwardIterator2>::value) {
       using _UninitializedMove = __dispatch<__uninitialized_move, __current_configuration, _ExecutionPolicy>;
-      _InputIterator __last    = __first + __n;
+      _ForwardIterator1 __last = __first + __n;
       auto __res               = _UninitializedMove()(__policy, std::move(__first), __last, std::move(__result));
       if (!__res)
         return nullopt; // Failed to run the parallel algorithm, propagate the failure

diff  --git a/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h b/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
index 861868c6ae6fa..c68e22a76758c 100644
--- a/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
+++ b/libcxx/include/__pstl/cpu_algos/uninitialized_algorithms.h
@@ -36,17 +36,17 @@ namespace __pstl {
 
 template <class _Backend, class _RawExecutionPolicy>
 struct __cpu_parallel_uninitialized_copy {
-  template <class _Policy, class _InputIterator, class _ForwardIterator>
-  _LIBCPP_HIDE_FROM_ABI optional<_ForwardIterator>
-  operator()(_Policy&&, _InputIterator __first, _InputIterator __last, _ForwardIterator __result) const noexcept {
+  template <class _Policy, class _ForwardIterator1, class _ForwardIterator2>
+  _LIBCPP_HIDE_FROM_ABI optional<_ForwardIterator2> operator()(
+      _Policy&&, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result) const noexcept {
     if constexpr (__is_parallel_execution_policy_v<_RawExecutionPolicy> &&
-                  __has_random_access_iterator_category_or_concept<_InputIterator>::value &&
-                  __has_random_access_iterator_category_or_concept<_ForwardIterator>::value) {
+                  __has_random_access_iterator_category_or_concept<_ForwardIterator1>::value &&
+                  __has_random_access_iterator_category_or_concept<_ForwardIterator2>::value) {
       auto __res = __pstl::__parallel_for_each_iter_pair<_Backend>(
           __first,
           __last,
           __result,
-          [](_InputIterator __brick_first, _InputIterator __brick_last, _ForwardIterator __brick_result) {
+          [](_ForwardIterator1 __brick_first, _ForwardIterator1 __brick_last, _ForwardIterator2 __brick_result) {
             std::uninitialized_copy(std::move(__brick_first), std::move(__brick_last), std::move(__brick_result));
           });
       if (!__res) {
@@ -62,17 +62,17 @@ struct __cpu_parallel_uninitialized_copy {
 
 template <class _Backend, class _RawExecutionPolicy>
 struct __cpu_parallel_uninitialized_move {
-  template <class _Policy, class _InputIterator, class _ForwardIterator>
-  _LIBCPP_HIDE_FROM_ABI optional<_ForwardIterator>
-  operator()(_Policy&&, _InputIterator __first, _InputIterator __last, _ForwardIterator __result) const noexcept {
+  template <class _Policy, class _ForwardIterator1, class _ForwardIterator2>
+  _LIBCPP_HIDE_FROM_ABI optional<_ForwardIterator2> operator()(
+      _Policy&&, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result) const noexcept {
     if constexpr (__is_parallel_execution_policy_v<_RawExecutionPolicy> &&
-                  __has_random_access_iterator_category_or_concept<_InputIterator>::value &&
-                  __has_random_access_iterator_category_or_concept<_ForwardIterator>::value) {
+                  __has_random_access_iterator_category_or_concept<_ForwardIterator1>::value &&
+                  __has_random_access_iterator_category_or_concept<_ForwardIterator2>::value) {
       auto __res = __pstl::__parallel_for_each_iter_pair<_Backend>(
           __first,
           __last,
           __result,
-          [](_InputIterator __brick_first, _InputIterator __brick_last, _ForwardIterator __brick_result) {
+          [](_ForwardIterator1 __brick_first, _ForwardIterator1 __brick_last, _ForwardIterator2 __brick_result) {
             std::uninitialized_move(std::move(__brick_first), std::move(__brick_last), std::move(__brick_result));
           });
       if (!__res) {

diff  --git a/libcxx/test/libcxx/algorithms/pstl.iterator-requirements.verify.cpp b/libcxx/test/libcxx/algorithms/pstl.iterator-requirements.verify.cpp
index a5ce8b80c381e..d99869ce73f10 100644
--- a/libcxx/test/libcxx/algorithms/pstl.iterator-requirements.verify.cpp
+++ b/libcxx/test/libcxx/algorithms/pstl.iterator-requirements.verify.cpp
@@ -32,7 +32,6 @@
 
 #include "test_iterators.h"
 
-using non_input_iterator         = cpp17_output_iterator<int*>;
 using non_forward_iterator       = cpp17_input_iterator<int*>;
 using non_bidirectional_iterator = forward_iterator<int*>;
 using non_randomaccess_iterator  = bidirectional_iterator<int*>;
@@ -40,8 +39,7 @@ struct non_output_iterator : forward_iterator<int*> {
   constexpr int const& operator*() const; // prevent it from being an output iterator
 };
 
-void f(non_input_iterator non_input,
-       non_forward_iterator non_fwd,
+void f(non_forward_iterator non_fwd,
        non_output_iterator non_output,
        non_bidirectional_iterator non_bidir,
        non_randomaccess_iterator non_random,
@@ -348,17 +346,17 @@ void f(non_input_iterator non_input,
 
   {
     std::uninitialized_copy(
-        pol, non_input, non_input, it);            // expected-error@*:* {{static assertion failed: uninitialized_copy}}
+        pol, non_fwd, non_fwd, it);                // expected-error@*:* {{static assertion failed: uninitialized_copy}}
     std::uninitialized_copy(pol, it, it, non_fwd); // expected-error@*:* {{static assertion failed: uninitialized_copy}}
     std::uninitialized_copy_n(
-        pol, non_input, n, it); // expected-error@*:* {{static assertion failed: uninitialized_copy_n}}
+        pol, non_fwd, n, it); // expected-error@*:* {{static assertion failed: uninitialized_copy_n}}
     std::uninitialized_copy_n(
         pol, it, n, non_fwd); // expected-error@*:* {{static assertion failed: uninitialized_copy_n}}
     std::uninitialized_move(
-        pol, non_input, non_input, it);            // expected-error@*:* {{static assertion failed: uninitialized_move}}
+        pol, non_fwd, non_fwd, it);                // expected-error@*:* {{static assertion failed: uninitialized_move}}
     std::uninitialized_move(pol, it, it, non_fwd); // expected-error@*:* {{static assertion failed: uninitialized_move}}
     std::uninitialized_move_n(
-        pol, non_input, n, it); // expected-error@*:* {{static assertion failed: uninitialized_move_n}}
+        pol, non_fwd, n, it); // expected-error@*:* {{static assertion failed: uninitialized_move_n}}
     std::uninitialized_move_n(
         pol, it, n, non_fwd); // expected-error@*:* {{static assertion failed: uninitialized_move_n}}
   }

diff  --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy.pass.cpp
index b4dd55f1d2926..822be98066ba7 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy.pass.cpp
@@ -13,11 +13,11 @@
 // <memory>
 
 // template <class ExecutionPolicy,
-//           class InputIterator,
-//           class ForwardIterator>
-//   ForwardIterator uninitialized_copy(ExecutionPolicy&& exec,
-//                                      InputIterator first, InputIterator last,
-//                                      ForwardIterator result);
+//           class ForwardIterator1,
+//           class ForwardIterator2>
+//   ForwardIterator2 uninitialized_copy(ExecutionPolicy&& exec,
+//                                       ForwardIterator1 first, ForwardIterator1 last,
+//                                       ForwardIterator2 result);
 
 #include <array>
 #include <algorithm>
@@ -128,13 +128,13 @@ struct TestInt {
 
 int main(int, char**) {
   types::for_each(
-      types::cpp17_input_iterator_list<const Src*>{}, types::apply_type_identity{[](auto v) {
+      types::forward_iterator_list<const Src*>{}, types::apply_type_identity{[](auto v) {
         using Iter = typename decltype(v)::type;
         types::for_each(
             types::forward_iterator_list<Dst*>{},
             TestIteratorWithPolicies<types::partial_instantiation<TestCustomTypes, Iter>::template apply>{});
       }});
-  types::for_each(types::cpp17_input_iterator_list<const int*>{}, types::apply_type_identity{[](auto v) {
+  types::for_each(types::forward_iterator_list<const int*>{}, types::apply_type_identity{[](auto v) {
                     using Iter = typename decltype(v)::type;
                     types::for_each(
                         types::forward_iterator_list<int*>{},

diff  --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy_n.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy_n.pass.cpp
index c03be9445e6e3..9117b192e45cd 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy_n.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/pstl.uninitialized_copy_n.pass.cpp
@@ -13,12 +13,12 @@
 // <memory>
 
 // template <class ExecutionPolicy,
-//           class InputIterator,
+//           class ForwardIterator1,
 //           class Size,
-//           class ForwardIterator>
-//   ForwardIterator uninitialized_copy_n(ExecutionPolicy&& exec,
-//                                        InputIterator first, Size n,
-//                                        ForwardIterator result);
+//           class ForwardIterator2>
+//   ForwardIterator2 uninitialized_copy_n(ExecutionPolicy&& exec,
+//                                         ForwardIterator1 first, Size n,
+//                                         ForwardIterator2 result);
 
 #include <array>
 #include <algorithm>
@@ -129,13 +129,13 @@ struct TestInt {
 
 int main(int, char**) {
   types::for_each(
-      types::cpp17_input_iterator_list<const Src*>{}, types::apply_type_identity{[](auto v) {
+      types::forward_iterator_list<const Src*>{}, types::apply_type_identity{[](auto v) {
         using Iter = typename decltype(v)::type;
         types::for_each(
             types::forward_iterator_list<Dst*>{},
             TestIteratorWithPolicies<types::partial_instantiation<TestCustomTypes, Iter>::template apply>{});
       }});
-  types::for_each(types::cpp17_input_iterator_list<const int*>{}, types::apply_type_identity{[](auto v) {
+  types::for_each(types::forward_iterator_list<const int*>{}, types::apply_type_identity{[](auto v) {
                     using Iter = typename decltype(v)::type;
                     types::for_each(
                         types::forward_iterator_list<int*>{},

diff  --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move.pass.cpp
index 5c3bf9ec7e207..71927b9b234d5 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move.pass.cpp
@@ -13,11 +13,11 @@
 // <memory>
 
 // template <class ExecutionPolicy,
-//           class InputIterator,
-//           class ForwardIterator>
-//   ForwardIterator uninitialized_move(ExecutionPolicy&& exec,
-//                                      InputIterator first, InputIterator last,
-//                                      ForwardIterator result);
+//           class ForwardIterator1,
+//           class ForwardIterator2>
+//   ForwardIterator1 uninitialized_move(ExecutionPolicy&& exec,
+//                                       ForwardIterator1 first, ForwardIterator1 last,
+//                                       ForwardIterator2 result);
 
 #include <array>
 #include <algorithm>
@@ -133,13 +133,13 @@ struct TestInt {
 
 int main(int, char**) {
   types::for_each(
-      types::cpp17_input_iterator_list<Src*>{}, types::apply_type_identity{[](auto v) {
+      types::forward_iterator_list<Src*>{}, types::apply_type_identity{[](auto v) {
         using Iter = typename decltype(v)::type;
         types::for_each(
             types::forward_iterator_list<Dst*>{},
             TestIteratorWithPolicies<types::partial_instantiation<TestCustomTypes, Iter>::template apply>{});
       }});
-  types::for_each(types::cpp17_input_iterator_list<int*>{}, types::apply_type_identity{[](auto v) {
+  types::for_each(types::forward_iterator_list<int*>{}, types::apply_type_identity{[](auto v) {
                     using Iter = typename decltype(v)::type;
                     types::for_each(
                         types::forward_iterator_list<int*>{},

diff  --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move_n.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move_n.pass.cpp
index 9fdb551c459d0..904a0360a7f30 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move_n.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.move/pstl.uninitialized_move_n.pass.cpp
@@ -13,12 +13,12 @@
 // <memory>
 
 // template <class ExecutionPolicy,
-//           class InputIterator,
+//           class ForwardIterator1,
 //           class Size,
-//           class ForwardIterator>
-//   pair<InputIterator, ForwardIterator> uninitialized_move_n(ExecutionPolicy&& exec,
-//                                                             InputIterator first, Size n,
-//                                                             ForwardIterator result);
+//           class ForwardIterator2>
+//   pair<ForwardIterator1, ForwardIterator2> uninitialized_move_n(ExecutionPolicy&& exec,
+//                                                                 ForwardIterator1 first, Size n,
+//                                                                 ForwardIterator2 result);
 
 #include <array>
 #include <algorithm>
@@ -136,13 +136,13 @@ struct TestInt {
 
 int main(int, char**) {
   types::for_each(
-      types::cpp17_input_iterator_list<Src*>{}, types::apply_type_identity{[](auto v) {
+      types::forward_iterator_list<Src*>{}, types::apply_type_identity{[](auto v) {
         using Iter = typename decltype(v)::type;
         types::for_each(
             types::forward_iterator_list<Dst*>{},
             TestIteratorWithPolicies<types::partial_instantiation<TestCustomTypes, Iter>::template apply>{});
       }});
-  types::for_each(types::cpp17_input_iterator_list<int*>{}, types::apply_type_identity{[](auto v) {
+  types::for_each(types::forward_iterator_list<int*>{}, types::apply_type_identity{[](auto v) {
                     using Iter = typename decltype(v)::type;
                     types::for_each(
                         types::forward_iterator_list<int*>{},


        


More information about the libcxx-commits mailing list