[EMAIL PROTECTED] wrote:
Author: faridz
Date: Mon Apr 14 01:38:10 2008
New Revision: 647698
URL: http://svn.apache.org/viewvc?rev=647698&view=rev
Log:
2008-04-14 Farid Zaripov <[EMAIL PROTECTED]>
STDXX-854
* include/loc/_ctype.h (narrow): Don't cast __c to unsigned char,
use __c as index in _C_narrow_tab.
This change is causing warnings in HP aCC builds:
"$TOPDIR/include/loc/_ctype.h", line 545: warning #2186-D:
pointless comparison of unsigned integer with zero
if ( 0 <= __c
^
""$TOPDIR/include/loc/_ctype.h", line 555: warning #2186-D:
pointless comparison of unsigned integer with zero
if ( 0 <= __c
^
I don't see how we're going to be able to silence these kinds
of signed/unsigned warnings without a cast. Could we fix this
by casting __c to the unsigned form of wchar_t's underlying
type and keeping the original code, something like:
#if _RWSTD_WCHAR_MIN < 0
// avoid sign extension when converting wchar_t
# if _RWSTD_CHAR_SIZE == _RWSTD_WCHAR_SIZE
typedef unsigned char _UIntT;
# elif _RWSTD_SHRT_SIZE == _RWSTD_WCHAR_SIZE
typedef unsigned short _UIntT;
# elif _RWSTD_INT_SIZE == _RWSTD_WCHAR_SIZE
typedef unsigned int _UIntT;
# else
typedef _RWSTD_SIZE_T _UIntT;
# endif
#else
typedef _RWSTD_SIZE_T _UIntT;
#endif
const _RWSTD_SIZE_T __inx = _RWSTD_STATIC_CAST (_UIntT, __c);
if ( __inx < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
&& _C_narrow_tab [__inx])
return _C_narrow_tab [__inx];
I suspect that there are other places in the library where we need
to play tricks like this so we might even want to consider adding
a general purpose config macro/typedef for this. wint_t isn't good
enough because it might be wider than wchar_t. How does
_RWSTD_UWCHAR_INT_T sound?
Martin
Modified:
stdcxx/trunk/include/loc/_ctype.h
Modified: stdcxx/trunk/include/loc/_ctype.h
URL:
http://svn.apache.org/viewvc/stdcxx/trunk/include/loc/_ctype.h?rev=647698&r1=647697&r2=647698&view=diff
==============================================================================
--- stdcxx/trunk/include/loc/_ctype.h (original)
+++ stdcxx/trunk/include/loc/_ctype.h Mon Apr 14 01:38:10 2008
@@ -541,20 +541,21 @@
inline char
ctype<wchar_t>::narrow (char_type __c, char __dfault) const
{
- const _RWSTD_SIZE_T __inx = _RWSTD_STATIC_CAST (unsigned char, __c);
-
// optimize away all but the first call to the virtual do_widen()
- if ( __inx < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
- && _C_narrow_tab [__inx])
- return _C_narrow_tab [__inx];
+ if ( 0 <= __c
+ && __c < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
+ && _C_narrow_tab [__c])
+ return _C_narrow_tab [__c];
// template argument provided to work around an HP aCC bug (PR #27087)
ctype<wchar_t>* const __self = _RWSTD_CONST_CAST (ctype<wchar_t>*, this);
const char __ch = do_narrow (__c, __dfault);
- if (__inx < sizeof _C_narrow_tab / sizeof *_C_narrow_tab && __ch != __dfault)
- __self->_C_narrow_tab [__inx] = __ch;
+ if ( 0 <= __c
+ && __c < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
+ && __ch != __dfault)
+ __self->_C_narrow_tab [__c] = __ch;
return __ch;
}