Issue |
125353
|
Summary |
Printing integer timestamp required std::to_chars<long double>
|
Labels |
new issue
|
Assignees |
|
Reporter |
georgthegreat
|
MWE (using gtest here) is as follows:
```
#include <chrono>
#include <format>
#include <sstream>
TEST(StdFormatShould, FormatTimestamp) {
using Ts = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>;
Ts ts{0};
std::stringstream ss;
ss << ts;
}
```
Attempting to compile this on macOS with the latest SDK results in
```
In file included from test_format.cpp:1:
In file included from /usr/include/c++/v1/chrono:837:
In file included from /usr/include/c++/v1/__chrono/formatter.h:23:
In file included from /usr/include/c++/v1/__chrono/ostream.h:30:
In file included from /usr/include/c++/v1/__format/format_functions.h:29:
/usr/include/c++/v1/__format/formatter_floating_point.h:73:30: error: 'to_chars' is unavailable: introduced in macOS 13.3
73 | to_chars_result __r = std::to_chars(__first, __last, __value, __fmt, __precision);
| ^
/usr/include/c++/v1/__format/formatter_floating_point.h:392:34: note: in instantiation of function template specialization 'std::__formatter::__to_buffer<float>' requested here
392 | __result.__last = __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::general, __precision);
| ^
/usr/include/c++/v1/__format/formatter_floating_point.h:459:27: note: in instantiation of function template specialization 'std::__formatter::__format_buffer_general_lower_case<float, float>' requested here
459 | return __formatter::__format_buffer_general_lower_case(__buffer, __value, __buffer.__precision(), __first);
| ^
/usr/include/c++/v1/__format/formatter_floating_point.h:657:42: note: in instantiation of function template specialization 'std::__formatter::__format_buffer<float, float>' requested here
657 | __float_result __result = __formatter::__format_buffer(
| ^
/usr/include/c++/v1/__format/formatter_floating_point.h:763:25: note: in instantiation of function template specialization 'std::__formatter::__format_floating_point<float, char, std::format_context>' requested here
763 | return __formatter::__format_floating_point(__value, __ctx, __parser_.__get_parsed_std_specifications(__ctx));
| ^
/usr/include/c++/v1/__format/format_functions.h:287:42: note: in instantiation of function template specialization 'std::__formatter_floating_point<char>::format<float, std::format_context>' requested here
287 | __ctx.advance_to(__formatter.format(__arg, __ctx));
| ^
/usr/include/c++/v1/__format/format_functions.h:427:15: note: (skipping 9 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
427 | return std::__vformat_to(std::move(__out_it), __fmt, __args);
| ^
/usr/include/c++/v1/__format/format_arg_store.h:249:19: note: in instantiation of function template specialization 'std::__format::__create_packed_storage<std::format_context, const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long long, std::ratio<1, 1000>>>>' requested here
249 | __format::__create_packed_storage(__storage.__types_, __storage.__values_, __args...);
| ^
/usr/include/c++/v1/__format/format_functions.h:70:10: note: in instantiation of member function 'std::__format_arg_store<std::format_context, const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long long, std::ratio<1, 1000>>>>::__format_arg_store' requested here
70 | return _VSTD::__format_arg_store<_Context, _Args...>(__args...);
| ^
/usr/include/c++/v1/__config:897:17: note: expanded from macro '_VSTD'
897 | # define _VSTD std
| ^
/usr/include/c++/v1/__format/format_functions.h:610:59: note: in instantiation of function template specialization 'std::make_format_args<std::format_context, const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long long, std::ratio<1, 1000>>>>' requested here
610 | return std::vformat(std::move(__loc), __fmt.get(), std::make_format_args(__args...));
| ^
/usr/include/c++/v1/__chrono/ostream.h:48:23: note: in instantiation of function template specialization 'std::format<const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long long, std::ratio<1, 1000>>> &>' requested here
48 | return __os << std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L%F %T}"), __tp);
| ^
/home/thegeorg/arcadia/contrib/tests/libcxx/test_format.cpp:10:5: note: in instantiation of function template specialization 'std::chrono::operator<<<char, std::char_traits<char>, std::chrono::duration<long long, std::ratio<1, 1000>>>' requested here
10 | ss << ts;
| ^
```
This is probably related to the format used [here](https://github.com/llvm/llvm-project/blob/d5a7a483a65f830a0c7a931781bc90046dc67ff4/libcxx/include/__chrono/ostream.h#L52) which uses `%F`:
> f, F: Produces the output as if by calling
despite being explicitly annotated with `!treat_as_floating_point_v<typename _Duration::rep>`
macOS 13.3 was releases just 2 years ago and we can no raise `-mmacos-system-min` to this value just to fix the test.
@ldionne, could you, please, take a looK?
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs