https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121705
Bug ID: 121705
Summary: When using import std, formatting
std::chrono::year_month_day will cause compilation
failure
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: printfne at gmail dot com
Target Milestone: ---
After using import std instead of include, when attempting to format
std::chrono::year_month_day in the default format using cout, format,
stringstream, or println, it will result in compilation failure
/// mian.cpp
import std;
int main() {
std::chrono::year_month_day ymd{};
auto str = std::format("{}", ymd); // 1. error
std::cout << ymd << std::endl; // 2. error
std::stringstream ss;
ss << ymd; // 3. error
}
// command
g++-latest -std=c++26 -fmodules -c -fsearch-include-path bits/std.cc
g++-latest -std=c++26 -fmodules main.cpp
// error message
☁ ~ g++-latest -std=c++26 -fmodules -c -fsearch-include-path bits/std.cc
☁ ~ g++-latest -std=c++26 -fmodules -c main.cpp
In file included from /home/hexne/gcc-latest/include/c++/16.0.0/chrono:3352,
from
/home/hexne/gcc-latest/include/c++/16.0.0/x86_64-pc-linux-gnu/bits/stdc++.h:175,
from /home/hexne/gcc-latest/include/c++/16.0.0/bits/std.cc:30,
of module std, imported at main.cpp:1:
/home/hexne/gcc-latest/include/c++/16.0.0/bits/chrono_io.h: In instantiation of
'typename std::basic_format_context<_Out, _CharT>::iterator
std::formatter<std::chrono::year_month_day, _CharT>::format(const
std::chrono::year_month_day&, std::basic_format_context<_Out, _CharT>&) const
[with _Out = std::__format::_Sink_iter<char>; _CharT = char; typename
std::basic_format_context<_Out, _CharT>::iterator =
std::basic_format_context<std::__format::_Sink_iter<char>, char>::iterator]':
required from 'static void
std::basic_format_arg<_Context>::handle::_S_format(std::basic_format_parse_context<typename
_Context::char_type>&, _Context&, const void*) [with _Tq = const
std::chrono::year_month_day; _Context =
std::basic_format_context<std::__format::_Sink_iter<char>, char>; typename
_Context::char_type = char]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:4085:40:
4085 | __format_ctx.advance_to(__f.format(__val, __format_ctx));
| ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
required from 'std::basic_format_arg<_Context>::handle::handle(_Tp&) [with _Tp
= std::chrono::year_month_day; _Context =
std::basic_format_context<std::__format::_Sink_iter<char>, char>]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:4093:11:
4093 | auto __func = _S_format<__maybe_const_t<_Tp>>;
| ^~~~~~
required from 'std::basic_format_arg<_Context>::basic_format_arg(_Tp&) [with
_Tp = std::chrono::year_month_day; _Context =
std::basic_format_context<std::__format::_Sink_iter<char>, char>]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:4324:13:
4324 | _M_set(static_cast<_Td>(__v));
| ^~~~~~~~~~~~~~~~~~~~~
required from 'static std::__format::_Arg_store<_Context, _Args>::_Element_t
std::__format::_Arg_store<_Context, _Args>::_S_make_elt(_Tp&) [with _Tp =
std::chrono::year_month_day; _Context =
std::basic_format_context<std::__format::_Sink_iter<char>, char>; _Args =
{std::basic_format_arg<std::basic_format_context<std::__format::_Sink_iter<char>,
char> >::handle}; _Element_t =
std::__format::_Arg_store<std::basic_format_context<std::__format::_Sink_iter<char>,
char>,
std::basic_format_arg<std::basic_format_context<std::__format::_Sink_iter<char>,
char> >::handle>::_Element_t]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:4632:31:
4632 | basic_format_arg<_Context> __arg(__v);
| ^~~~~
required from 'std::__format::_Arg_store<_Context, _Args>::_Arg_store(_Tp& ...)
[with _Tp = {std::chrono::year_month_day}; _Context =
std::basic_format_context<std::__format::_Sink_iter<char>, char>; _Args =
{std::basic_format_arg<std::basic_format_context<std::__format::_Sink_iter<char>,
char> >::handle}]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:4643:23:
4643 | : _M_args{_S_make_elt(__a)...}
| ~~~~~~~~~~~^~~~~
required from 'auto std::make_format_args(_Args& ...) [with _Context =
basic_format_context<__format::_Sink_iter<char>, char>; _Args =
{chrono::year_month_day}]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:4693:14:
4693 | return _Store(__fmt_args...);
| ^~~~~~~~~~~~~~~~~~~~~
required from 'std::string std::format(format_string<_Args ...>, _Args&& ...)
[with _Args = {chrono::year_month_day&}; string = __cxx11::basic_string<char>;
format_string<_Args ...> = basic_format_string<char, chrono::year_month_day&>]'
/home/hexne/gcc-latest/include/c++/16.0.0/format:5246:61:
5246 | { return std::vformat(__fmt.get(),
std::make_format_args(__args...)); }
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
required from here
main.cpp:6:27:
6 | auto str = std::format("{}", ymd); // 1. error
| ~~~~~~~~~~~^~~~~~~~~~~
/home/hexne/gcc-latest/include/c++/16.0.0/bits/chrono_io.h:2643:23: error: no
match for 'operator==' (operand types are 'std::__format::_ChronoParts' and
'int')
2643 | if (__parts == 0)
| ~~~~~~~~^~~~
This problem does not exist in gcc 15.2.1 20250813. It can be reproduced using
gcc 16.0.0 20250828 (experimental)