[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