[libcxx-commits] [PATCH] D103433: [libc++][format] Adds integer formatter.
Louis Dionne via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Oct 6 12:17:49 PDT 2021
ldionne accepted this revision.
ldionne added inline comments.
This revision is now accepted and ready to land.
================
Comment at: libcxx/include/__format/formatter_integer.h:111-116
+ using _To = long long;
+ if (__value < numeric_limits<_To>::min() ||
+ __value > numeric_limits<_To>::max())
+ __throw_format_error("128 bit value is outside of implemented range");
+
+ return _Base::format(static_cast<_To>(__value), __ctx);
----------------
Mordante wrote:
> Quuxplusone wrote:
> > Mordante wrote:
> > > vitaut wrote:
> > > > AFAICS `to_chars` supports 128-bit integers (https://godbolt.org/z/7GTPrcq88) or am I missing something?
> > > libc++ accepts 128-bit integers, but silently truncates them to 64-bit. IMO this is a bug and it's on my TODO to fix this.
> > > It's visible in the generated assembly, it contains a`std::__1::__itoa::__pow10_64` lookup table instead of a `std::__1::__itoa::__pow10_128`.
> > That is definitely a bug; see https://godbolt.org/z/j9r7YG8aq where there's a discontinuity at `base=10` (but I think all the other outputs are correct, probably?). It could be quickly patched like this:
> > ```
> > diff --git a/libcxx/include/charconv b/libcxx/include/charconv
> > index 4a5c65df7c75..74b8993cf392 100644
> > --- a/libcxx/include/charconv
> > +++ b/libcxx/include/charconv
> > @@ -351,6 +351,9 @@ _LIBCPP_AVAILABILITY_TO_CHARS
> > inline _LIBCPP_INLINE_VISIBILITY to_chars_result
> > __to_chars_itoa(char* __first, char* __last, _Tp __value, false_type)
> > {
> > + if (sizeof(_Tp) > 8) {
> > + return __to_chars_integral(__first, __last, __value, 10, false_type());
> > +
> > using __tx = __itoa::__traits<_Tp>;
> > auto __diff = __last - __first;
> >
> > @@ -426,7 +429,7 @@ inline _LIBCPP_INLINE_VISIBILITY to_chars_result
> > __to_chars_integral(char* __first, char* __last, _Tp __value, int __base,
> > false_type)
> > {
> > - if (__base == 10)
> > + if (__base == 10 && sizeof(_Tp) <= 8)
> > return __to_chars_itoa(__first, __last, __value, false_type());
> >
> > ptrdiff_t __cap = __last - __first;
> > ```
> > But we'd have to add test coverage too.
> Since we've been shipping this implementation of `std::to_chars` for a while I didn't have a lot of urgency to fix it. I still want to address this issue later. I've identified more issues with `<charconv>` and I want to look at these later. For now I want to focus on the formatting library, but `<charconv>` is still high on my list. Of course if you want to implement this work around feel free to do so; I would be happy to review it.
Can we file a bug report to track this work item? I'm fearful we'll forget about it forever otherwise.
================
Comment at: libcxx/include/__format/formatter_integral.h:489
+ }
+#endif
+};
----------------
This block is long enough that we can't easily see what `#if` the `#endif` relates to.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D103433/new/
https://reviews.llvm.org/D103433
More information about the libcxx-commits
mailing list