[PATCH] libstdc++: Add default template parameters for uninitialized_fill(_n).
Jonathan Wakely
jwakely.gcc@gmail.com
Thu Apr 9 20:19:44 GMT 2026
OK
On Thu, 9 Apr 2026, 16:22 Tomasz Kamiński, <tkaminsk@redhat.com> wrote:
> This implements P3217R0 and adds default argument for the value type
> templater parameter for uninitialized_fill, uninitialized_fill_n and
> their ranges counterpart.
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/ranges_uninitialized.h
> (__uninitialized_fill_fn::operator())
> (__uninitialized_fill_fn_n::operator()): Add default argument
> for _Tp parameter.
> * include/bits/stl_uninitialized.h (std::unitialized_fill)
> (std::unitialized_fill_n): Likewise.
> * include/pstl/glue_memory_defs.h (std::unitialized_fill)
> (std::unitialized_fill_n): Likewise.
> * include/bits/version.def (algorithm_default_value_type):
> Bump to 202603.
> * include/bits/version.h: Regenerate.
> * testsuite/25_algorithms/default_template_value.cc:
> Test for new algorithms.
> ---
>
> Tested lightly locally, the default_template_value.cc passes.
> Testing on x86_64-linux. OK for trunk when all test passes?
>
> libstdc++-v3/include/bits/ranges_uninitialized.h | 9 ++++++---
> libstdc++-v3/include/bits/stl_uninitialized.h | 6 ++++--
> libstdc++-v3/include/bits/version.def | 5 ++++-
> libstdc++-v3/include/bits/version.h | 4 ++--
> libstdc++-v3/include/pstl/glue_memory_defs.h | 5 +++--
> .../25_algorithms/default_template_value.cc | 15 ++++++++++++++-
> 6 files changed, 33 insertions(+), 11 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/ranges_uninitialized.h
> b/libstdc++-v3/include/bits/ranges_uninitialized.h
> index 6e307ea43c6..f7845abd3f3 100644
> --- a/libstdc++-v3/include/bits/ranges_uninitialized.h
> +++ b/libstdc++-v3/include/bits/ranges_uninitialized.h
> @@ -458,7 +458,8 @@ namespace ranges
> struct __uninitialized_fill_fn
> {
> template<__detail::__nothrow_forward_iterator _Iter,
> - __detail::__nothrow_sentinel<_Iter> _Sent, typename _Tp>
> + __detail::__nothrow_sentinel<_Iter> _Sent,
> + typename _Tp _GLIBCXX26_DEF_VAL_T(iter_value_t<_Iter>)>
> requires constructible_from<iter_value_t<_Iter>, const _Tp&>
> _GLIBCXX26_CONSTEXPR
> _Iter
> @@ -478,7 +479,8 @@ namespace ranges
> }
> }
>
> - template<__detail::__nothrow_forward_range _Range, typename _Tp>
> + template<__detail::__nothrow_forward_range _Range,
> + typename _Tp _GLIBCXX26_DEF_VAL_T(range_value_t<_Range>)>
> requires constructible_from<range_value_t<_Range>, const _Tp&>
> _GLIBCXX26_CONSTEXPR
> borrowed_iterator_t<_Range>
> @@ -492,7 +494,8 @@ namespace ranges
>
> struct __uninitialized_fill_n_fn
> {
> - template<__detail::__nothrow_forward_iterator _Iter, typename _Tp>
> + template<__detail::__nothrow_forward_iterator _Iter,
> + typename _Tp _GLIBCXX26_DEF_VAL_T(iter_value_t<_Iter>)>
> requires constructible_from<iter_value_t<_Iter>, const _Tp&>
> _GLIBCXX26_CONSTEXPR
> _Iter
> diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h
> b/libstdc++-v3/include/bits/stl_uninitialized.h
> index 1c1fcfd62a4..ae4442f3858 100644
> --- a/libstdc++-v3/include/bits/stl_uninitialized.h
> +++ b/libstdc++-v3/include/bits/stl_uninitialized.h
> @@ -406,7 +406,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> *
> * Like std::fill, but does not require an initialized output range.
> */
> - template<typename _ForwardIterator, typename _Tp>
> + template<typename _ForwardIterator,
> + typename _Tp _GLIBCXX26_ALGO_DEF_VAL_T(_ForwardIterator)>
> _GLIBCXX26_CONSTEXPR
> inline void
> uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
> @@ -542,7 +543,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> *
> * Like std::fill_n, but does not require an initialized output range.
> */
> - template<typename _ForwardIterator, typename _Size, typename _Tp>
> + template<typename _ForwardIterator, typename _Size,
> + typename _Tp _GLIBCXX26_ALGO_DEF_VAL_T(_ForwardIterator)>
> _GLIBCXX26_CONSTEXPR
> inline _ForwardIterator
> uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp&
> __x)
> diff --git a/libstdc++-v3/include/bits/version.def
> b/libstdc++-v3/include/bits/version.def
> index cfb90533ce4..9a3b3655974 100644
> --- a/libstdc++-v3/include/bits/version.def
> +++ b/libstdc++-v3/include/bits/version.def
> @@ -2086,8 +2086,11 @@ ftms = {
>
> ftms = {
> name = algorithm_default_value_type;
> + // 202403 P2248R8 Enabling list-initialization for algorithms
> + // P3787R2 Adjoints to "Enabling ...": find_last
> + // 202603 P3787R2 Adjoints to "Enabling ...": uninitialized_fill
> values = {
> - v = 202403;
> + v = 202603;
> cxxmin = 26;
> };
> };
> diff --git a/libstdc++-v3/include/bits/version.h
> b/libstdc++-v3/include/bits/version.h
> index 22dd31b9d32..8f541fc389e 100644
> --- a/libstdc++-v3/include/bits/version.h
> +++ b/libstdc++-v3/include/bits/version.h
> @@ -2328,9 +2328,9 @@
>
> #if !defined(__cpp_lib_algorithm_default_value_type)
> # if (__cplusplus > 202302L)
> -# define __glibcxx_algorithm_default_value_type 202403L
> +# define __glibcxx_algorithm_default_value_type 202603L
> # if defined(__glibcxx_want_all) ||
> defined(__glibcxx_want_algorithm_default_value_type)
> -# define __cpp_lib_algorithm_default_value_type 202403L
> +# define __cpp_lib_algorithm_default_value_type 202603L
> # endif
> # endif
> #endif /* !defined(__cpp_lib_algorithm_default_value_type) */
> diff --git a/libstdc++-v3/include/pstl/glue_memory_defs.h
> b/libstdc++-v3/include/pstl/glue_memory_defs.h
> index 6729319a51b..2eb4e5dca6b 100644
> --- a/libstdc++-v3/include/pstl/glue_memory_defs.h
> +++ b/libstdc++-v3/include/pstl/glue_memory_defs.h
> @@ -10,6 +10,7 @@
> #ifndef _PSTL_GLUE_MEMORY_DEFS_H
> #define _PSTL_GLUE_MEMORY_DEFS_H
>
> +#include <bits/stl_iterator_base_types.h>
> #include "execution_defs.h"
>
> namespace std
> @@ -37,11 +38,11 @@ uninitialized_move_n(_ExecutionPolicy&& __exec,
> _InputIterator __first, _Size __
>
> // [uninitialized.fill]
>
> -template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
> +template <class _ExecutionPolicy, class _ForwardIterator, class _Tp
> _GLIBCXX26_ALGO_DEF_VAL_T(_ForwardIterator)>
> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
> uninitialized_fill(_ExecutionPolicy&& __exec, _ForwardIterator __first,
> _ForwardIterator __last, const _Tp& __value);
>
> -template <class _ExecutionPolicy, class _ForwardIterator, class _Size,
> class _Tp>
> +template <class _ExecutionPolicy, class _ForwardIterator, class _Size,
> class _Tp _GLIBCXX26_ALGO_DEF_VAL_T(_ForwardIterator)>
> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
> _ForwardIterator>
> uninitialized_fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first,
> _Size __n, const _Tp& __value);
>
> diff --git
> a/libstdc++-v3/testsuite/25_algorithms/default_template_value.cc
> b/libstdc++-v3/testsuite/25_algorithms/default_template_value.cc
> index b05234e1f8d..60f3d95ddb3 100644
> --- a/libstdc++-v3/testsuite/25_algorithms/default_template_value.cc
> +++ b/libstdc++-v3/testsuite/25_algorithms/default_template_value.cc
> @@ -4,12 +4,14 @@
>
> #if !defined(__cpp_lib_algorithm_default_value_type)
> #error "Feature test macro for default template type for algorithms'
> values is missing"
> -#elif __cpp_lib_algorithm_default_value_type < 202403L
> +#elif __cpp_lib_algorithm_default_value_type < 202603L
> #error "Feature test macro for default template type for algorithms'
> values is wrong"
> #endif
>
> #include <execution>
> +#include <memory>
> #include <ranges>
> +#include <span>
> #include <iterator>
> #include <vector>
>
> @@ -139,4 +141,15 @@ test()
> // [alg.find.last]
> (void) std::ranges::find_last(in.begin(), in.end(), INPUT_VAL);
> (void) std::ranges::find_last(in, INPUT_VAL);
> +
> + extern std::span<Input> unin;
> + // [uninitialized.fill]
> + (void) std::uninitialized_fill(unin.begin(), unin.end(), INPUT_VAL);
> + (void) std::uninitialized_fill(std::execution::seq, unin.begin(),
> unin.end(), INPUT_VAL);
> + (void) std::ranges::uninitialized_fill(unin.begin(), unin.end(),
> INPUT_VAL);
> + (void) std::ranges::uninitialized_fill(unin, INPUT_VAL);
> +
> + (void) std::uninitialized_fill_n(unin.begin(), unin.size(), INPUT_VAL);
> + (void) std::uninitialized_fill_n(std::execution::seq, unin.begin(),
> unin.size(), INPUT_VAL);
> + (void) std::ranges::uninitialized_fill_n(unin.begin(), unin.size(),
> INPUT_VAL);
> }
> --
> 2.53.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260409/8258a026/attachment.htm>
More information about the Libstdc++
mailing list