https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110739

--- 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:caac9489f62221da083684456c7c7ceca7425493

commit r16-1712-gcaac9489f62221da083684456c7c7ceca7425493
Author: Tomasz KamiÅski <tkami...@redhat.com>
Date:   Wed Jun 25 16:58:31 2025 +0200

    libstdc++: Lift chrono localized formatting to main chrono format loop
[PR110739]

    This patch extract calls to _M_locale_fmt and construction of the struct
tm,
    from the functions dedicated to each specifier, to main format loop in
    _M_format_to functions. This removes duplicated code repeated for
specifiers.

    To allow _M_locale_fmt to only be called if localized formatting is enabled
    ('L' is present in chrono-format-spec), we provide a implementations for
    locale specific specifiers (%c, %r, %x, %X) that produces the same result
    as locale::classic():
     * %c is implemented as separate _M_c method
     * %r is implemented as separate _M_r method
     * %x is implemented together with %D, as they provide same behavior,
     * %X is implemented together with %R as _M_R_X, as both of them do not
include
       subseconds.

    The handling of subseconds was also extracted to _M_subsecs function that
is
    used by _M_S and _M_T specifier. The _M_T is now implemented in terms of
    _M_R_X (printing time without subseconds) and _M_subs.

    The __mod parameter responsible for triggering localized formatting was
removed
    from methods handling most of specifiers, except:
     * _M_S (for %S) for which it determines if subseconds should be included,
     * _M_z (for %z) for which it determines if ':' is used as separator.

            PR libstdc++/110739

    libstdc++-v3/ChangeLog:

            * include/bits/chrono_io.h (__formatter_chrono::_M_use_locale_fmt):
            Define.
            (__formatter_chrono::_M_locale_fmt): Moved to front of the class.
            (__formatter_chrono::_M_format_to): Construct and initialize
            struct tm and call _M_locale_fmt if needed.
            (__formatter_chrono::_M_c_r_x_X): Split into separate methods.
            (__formatter_chrono::_M_c, __formatter_chrono::_M_r): Define.
            (__formatter_chrono::_M_D): Renamed to _M_D_x.
            (__formatter_chrono::_M_D_x): Renamed from _M_D.
            (__formatter_chrono::_M_R_T): Split into _M_R_X and _M_T.
            (__formatter_chrono::_M_R_X): Extracted from _M_R_T.
            (__formatter_chrono::_M_T): Define in terms of _M_R_X and
_M_subsecs.
            (__formatter_chrono::_M_subsecs): Extracted from _M_S.
            (__formatter_chrono::_M_S): Replaced __mod with __subs argument,
            removed _M_locale_fmt call, and delegate to _M_subsecs.
            (__formatter_chrono::_M_C_y_Y, __formatter_chrono::_M_d_e)
            (__formatter_chrono::_M_H_I, __formatter_chrono::_M_m)
            (__formatter_chrono::_M_u_w, __formatter_chrono::_M_U_V_W): Remove
            __mod argument and call to _M_locale_fmt.

    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>
    Signed-off-by: Tomasz KamiÅski <tkami...@redhat.com>

Reply via email to