diff mbox series

[committed] libstdc++: Fix -Wsign-compare warning in <charconv>

Message ID 20240727114935.460444-1-jwakely@redhat.com
State New
Headers show
Series [committed] libstdc++: Fix -Wsign-compare warning in <charconv> | expand

Commit Message

Jonathan Wakely July 27, 2024, 11:49 a.m. UTC
Tested x86_64-linux. Pushed to trunk.

-- >8 --

Cast ptrdiff_t to size_t to avoid a -Wsign-compare warning. We can check
in __to_chars_i that the ptrdiff_t won't be negative, so that we know
the cast is safe.

libstdc++-v3/ChangeLog:

	* include/std/charconv (__to_chars_16, __to_chars_10)
	(__to_chars_8, __to_chars_2, __to_chars): Cast ptrdiff_t to
	size_t for comparison.
	(__to_chars_i): Check for first >= last instead of first == last
	for initial sanity check.
---
 libstdc++-v3/include/std/charconv | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv
index e516e3b2da8..00c4f206922 100644
--- a/libstdc++-v3/include/std/charconv
+++ b/libstdc++-v3/include/std/charconv
@@ -126,7 +126,7 @@  namespace __detail
 
       const unsigned __len = __to_chars_len(__val, __base);
 
-      if (__builtin_expect((__last - __first) < __len, 0))
+      if (__builtin_expect(size_t(__last - __first) < __len, 0))
 	{
 	  __res.ptr = __last;
 	  __res.ec = errc::value_too_large;
@@ -166,7 +166,7 @@  namespace __detail
 
       const unsigned __len = (__to_chars_len_2(__val) + 3) / 4;
 
-      if (__builtin_expect((__last - __first) < __len, 0))
+      if (__builtin_expect(size_t(__last - __first) < __len, 0))
 	{
 	  __res.ptr = __last;
 	  __res.ec = errc::value_too_large;
@@ -212,7 +212,7 @@  namespace __detail
 
       const unsigned __len = __to_chars_len(__val, 10);
 
-      if (__builtin_expect((__last - __first) < __len, 0))
+      if (__builtin_expect(size_t(__last - __first) < __len, 0))
 	{
 	  __res.ptr = __last;
 	  __res.ec = errc::value_too_large;
@@ -246,7 +246,7 @@  namespace __detail
       else
 	__len = (__to_chars_len_2(__val) + 2) / 3;
 
-      if (__builtin_expect((__last - __first) < __len, 0))
+      if (__builtin_expect(size_t(__last - __first) < __len, 0))
 	{
 	  __res.ptr = __last;
 	  __res.ec = errc::value_too_large;
@@ -288,7 +288,7 @@  namespace __detail
 
       const unsigned __len = __to_chars_len_2(__val);
 
-      if (__builtin_expect((__last - __first) < __len, 0))
+      if (__builtin_expect(size_t(__last - __first) < __len, 0))
 	{
 	  __res.ptr = __last;
 	  __res.ec = errc::value_too_large;
@@ -323,7 +323,7 @@  namespace __detail
       using _Up = __detail::__unsigned_least_t<_Tp>;
       _Up __unsigned_val = __value;
 
-      if (__first == __last) [[__unlikely__]]
+      if (__first >= __last) [[__unlikely__]]
 	return { __last, errc::value_too_large };
 
       if (__value == 0)