public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [committed] libstdc++: Use unsigned char argument to std::isdigit
@ 2021-05-05 12:01 Jonathan Wakely
  2021-05-05 19:57 ` François Dumont
  0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Wakely @ 2021-05-05 12:01 UTC (permalink / raw)
  To: libstdc++, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 226 bytes --]

Passing plain char to isdigit is undefined if the value is negative.

libstdc++-v3/ChangeLog:

	* include/std/charconv (__from_chars_alnum): Pass unsigned
	char to std::isdigit.

Tested powerpc64le-linux. Committed to trunk.


[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 834 bytes --]

commit d0d6ca019717305df0ef41e3fe1da48f7f561fac
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed May 5 11:19:55 2021

    libstdc++: Use unsigned char argument to std::isdigit
    
    Passing plain char to isdigit is undefined if the value is negative.
    
    libstdc++-v3/ChangeLog:
    
            * include/std/charconv (__from_chars_alnum): Pass unsigned
            char to std::isdigit.

diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv
index 193702e677a..571be075a6b 100644
--- a/libstdc++-v3/include/std/charconv
+++ b/libstdc++-v3/include/std/charconv
@@ -565,7 +565,7 @@ namespace __detail
       while (__first != __last)
 	{
 	  unsigned char __c = *__first;
-	  if (std::isdigit(__c))
+	  if (std::isdigit(static_cast<unsigned char>(__c)))
 	    __c -= '0';
 	  else
 	    {

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [committed] libstdc++: Use unsigned char argument to std::isdigit
  2021-05-05 12:01 [committed] libstdc++: Use unsigned char argument to std::isdigit Jonathan Wakely
@ 2021-05-05 19:57 ` François Dumont
  2021-05-05 21:14   ` Jonathan Wakely
  0 siblings, 1 reply; 4+ messages in thread
From: François Dumont @ 2021-05-05 19:57 UTC (permalink / raw)
  To: Jonathan Wakely, libstdc++, gcc-patches

On 05/05/21 2:01 pm, Jonathan Wakely via Libstdc++ wrote:
> Passing plain char to isdigit is undefined if the value is negative.
>
> libstdc++-v3/ChangeLog:
>
> 	* include/std/charconv (__from_chars_alnum): Pass unsigned
> 	char to std::isdigit.
>
> Tested powerpc64le-linux. Committed to trunk.
>
        unsigned char __c = *__first;
-      if (std::isdigit(__c))
+      if (std::isdigit(static_cast<unsigned char>(__c)))

I am very curious to know what this static_cast<unsigned char> does on 
__c which is already unsigned char ? If it does I'll just start to hate 
C++ :-)

Maybe you wanted to put it on the previous *__first ?


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [committed] libstdc++: Use unsigned char argument to std::isdigit
  2021-05-05 19:57 ` François Dumont
@ 2021-05-05 21:14   ` Jonathan Wakely
  2021-05-06 12:43     ` Jonathan Wakely
  0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Wakely @ 2021-05-05 21:14 UTC (permalink / raw)
  To: François Dumont; +Cc: libstdc++, gcc-patches

On 05/05/21 21:57 +0200, François Dumont via Libstdc++ wrote:
>On 05/05/21 2:01 pm, Jonathan Wakely via Libstdc++ wrote:
>>Passing plain char to isdigit is undefined if the value is negative.
>>
>>libstdc++-v3/ChangeLog:
>>
>>	* include/std/charconv (__from_chars_alnum): Pass unsigned
>>	char to std::isdigit.
>>
>>Tested powerpc64le-linux. Committed to trunk.
>>
>       unsigned char __c = *__first;
>-      if (std::isdigit(__c))
>+      if (std::isdigit(static_cast<unsigned char>(__c)))
>
>I am very curious to know what this static_cast<unsigned char> does on 
>__c which is already unsigned char ? If it does I'll just start to 
>hate C++ :-)
>
>Maybe you wanted to put it on the previous *__first ?

Ugh, yes, but it's not even needed there because the implicit
conversion is fine.

We do need to fix the isspace calls in src/c++11/debug.cc but this one
was already correct. Thanks!



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [committed] libstdc++: Use unsigned char argument to std::isdigit
  2021-05-05 21:14   ` Jonathan Wakely
@ 2021-05-06 12:43     ` Jonathan Wakely
  0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Wakely @ 2021-05-06 12:43 UTC (permalink / raw)
  To: François Dumont; +Cc: libstdc++, gcc-patches

On 05/05/21 22:14 +0100, Jonathan Wakely wrote:
>On 05/05/21 21:57 +0200, François Dumont via Libstdc++ wrote:
>>On 05/05/21 2:01 pm, Jonathan Wakely via Libstdc++ wrote:
>>>Passing plain char to isdigit is undefined if the value is negative.
>>>
>>>libstdc++-v3/ChangeLog:
>>>
>>>	* include/std/charconv (__from_chars_alnum): Pass unsigned
>>>	char to std::isdigit.
>>>
>>>Tested powerpc64le-linux. Committed to trunk.
>>>
>>       unsigned char __c = *__first;
>>-      if (std::isdigit(__c))
>>+      if (std::isdigit(static_cast<unsigned char>(__c)))
>>
>>I am very curious to know what this static_cast<unsigned char> does 
>>on __c which is already unsigned char ? If it does I'll just start 
>>to hate C++ :-)
>>
>>Maybe you wanted to put it on the previous *__first ?
>
>Ugh, yes, but it's not even needed there because the implicit
>conversion is fine.
>
>We do need to fix the isspace calls in src/c++11/debug.cc but this one
>was already correct. Thanks!

I've reverted that useless change, thanks for noticing it.



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-05-06 12:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-05 12:01 [committed] libstdc++: Use unsigned char argument to std::isdigit Jonathan Wakely
2021-05-05 19:57 ` François Dumont
2021-05-05 21:14   ` Jonathan Wakely
2021-05-06 12:43     ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).