libstdc++: Remove dead code in range_formatter::format [PR109162]

Because the _M_format(__rg, __fc) were placed outside of if constexpr,
these method and its children  where instantiated, even if
_M_format<const _Range> could be used.

To simplify the if constexpr chain, we introduce a __simply_formattable_range
(name based on simple-view) exposition only concept, that checks if range is
const and mutable formattable and uses same formatter specialization for
references in each case.

	PR libstdc++/109162

libstdc++-v3/ChangeLog:

	* include/std/format (__format::__simply_formattable_range): Define.
	(range_formatter::format): Do not instantiate _M_format for mutable
	_Rg if const _Rg can be used.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
This commit is contained in:
Tomasz Kamiński 2025-04-16 15:28:46 +02:00
parent 55620672d7
commit 843b273c68

View file

@ -5252,6 +5252,14 @@ namespace __format
= ranges::input_range<const _Rg>
&& formattable<ranges::range_reference_t<const _Rg>, _CharT>;
// _Rg& and const _Rg& are both formattable and use same formatter
// specialization for their references.
template<typename _Rg, typename _CharT>
concept __simply_formattable_range
= __const_formattable_range<_Rg, _CharT>
&& same_as<remove_cvref_t<ranges::range_reference_t<_Rg>>,
remove_cvref_t<ranges::range_reference_t<const _Rg>>>;
template<typename _Rg, typename _CharT>
using __maybe_const_range
= __conditional_t<__const_formattable_range<_Rg, _CharT>, const _Rg, _Rg>;
@ -5635,13 +5643,10 @@ namespace __format
format(_Rg&& __rg, basic_format_context<_Out, _CharT>& __fc) const
{
using _Range = remove_reference_t<_Rg>;
if constexpr (__format::__const_formattable_range<_Range, _CharT>)
{
using _CRef = ranges::range_reference_t<const _Range>;
if constexpr (same_as<remove_cvref_t<_CRef>, _Tp>)
return _M_format<const _Range>(__rg, __fc);
}
return _M_format(__rg, __fc);
if constexpr (__format::__simply_formattable_range<_Range, _CharT>)
return _M_format<const _Range>(__rg, __fc);
else
return _M_format(__rg, __fc);
}
private: