aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Kamiński <tkaminsk@redhat.com>2025-04-16 15:28:46 +0200
committerTomasz Kamiński <tkaminsk@redhat.com>2025-04-17 10:50:34 +0200
commit843b273c6851b71407b116584982b0389be4d6fd (patch)
treec5c4f1dd35ef260dc9e59c7747faa514854c16d6
parent55620672d77812bb6f1ac8835f0c949680d9c7d0 (diff)
downloadgcc-843b273c6851b71407b116584982b0389be4d6fd.zip
gcc-843b273c6851b71407b116584982b0389be4d6fd.tar.gz
gcc-843b273c6851b71407b116584982b0389be4d6fd.tar.bz2
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>
-rw-r--r--libstdc++-v3/include/std/format19
1 files changed, 12 insertions, 7 deletions
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 27253f5..2668382 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -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: