The formatter for chrono::local_time needs to also be updated, to reflect
that operator<< is not
always available, thus "{}" format spec should not be supported.
Essentially a same approach of for sys_time specialization needs to be
taken:
 * __defSec should have empty _M_chrono_spec if the local time is not
stream instertable
 * parse function should throw an if _M_chrono_spec is empty, this check an
be be omitted for __stream_insertable
   types.



On Fri, Sep 19, 2025 at 3:23 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> This was reported as LWG 4257 and moved to Tentatively Ready status.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/chrono_io.h: Remove unused <iomanip> header.
>         (operator<<): Constrain overload for chrono::local_time.
>         * testsuite/std/time/clock/local/io.cc: Check constraints.
> ---
>
> Tested powerpc64le-linux.
>
>  libstdc++-v3/include/bits/chrono_io.h             | 4 +++-
>  libstdc++-v3/testsuite/std/time/clock/local/io.cc | 8 ++++++++
>  2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/bits/chrono_io.h
> b/libstdc++-v3/include/bits/chrono_io.h
> index 809d795cbf2b..593a927811a6 100644
> --- a/libstdc++-v3/include/bits/chrono_io.h
> +++ b/libstdc++-v3/include/bits/chrono_io.h
> @@ -37,7 +37,6 @@
>  #if __cplusplus >= 202002L
>
>  #include <sstream> // ostringstream
> -#include <iomanip> // setw, setfill
>  #include <format>
>  #include <charconv> // from_chars
>  #include <stdexcept> // __sso_string
> @@ -4014,6 +4013,9 @@ namespace __detail
>      inline basic_ostream<_CharT, _Traits>&
>      operator<<(basic_ostream<_CharT, _Traits>& __os,
>                const local_time<_Duration>& __lt)
> +    // _GLIBCXX_RESOLVE_LIB_DEFECTS
> +    // 4257. Stream insertion for chrono::local_time should be constrained
> +    requires requires(const sys_time<_Duration>& __st) { __os << __st; }
>      {
>        __os << sys_time<_Duration>{__lt.time_since_epoch()};
>        return __os;
> diff --git a/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> b/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> index 67818e876497..6efd81a87c2a 100644
> --- a/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> +++ b/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> @@ -125,6 +125,14 @@ test_parse()
>    VERIFY( tp.time_since_epoch() == 0s );
>  }
>
> +// LWG 4257. Stream insertion for chrono::local_time should be constrained
> +template<typename T>
> +concept ostream_insertable = requires (std::ostream& o, const T& t) { o
> << t; };
> +using D = std::chrono::duration<double>;
> +static_assert( ostream_insertable<std::chrono::local_days> );
> +static_assert( ostream_insertable<std::chrono::local_seconds> );
> +static_assert( ! ostream_insertable<std::chrono::local_time<D>> );
> +
>  int main()
>  {
>    test_ostream();
> --
> 2.51.0
>
>

Reply via email to