law@redhat.com

Benjamin Kosnik bkoz@redhat.com
Thu Sep 25 16:40:00 GMT 2003


This fixes up the uninitialized memory bits that Jeff Law noticed here:
http://gcc.gnu.org/ml/gcc/2003-09/msg00863.html

In addition, it fixes up ctype<wchar_t>::is to work in accordance with
ISO C99. Apparently this was never working, thus the ifdef 0 bits of
that testsuite.

-benjamin

tested x86/linux
tested x86/linux --enable-clocale=generic

2003-09-24  Benjamin Kosnik  <bkoz@redhat.com>

	* config/locale/gnu/ctype_members.cc (ctype<wchar_t>::do_is): Fix.
	* config/locale/generic/ctype_members.cc: Same.
	* testsuite/22_locale/ctype/is/char/1.cc: Initialize mask.
	* testsuite/22_locale/ctype/is/wchar_t/1.cc: Same.

	* config/os/generic/ctype_inline.h: Update.

Index: config/locale/generic/ctype_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/generic/ctype_members.cc,v
retrieving revision 1.4
diff -c -p -r1.4 ctype_members.cc
*** config/locale/generic/ctype_members.cc	5 Jul 2003 04:05:30 -0000	1.4
--- config/locale/generic/ctype_members.cc	25 Sep 2003 07:15:12 -0000
***************
*** 1,6 ****
  // std::ctype implementation details, generic version -*- C++ -*-
  
! // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // std::ctype implementation details, generic version -*- C++ -*-
  
! // Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
*************** namespace std
*** 126,140 ****
    bool
    ctype<wchar_t>::
    do_is(mask __m, char_type __c) const
!   { return static_cast<bool>(iswctype(__c, _M_convert_to_wmask(__m))); }
    
    const wchar_t* 
    ctype<wchar_t>::
!   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
    {
!     while (__lo < __hi && !this->do_is(*__m, *__lo))
!       ++__lo;
!     return __lo;
    }
    
    const wchar_t* 
--- 126,164 ----
    bool
    ctype<wchar_t>::
    do_is(mask __m, char_type __c) const
!   { 
!     bool __ret = true;
!     bool __match_any = false;
!     const size_t __bitmasksize = 10; 
!     for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
!       {
! 	mask __bit = static_cast<mask>(1 << __bitcur);
! 	if (__m & __bit)
! 	  {
! 	    __match_any = true;
! 	    __ret &= iswctype(__c, _M_convert_to_wmask(__bit));
! 	  }
!       }
!     return __ret & __match_any;    
!   }
    
    const wchar_t* 
    ctype<wchar_t>::
!   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
    {
!     for (;__lo < __hi; ++__vec, ++__lo)
!       {
! 	const size_t __bitmasksize = 10; 
! 	mask __m = 0;
! 	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
! 	  { 
! 	    mask __bit = static_cast<mask>(1 << __bitcur);
! 	    if (iswctype(*__lo, _M_convert_to_wmask(__bit)))
! 	      __m |= __bit;
! 	  }
! 	*__vec = __m;
!       }
!     return __hi;
    }
    
    const wchar_t* 
Index: config/locale/gnu/ctype_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/gnu/ctype_members.cc,v
retrieving revision 1.10
diff -c -p -r1.10 ctype_members.cc
*** config/locale/gnu/ctype_members.cc	5 Jul 2003 04:05:30 -0000	1.10
--- config/locale/gnu/ctype_members.cc	25 Sep 2003 07:15:12 -0000
***************
*** 1,6 ****
  // std::ctype implementation details, GNU version -*- C++ -*-
  
! // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // std::ctype implementation details, GNU version -*- C++ -*-
  
! // Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
*************** namespace std
*** 129,147 ****
  
    bool
    ctype<wchar_t>::
!   do_is(mask __m, char_type __c) const
    { 
!     return static_cast<bool>(__iswctype_l(__c, _M_convert_to_wmask(__m), 
! 					  _M_c_locale_ctype)); 
    }
    
    const wchar_t* 
    ctype<wchar_t>::
!   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
    {
!     while (__lo < __hi && !this->do_is(*__m, *__lo))
!       ++__lo;
!     return __lo;
    }
    
    const wchar_t* 
--- 129,174 ----
  
    bool
    ctype<wchar_t>::
!   do_is(mask __m, wchar_t __c) const
    { 
!     // Highest bitmask in ctype_base == 10, but extra in "C"
!     // library for blank.
!     bool __ret = true;
!     bool __match_any = false;
!     const size_t __bitmasksize = 11; 
!     for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
!       {
! 	mask __bit = static_cast<mask>(_ISbit(__bitcur));
! 	if (__m & __bit)
! 	  {
! 	    __match_any = true;
! 	    __ret &= __iswctype_l(__c, _M_convert_to_wmask(__bit), 
! 				  _M_c_locale_ctype); 
! 	  }
!       }
!     return __ret & __match_any;    
    }
    
    const wchar_t* 
    ctype<wchar_t>::
!   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
    {
!     for (;__lo < __hi; ++__vec, ++__lo)
!       {
! 	// Highest bitmask in ctype_base == 10, but extra in "C"
! 	// library for blank.
! 	const size_t __bitmasksize = 11; 
! 	mask __m = 0;
! 	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
! 	  { 
! 	    mask __bit = static_cast<mask>(_ISbit(__bitcur));
! 	    if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), 
! 			     _M_c_locale_ctype))
! 	      __m |= __bit;
! 	  }
! 	*__vec = __m;
!       }
!     return __hi;
    }
    
    const wchar_t* 
Index: config/os/generic/ctype_inline.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/os/generic/ctype_inline.h,v
retrieving revision 1.2
diff -c -p -r1.2 ctype_inline.h
*** config/os/generic/ctype_inline.h	15 Apr 2003 06:36:26 -0000	1.2
--- config/os/generic/ctype_inline.h	25 Sep 2003 07:15:12 -0000
***************
*** 50,62 ****
      else
        {
  	bool __ret = true;
! 	const int __bitmasksize = 11; 
! 	int __bitcur = 0; // Lowest bitmask in ctype_base == 0
! 	for (;__ret && __bitcur < __bitmasksize; ++__bitcur)
  	  {
  	    mask __bit = static_cast<mask>(1 << __bitcur);
  	    if (__m & __bit)
  	      {
  		bool __testis;
  		switch (__bit)
  		  {
--- 50,64 ----
      else
        {
  	bool __ret = true;
! 	bool __any_match = false;
! 	const size_t __bitmasksize = 10; 
! 	size_t __bitcur = 0; // Lowest bitmask in ctype_base == 0
! 	for (;__ret && __bitcur <= __bitmasksize; ++__bitcur)
  	  {
  	    mask __bit = static_cast<mask>(1 << __bitcur);
  	    if (__m & __bit)
  	      {
+ 		__any_match = true;
  		bool __testis;
  		switch (__bit)
  		  {
***************
*** 100,106 ****
  		__ret &= __testis;
  	      }
  	  }
! 	return __ret;
        }
    }
     
--- 102,108 ----
  		__ret &= __testis;
  	      }
  	  }
! 	return __ret & __any_match;
        }
    }
     
***************
*** 114,126 ****
      else
        {
  	// Highest bitmask in ctype_base == 10.
! 	const int __bitmasksize = 11; 
  	for (;__low < __high; ++__vec, ++__low)
  	  {
  	    mask __m = 0;
  	    // Lowest bitmask in ctype_base == 0
! 	    int __i = 0; 
! 	    for (;__i < __bitmasksize; ++__i)
  	      {
  		mask __bit = static_cast<mask>(1 << __i);
  		if (this->is(__bit, *__low))
--- 116,128 ----
      else
        {
  	// Highest bitmask in ctype_base == 10.
! 	const size_t __bitmasksize = 10; 
  	for (;__low < __high; ++__vec, ++__low)
  	  {
  	    mask __m = 0;
  	    // Lowest bitmask in ctype_base == 0
! 	    size_t __i = 0; 
! 	    for (;__i <= __bitmasksize; ++__i)
  	      {
  		mask __bit = static_cast<mask>(1 << __i);
  		if (this->is(__bit, *__low))
Index: testsuite/22_locale/ctype/is/char/1.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/ctype/is/char/1.cc,v
retrieving revision 1.2
diff -c -p -r1.2 1.cc
*** testsuite/22_locale/ctype/is/char/1.cc	23 Sep 2003 20:02:20 -0000	1.2
--- testsuite/22_locale/ctype/is/char/1.cc	25 Sep 2003 07:15:14 -0000
*************** void test01()
*** 97,105 ****
    const char_type* cc2 = NULL;
  
    cc0 = strlit00;
!   m01[0] = m00;
!   m01[1] = m00;
!   m01[2] = m00;
    cc1 = gctype.is(cc0, cc0, m01);
    VERIFY( cc1 == strlit00 );
    VERIFY( m01[0] == m00 );
--- 97,104 ----
    const char_type* cc2 = NULL;
  
    cc0 = strlit00;
!   for (std::size_t i = 0; i < 3; ++i)
!     m01[i] = m00;
    cc1 = gctype.is(cc0, cc0, m01);
    VERIFY( cc1 == strlit00 );
    VERIFY( m01[0] == m00 );
*************** void test01()
*** 107,115 ****
    VERIFY( m01[2] == m00 );
  
    cc0 = strlit00;
!   m01[0] = m00;
!   m01[1] = m00;
!   m01[2] = m00;
    cc2 = gctype.is(cc0, cc0 + 3, m01);
    VERIFY( cc2 == strlit00 + 3);
    VERIFY( m01[0] != m00 );
--- 106,113 ----
    VERIFY( m01[2] == m00 );
  
    cc0 = strlit00;
!   for (std::size_t i = 0; i < 3; ++i)
!     m01[i] = m00;
    cc2 = gctype.is(cc0, cc0 + 3, m01);
    VERIFY( cc2 == strlit00 + 3);
    VERIFY( m01[0] != m00 );
*************** void test01()
*** 120,125 ****
--- 118,125 ----
    VERIFY( gctype.is(m01[2], cc0[2]) );
  
    cc0 = strlit01;
+   for (std::size_t i = 0; i < 13; ++i)
+     m02[i] = m00;
    cc1 = gctype.is(cc0, cc0 + 13, m02);
    VERIFY( cc1 == strlit01 + 13);
    VERIFY( m02[6] != m00 );
Index: testsuite/22_locale/ctype/is/wchar_t/1.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/ctype/is/wchar_t/1.cc,v
retrieving revision 1.2
diff -c -p -r1.2 1.cc
*** testsuite/22_locale/ctype/is/wchar_t/1.cc	23 Sep 2003 20:02:21 -0000	1.2
--- testsuite/22_locale/ctype/is/wchar_t/1.cc	25 Sep 2003 07:15:14 -0000
*************** void test01()
*** 94,123 ****
    std::ctype_base::mask m02[13];
    const char_type* cc0 = strlit00;
    const char_type* cc1 = NULL;
  
    cc0 = strlit00;
!   m01[0] = m00;
!   m01[1] = m00;
!   m01[2] = m00;
    cc1 = gctype.is(cc0, cc0, m01);
    VERIFY( cc1 == strlit00 );
    VERIFY( m01[0] == m00 );
    VERIFY( m01[1] == m00 );
    VERIFY( m01[2] == m00 );
  
! #if 0
    VERIFY( m01[0] != m00 );
    VERIFY( m01[1] != m00 );
    VERIFY( m01[2] != m00 );
    VERIFY( gctype.is(m01[0], cc0[0]) );
    VERIFY( gctype.is(m01[1], cc0[1]) );
    VERIFY( gctype.is(m01[2], cc0[2]) );
- #endif
  
    cc0 = strlit01;
    cc1 = gctype.is(cc0, cc0 + 13, m02);
    VERIFY( cc1 == strlit01 + 13);
- #if 0
    VERIFY( m02[6] != m00 );
    VERIFY( m02[7] != m00 );
    VERIFY( m02[8] != m00 );
--- 94,127 ----
    std::ctype_base::mask m02[13];
    const char_type* cc0 = strlit00;
    const char_type* cc1 = NULL;
+   const char_type* cc2 = NULL;
  
    cc0 = strlit00;
!   for (std::size_t i = 0; i < 3; ++i)
!     m01[i] = m00;
    cc1 = gctype.is(cc0, cc0, m01);
    VERIFY( cc1 == strlit00 );
    VERIFY( m01[0] == m00 );
    VERIFY( m01[1] == m00 );
    VERIFY( m01[2] == m00 );
  
!   cc0 = strlit00;
!   for (std::size_t i = 0; i < 3; ++i)
!     m01[i] = m00;
!   cc2 = gctype.is(cc0, cc0 + 3, m01);
!   VERIFY( cc2 == strlit00 + 3);
    VERIFY( m01[0] != m00 );
    VERIFY( m01[1] != m00 );
    VERIFY( m01[2] != m00 );
    VERIFY( gctype.is(m01[0], cc0[0]) );
    VERIFY( gctype.is(m01[1], cc0[1]) );
    VERIFY( gctype.is(m01[2], cc0[2]) );
  
    cc0 = strlit01;
+   for (std::size_t i = 0; i < 13; ++i)
+     m02[i] = m00;
    cc1 = gctype.is(cc0, cc0 + 13, m02);
    VERIFY( cc1 == strlit01 + 13);
    VERIFY( m02[6] != m00 );
    VERIFY( m02[7] != m00 );
    VERIFY( m02[8] != m00 );
*************** void test01()
*** 131,137 ****
    VERIFY( gctype.is(m02[6], cc0[6]) );
    VERIFY( gctype.is(m02[7], cc0[7]) );
    VERIFY( gctype.is(m02[8], cc0[8]) );
- #endif
  }
  
  int main() 
--- 135,140 ----



More information about the Gcc-patches mailing list