aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std/charconv
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-11-01 09:48:41 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-11-13 01:10:44 +0000
commitd4ba3b369cbe9bce0a1212670825ecfb99762520 (patch)
tree5ba9b0ae3ec94f3bfe938ad9435b1914b6ea0de6 /libstdc++-v3/include/std/charconv
parent7ce0cee77adf33397d0ba61e7445effd8a5d8fcc (diff)
downloadgcc-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/charconv19
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;