ctype<wchar>::do_is(const wchar_t *, const wchar_t *, mask *) problem
Paolo Carlini
pcarlini@unitus.it
Wed Mar 26 21:11:00 GMT 2003
Hi,
Ulrich Weigand wrote:
>Hello,
>
>I am getting testsuite failures on
>22_locale/ctype/is/wchar_t/wrapped_env.cc.
>
>This test case does:
>
> cc0 = strlit01;
> cc1 = gctype.is(cc0, cc0 + 13, m02);
> VERIFY( cc1 == strlit01 + 13);
>
>which as far as I understand the C++ standard is supposed to fill the m02
>array with codes classifying the characters from strlit01.
>
Indeed.
>However, the implementation that is being called (located in the source
>file config/locale/gnu/ctype_members.cc) does this:
>
> 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;
> }
>
>which doesn't appear to be correct (__m is used as input parameter,
>not output; only the first element of __m is ever used) ...
>
In fact, isn't correct, or better said, perhaps, ctype<wchar_t>::do_is
is still unimplemented: that code it's just a place holder roughly
inspired by do_scan_is below ;)
I'm saying this with confidence basing on the many #if 0 in
testsuite/22_locale/ctype/is/wchar_t/1.cc which effectively disable
most of it...
It's weird, however, that only on s390 that minimal kind-of-test fails:
evidently the returned __lo < __hi.
Since the standard prescribes for do_is to always return __hi, we
can probably "fix" the failure changing for the time being the place
holder like this:
--- ctype_members.cc.~1.9.~ 2003-03-15 05:53:51.000000000 +0100
+++ ctype_members.cc 2003-03-26 22:00:40.000000000 +0100
@@ -141,7 +141,7 @@
{
while (__lo < __hi && !this->do_is(*__m, *__lo))
++__lo;
- return __lo;
+ return __hi;
}
const wchar_t*
Thanks,
Paolo.
More information about the Libstdc++
mailing list