From: Tomasz Kamiński Date: Wed, 16 Apr 2025 13:28:46 +0000 (+0200) Subject: libstdc++: Remove dead code in range_formatter::format [PR109162] X-Git-Tag: basepoints/gcc-16~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=843b273c6851b71407b116584982b0389be4d6fd;p=thirdparty%2Fgcc.git 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 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 Signed-off-by: Tomasz Kamiński --- diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format index 27253f50ea8..2668382c7ed 100644 --- a/libstdc++-v3/include/std/format +++ b/libstdc++-v3/include/std/format @@ -5252,6 +5252,14 @@ namespace __format = ranges::input_range && formattable, _CharT>; + // _Rg& and const _Rg& are both formattable and use same formatter + // specialization for their references. + template + concept __simply_formattable_range + = __const_formattable_range<_Rg, _CharT> + && same_as>, + remove_cvref_t>>; + template 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; - if constexpr (same_as, _Tp>) - return _M_format(__rg, __fc); - } - return _M_format(__rg, __fc); + if constexpr (__format::__simply_formattable_range<_Range, _CharT>) + return _M_format(__rg, __fc); + else + return _M_format(__rg, __fc); } private: