https://gcc.gnu.org/g:9b076412e6aecac70504607b5181483ef3e6d754
commit r17-356-g9b076412e6aecac70504607b5181483ef3e6d754 Author: Tomasz Kamiński <[email protected]> Date: Wed Apr 29 16:06:16 2026 +0200 libstdc++: Format all contiguous ranges usign spoan. We convert all contiguous ranges into span of the possibly-const qualified _Tp (__format::__maybe_const<_Tp, _CharT>). The span object is const qualifed, to trigger _M_format<const span<T>> specialization, that is already used by formatter specialization for ranges. This conversion is applied regardless if range is sized, and ranges::distance to compute the size. Even for user-defined iterators, they will observe range being iterated only once. Finally, using raw pointers to iterate range during formatting guarantees, that no stdio lock will be taken. In consequence it would be now possible to enable_nonlocking_formatter_optimization for all contiguous ranges. libstdc++-v3/ChangeLog: * include/std/format (range_formatter::format): Format all contiguous ranges as span<__format::__maybe_const<_Tp, _CharT>>. Reviewed-by: Jonathan Wakely <[email protected]> Signed-off-by: Tomasz Kamiński <[email protected]> Diff: --- libstdc++-v3/include/std/format | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format index 4627381fa9e7..60adca93b5d8 100644 --- a/libstdc++-v3/include/std/format +++ b/libstdc++-v3/include/std/format @@ -6175,7 +6175,13 @@ namespace __format format(_Rg&& __rg, basic_format_context<_Out, _CharT>& __fc) const { using _Range = remove_reference_t<_Rg>; - if constexpr (__format::__simply_formattable_range<_Range, _CharT>) + if constexpr (ranges::contiguous_range<_Rg>) + { + const span<__format::__maybe_const<_Tp, _CharT>> + __spn(ranges::data(__rg), size_t(ranges::distance(__rg))); + return _M_format(__spn, __fc); + } + else if constexpr (__format::__simply_formattable_range<_Range, _CharT>) return _M_format<const _Range>(__rg, __fc); else return _M_format(__rg, __fc);
