[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