[gcc(refs/users/ppalka/heads/integer_class_type)] libstdc++: std::ctype fixes for recent versions of NetBSD

Patrick Palka ppalka@gcc.gnu.org
Thu Jan 16 20:38:00 GMT 2020


https://gcc.gnu.org/g:98d56ea8900fdcff8f1987cf2bf499a5b7399857

commit 98d56ea8900fdcff8f1987cf2bf499a5b7399857
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Fri Jan 10 16:01:19 2020 +0000

    libstdc++: std::ctype fixes for recent versions of NetBSD
    
    This removes support for EOL versions of NetBSD and syncs the
    definitions with patches from NetBSD upstream.
    
    The only change here that isn't from upstream is to use _CTYPE_BL for
    the isblank class, which is correct but wasn't previously done either in
    FSF GCC or the NetBSD packages.
    
    2020-01-16  Kai-Uwe Eckhardt  <kuehro@gmx.de>
    	    Matthew Bauer  <mjbauer95@gmail.com>
    	    Jonathan Wakely  <jwakely@redhat.com>
    
    	PR bootstrap/64271 (partial)
    	* config/os/bsd/netbsd/ctype_base.h (ctype_base::mask): Change type
    	to unsigned short.
    	(ctype_base::alpha, ctype_base::digit, ctype_base::xdigit)
    	(ctype_base::print, ctype_base::graph, ctype_base::alnum): Sync
    	definitions with NetBSD upstream.
    	(ctype_base::blank): Use _CTYPE_BL.
    	* config/os/bsd/netbsd/ctype_configure_char.cc (_C_ctype_): Remove
    	Declaration.
    	(ctype<char>::classic_table): Use _C_ctype_tab_ instead of _C_ctype_.
    	(ctype<char>::do_toupper, ctype<char>::do_tolower): Cast char
    	parameters to unsigned char.
    	* config/os/bsd/netbsd/ctype_inline.h (ctype<char>::is): Likewise.

Diff:
---
 libstdc++-v3/ChangeLog                             | 18 ++++++++++
 libstdc++-v3/config/os/bsd/netbsd/ctype_base.h     | 40 +++++++---------------
 .../config/os/bsd/netbsd/ctype_configure_char.cc   | 12 +++----
 libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h   |  2 +-
 4 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index d99c1bb..c37d3b1 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,21 @@
+2020-01-16  Kai-Uwe Eckhardt  <kuehro@gmx.de>
+	    Matthew Bauer  <mjbauer95@gmail.com>
+	    Jonathan Wakely  <jwakely@redhat.com>
+
+	PR bootstrap/64271 (partial)
+	* config/os/bsd/netbsd/ctype_base.h (ctype_base::mask): Change type
+	to unsigned short.
+	(ctype_base::alpha, ctype_base::digit, ctype_base::xdigit)
+	(ctype_base::print, ctype_base::graph, ctype_base::alnum): Sync
+	definitions with NetBSD upstream.
+	(ctype_base::blank): Use _CTYPE_BL.
+	* config/os/bsd/netbsd/ctype_configure_char.cc (_C_ctype_): Remove
+	Declaration.
+	(ctype<char>::classic_table): Use _C_ctype_tab_ instead of _C_ctype_.
+	(ctype<char>::do_toupper, ctype<char>::do_tolower): Cast char
+	parameters to unsigned char.
+	* config/os/bsd/netbsd/ctype_inline.h (ctype<char>::is): Likewise.
+
 2020-01-16  François Dumont  <fdumont@gcc.gnu.org>
 
 	PR libstdc++/91263
diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h b/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
index 340bd8e..28bf232 100644
--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
+++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
@@ -43,35 +43,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     // NB: Offsets into ctype<char>::_M_table force a particular size
     // on the mask type. Because of this, we don't use an enum.
-    typedef unsigned char      	mask;
+    typedef unsigned short      	mask;
 
-#ifndef _CTYPE_U
-    static const mask upper    	= _U;
-    static const mask lower 	= _L;
-    static const mask alpha 	= _U | _L;
-    static const mask digit 	= _N;
-    static const mask xdigit 	= _N | _X;
-    static const mask space 	= _S;
-    static const mask print 	= _P | _U | _L | _N | _B;
-    static const mask graph 	= _P | _U | _L | _N;
-    static const mask cntrl 	= _C;
-    static const mask punct 	= _P;
-    static const mask alnum 	= _U | _L | _N;
-#else
-    static const mask upper    	= _CTYPE_U;
-    static const mask lower 	= _CTYPE_L;
-    static const mask alpha 	= _CTYPE_U | _CTYPE_L;
-    static const mask digit 	= _CTYPE_N;
-    static const mask xdigit 	= _CTYPE_N | _CTYPE_X;
-    static const mask space 	= _CTYPE_S;
-    static const mask print 	= _CTYPE_P | _CTYPE_U | _CTYPE_L | _CTYPE_N | _CTYPE_B;
-    static const mask graph 	= _CTYPE_P | _CTYPE_U | _CTYPE_L | _CTYPE_N;
-    static const mask cntrl 	= _CTYPE_C;
-    static const mask punct 	= _CTYPE_P;
-    static const mask alnum 	= _CTYPE_U | _CTYPE_L | _CTYPE_N;
-#endif
+    static const mask upper	= _CTYPE_U;
+    static const mask lower	= _CTYPE_L;
+    static const mask alpha	= _CTYPE_A;
+    static const mask digit	= _CTYPE_D;
+    static const mask xdigit	= _CTYPE_X;
+    static const mask space	= _CTYPE_S;
+    static const mask print	= _CTYPE_R;
+    static const mask graph	= _CTYPE_G;
+    static const mask cntrl	= _CTYPE_C;
+    static const mask punct	= _CTYPE_P;
+    static const mask alnum	= _CTYPE_A | _CTYPE_D;
 #if __cplusplus >= 201103L
-    static const mask blank 	= space;
+    static const mask blank	= _CTYPE_BL;
 #endif
   };
 
diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc b/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
index 0680bb3..86f7828 100644
--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
+++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
@@ -38,11 +38,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 // Information as gleaned from /usr/include/ctype.h
 
-  extern "C" const u_int8_t _C_ctype_[];
-
   const ctype_base::mask*
   ctype<char>::classic_table() throw()
-  { return _C_ctype_ + 1; }
+  { return _C_ctype_tab_ + 1; }
 
   ctype<char>::ctype(__c_locale, const mask* __table, bool __del,
 		     size_t __refs)
@@ -69,14 +67,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   char
   ctype<char>::do_toupper(char __c) const
-  { return ::toupper((int) __c); }
+  { return ::toupper((int)(unsigned char) __c); }
 
   const char*
   ctype<char>::do_toupper(char* __low, const char* __high) const
   {
     while (__low < __high)
       {
-	*__low = ::toupper((int) *__low);
+	*__low = ::toupper((int)(unsigned char) *__low);
 	++__low;
       }
     return __high;
@@ -84,14 +82,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   char
   ctype<char>::do_tolower(char __c) const
-  { return ::tolower((int) __c); }
+  { return ::tolower((int)(unsigned char) __c); }
 
   const char*
   ctype<char>::do_tolower(char* __low, const char* __high) const
   {
     while (__low < __high)
       {
-	*__low = ::tolower((int) *__low);
+	*__low = ::tolower((int)(unsigned char) *__low);
 	++__low;
       }
     return __high;
diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h b/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h
index 6395433..4536690 100644
--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h
+++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h
@@ -48,7 +48,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   is(const char* __low, const char* __high, mask* __vec) const
   {
     while (__low < __high)
-      *__vec++ = _M_table[*__low++];
+      *__vec++ = _M_table[(unsigned char)*__low++];
     return __high;
   }



More information about the Libstdc++-cvs mailing list