> On 26 Mar 2025, at 17:50, Jonathan Wakely <jwak...@redhat.com> wrote:
> 
> Iain reported that he's seeing this on Darwin:
> 
> include/bits/chrono_io.h:914: warning: ISO C++ forbids converting a string 
> constant to 'char*' [-Wwrite-strings]
> 
> This is because the BSD definition ot tm::tm_zone is a char* (and has
> been since 1987) rather than const char* as in Glibc and POSIX.1-2024.
> 
> This uses const_cast<char*> when setting the tm_zone member. This should
> be safe because libc doesn't actually write anything to tm_zone, it's
> only non-const because the BSD definition predates the addition of the
> const keyword to C.
> 
> For targets where it's a const char* the cast won't matter because it
> will be converted back to const char* on assignment anyway.

This resolves the issue on x86_64-darwin21, (I did not test more widely yet, but
it LGTM), thanks
Iain

> 
> libstdc++-v3/ChangeLog:
> 
>       * include/bits/chrono_io.h (__formatter_chrono::_M_c): Use
>       const_cast when setting tm.tm_zone.
> ---
> 
> Testing x86_64-linux.
> 
> libstdc++-v3/include/bits/chrono_io.h | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/libstdc++-v3/include/bits/chrono_io.h 
> b/libstdc++-v3/include/bits/chrono_io.h
> index 08969166d2f..c55b651d049 100644
> --- a/libstdc++-v3/include/bits/chrono_io.h
> +++ b/libstdc++-v3/include/bits/chrono_io.h
> @@ -907,21 +907,22 @@ namespace __format
> 
> #ifdef _GLIBCXX_HAVE_STRUCT_TM_TM_ZONE
>         // POSIX.1-2024 adds tm.tm_zone which will be used for %Z.
> +       // BSD has had tm_zone since 1987 but as char* so cast away const.
>         if constexpr (__is_time_point_v<_Tp>)
>           {
>             // One of sys_time, utc_time, or local_time.
>             if constexpr (!is_same_v<typename _Tp::clock, local_t>)
> -             __tm.tm_zone = "UTC";
> +             __tm.tm_zone = const_cast<char*>("UTC");
>           }
>         else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
>           {
>             // local-time-format-t is used to provide time zone info for
>             // one of zoned_time, tai_time, gps_time, or local_time.
>             if (__t._M_abbrev)
> -             __tm.tm_zone = __t._M_abbrev->c_str();
> +             __tm.tm_zone = const_cast<char*>(__t._M_abbrev->c_str());
>           }
>         else
> -         __tm.tm_zone = "UTC";
> +         __tm.tm_zone = const_cast<char*>("UTC");
> #endif
> 
>         auto __d = _S_days(__t); // Either sys_days or local_days.
> -- 
> 2.49.0
> 

Reply via email to