diff options
author | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-04-16 15:28:46 +0200 |
---|---|---|
committer | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-04-17 10:50:34 +0200 |
commit | 843b273c6851b71407b116584982b0389be4d6fd (patch) | |
tree | c5c4f1dd35ef260dc9e59c7747faa514854c16d6 | |
parent | 55620672d77812bb6f1ac8835f0c949680d9c7d0 (diff) | |
download | gcc-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/format | 19 |
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: |