------- Additional Comments From jgrimm2 at us dot ibm dot com 2005-02-14 23:41 ------- Trivial patch. Set _M_narrow_ok to 1 only when memcpy would have given the same results as do_narrow().
Index: locale_facets.h =================================================================== RCS file: /opt/gcc-cvs/gcc/libstdc++-v3/include/bits/locale_facets.h,v retrieving revision 1.85.2.4.2.2 diff -c -3 -p -r1.85.2.4.2.2 locale_facets.h *** locale_facets.h 9 Jun 2004 12:31:52 -0000 1.85.2.4.2.2 --- locale_facets.h 14 Feb 2005 20:30:27 -0000 *************** namespace std *** 1170,1177 **** } // Fill in the narrowing cache and flag whether all values are ! // valid or not. _M_narrow_ok is set to 1 if the whole table is ! // narrowed, 2 if only some values could be narrowed. void _M_narrow_init() const { char __tmp[sizeof(_M_narrow)]; --- 1170,1176 ---- } // Fill in the narrowing cache and flag whether all values are ! // valid or not. _M_narrow_ok is set to 1 if memcpy can be used. void _M_narrow_init() const { char __tmp[sizeof(_M_narrow)]; *************** namespace std *** 1179,1199 **** __tmp[__i] = __i; do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow); ! // Check if any default values were created. Do this by ! // renarrowing with a different default value and comparing. ! bool __consecutive = true; ! for (size_t __j = 0; __j < sizeof(_M_narrow); ++__j) ! if (!_M_narrow[__j]) ! { ! char __c; ! do_narrow(__tmp + __j, __tmp + __j + 1, 1, &__c); ! if (__c == 1) ! { ! __consecutive = false; ! break; ! } ! } ! _M_narrow_ok = __consecutive ? 1 : 2; } }; --- 1178,1188 ---- __tmp[__i] = __i; do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow); ! _M_narrow_ok = 1; ! // Set _M_narrow_ok to 2 if memcpy can't be used. ! if (memcmp(__tmp, _M_narrow, sizeof(_M_narrow))) ! _M_narrow_ok = 2; ! } }; -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19955