[gcc r16-8555] libstdc++: Add default template parameters for uninitialized_fill(_n).

Tomasz Kaminski tkaminsk@gcc.gnu.org
Fri Apr 10 06:00:49 GMT 2026


https://gcc.gnu.org/g:c6a542431315881707bac6666ee37af7b624453f

commit r16-8555-gc6a542431315881707bac6666ee37af7b624453f
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date:   Thu Apr 9 16:54:10 2026 +0200

    libstdc++: Add default template parameters for uninitialized_fill(_n).
    
    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.
    
    Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
    Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>

Diff:
---
 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 +++--
 .../testsuite/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 6e307ea43c64..f7845abd3f37 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 1c1fcfd62a4d..ae4442f38581 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 cfb90533ce45..9a3b3655974c 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 22dd31b9d324..8f541fc389ec 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 6729319a51b6..2eb4e5dca6b5 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 b05234e1f8df..60f3d95ddb3e 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);
 }


More information about the Libstdc++-cvs mailing list