https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121765
--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Tomasz Kaminski <tkami...@gcc.gnu.org>: https://gcc.gnu.org/g:ac1665954058f355aab11e1b48b1176c7e0af363 commit r16-3738-gac1665954058f355aab11e1b48b1176c7e0af363 Author: Tomasz KamiÅski <tkami...@redhat.com> Date: Thu Sep 4 13:58:23 2025 +0200 libstdc++: Use _Drop_iter<_CharT> for formattable concept checking [PR121765] When producing output, the libstdc++ format implementation only uses _Sink_iter specializations. Since users cannot construct basic_format_context, this is the only iterator type actually used. The __format_padded helper relies on this property to efficiently pad sequences from tuples and ranges. However, the standard's formattable concept requires a generic format function in formatters that works with any iterator type. This is intended to future-proof the implementation by allowing new format_context types. Previously, libstdc++ used back_insert_iterator<basic_string<_CharT>> for this purpose. Normally, concept checks only instantiate function signatures, but with user-defined formatters and deduced return types, the function body and all called functions are instantiated. This could trigger a static assertion error in the range/tuple formatter that assumed the iterator was a _Sink_iter (see included test). This patch resolves the issue by replacing the _Iter_for_t alias with the internal _Drop_iter. This iterator's sematnics is to drop elements, so __format_padded can handle it by simply returning the input iterator, which still produces the required behavior [1]. An alternative of using _Sink_iter was considered but rejected because it would allow formatters to pass formattable requirements while only supporting format_context and wformat_context, which seems counter to the design intent (the std/format/formatter/concept.cc fails). [1] The standard's wording defines format functions as producing an output representation, but does not explicitly require a formatter to be invoked for each element. This allows the use of _Drop_iter to pass the concept check without generating any output. PR libstdc++/121765 libstdc++-v3/ChangeLog: * include/std/format (__format::_Drop_iter): Define. (_Iter_for_t::type): Change alias to _Drop_iter. (__format::__format_padded): Return __fc.out() for _Drop_iter. * testsuite/std/format/pr121765.cc: New test. Reviewed-by: Jonathan Wakely <jwak...@redhat.com> Signed-off-by: Tomasz KamiÅski <tkami...@redhat.com>