diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2022-11-01 09:48:41 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2022-11-13 01:10:44 +0000 |
commit | d4ba3b369cbe9bce0a1212670825ecfb99762520 (patch) | |
tree | 5ba9b0ae3ec94f3bfe938ad9435b1914b6ea0de6 /libstdc++-v3/include/std/charconv | |
parent | 7ce0cee77adf33397d0ba61e7445effd8a5d8fcc (diff) | |
download | gcc-d4ba3b369cbe9bce0a1212670825ecfb99762520.zip gcc-d4ba3b369cbe9bce0a1212670825ecfb99762520.tar.gz gcc-d4ba3b369cbe9bce0a1212670825ecfb99762520.tar.bz2 |
libstdc++: Allow std::to_chars for 128-bit integers in strict mode
This allows std::format to support __int128 when __STRICT_ANSI__ is
defined, which previously failed because __int128 is not an integral
type in strict mode.
With these changes, std::to_chars still rejects 128-bit integers in
strict mode, but std::format will be able to use __detail::__to_chars_i
for unsigned __int128.
libstdc++-v3/ChangeLog:
* include/bits/charconv.h (__integer_to_chars_is_unsigned):
New variable template.
(__to_chars_len, __to_chars_10_impl): Use variable template in
assertions to allow unsigned __int128 in strict mode.
* include/std/charconv (__to_chars, __to_chars_16)
(__to_chars_10, __to_chars_8, __to_chars_2): Likewise.
Diffstat (limited to 'libstdc++-v3/include/std/charconv')
-rw-r--r-- | libstdc++-v3/include/std/charconv | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv index c5ed6fa..8f02395 100644 --- a/libstdc++-v3/include/std/charconv +++ b/libstdc++-v3/include/std/charconv @@ -88,6 +88,10 @@ namespace __detail using __integer_to_chars_result_type = enable_if_t<__or_<__is_signed_integer<_Tp>, __is_unsigned_integer<_Tp>, +#if defined __SIZEOF_INT128__ && defined __STRICT_ANSI__ + is_same<_Tp, signed __int128>, + is_same<_Tp, unsigned __int128>, +#endif is_same<char, remove_cv_t<_Tp>>>::value, to_chars_result>; @@ -126,8 +130,7 @@ namespace __detail constexpr to_chars_result __to_chars(char* __first, char* __last, _Tp __val, int __base) noexcept { - static_assert(is_integral<_Tp>::value, "implementation bug"); - static_assert(is_unsigned<_Tp>::value, "implementation bug"); + static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug"); to_chars_result __res; @@ -167,8 +170,7 @@ namespace __detail constexpr __integer_to_chars_result_type<_Tp> __to_chars_16(char* __first, char* __last, _Tp __val) noexcept { - static_assert(is_integral<_Tp>::value, "implementation bug"); - static_assert(is_unsigned<_Tp>::value, "implementation bug"); + static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug"); to_chars_result __res; @@ -214,8 +216,7 @@ namespace __detail constexpr __integer_to_chars_result_type<_Tp> __to_chars_10(char* __first, char* __last, _Tp __val) noexcept { - static_assert(is_integral<_Tp>::value, "implementation bug"); - static_assert(is_unsigned<_Tp>::value, "implementation bug"); + static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug"); to_chars_result __res; @@ -238,8 +239,7 @@ namespace __detail constexpr __integer_to_chars_result_type<_Tp> __to_chars_8(char* __first, char* __last, _Tp __val) noexcept { - static_assert(is_integral<_Tp>::value, "implementation bug"); - static_assert(is_unsigned<_Tp>::value, "implementation bug"); + static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug"); to_chars_result __res; unsigned __len; @@ -292,8 +292,7 @@ namespace __detail constexpr __integer_to_chars_result_type<_Tp> __to_chars_2(char* __first, char* __last, _Tp __val) noexcept { - static_assert(is_integral<_Tp>::value, "implementation bug"); - static_assert(is_unsigned<_Tp>::value, "implementation bug"); + static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug"); to_chars_result __res; |