Revert r216497: "[libcxx] Fix ctype_byname<wchar_t>::do_is() mask checking."

After discussing implementing more tests for this with @danalbert & @mclow, I
realized this change is not correct.

The C++ standard requires do_is() to behave as if it were a loop that checked
is(). Furthermore, it requires is() to check "The first form returns the result
of the expression (M & m) != 0; i.e., true if the character has the
characteristics specified"... which the reverted patch definitely does not
conform to. Even further, furthermore, this requires that ctype's mask be an
actual bitmask, unlike what android and newlib provide for _ctype_.

Fixing the original bug that instigated this patch remains TBD.

llvm-svn: 216508
This commit is contained in:
Jonathan Roelofs 2014-08-27 00:39:47 +00:00
parent 10dcff81be
commit 16bb38907c
1 changed files with 30 additions and 30 deletions

View File

@ -1180,16 +1180,16 @@ ctype_byname<wchar_t>::do_is(mask m, char_type c) const
#else
bool result = false;
wint_t ch = static_cast<wint_t>(c);
if ((m & space) == space) result |= (iswspace_l(ch, __l) != 0);
if ((m & print) == print) result |= (iswprint_l(ch, __l) != 0);
if ((m & cntrl) == cntrl) result |= (iswcntrl_l(ch, __l) != 0);
if ((m & upper) == upper) result |= (iswupper_l(ch, __l) != 0);
if ((m & lower) == lower) result |= (iswlower_l(ch, __l) != 0);
if ((m & alpha) == alpha) result |= (iswalpha_l(ch, __l) != 0);
if ((m & digit) == digit) result |= (iswdigit_l(ch, __l) != 0);
if ((m & punct) == punct) result |= (iswpunct_l(ch, __l) != 0);
if ((m & xdigit) == xdigit) result |= (iswxdigit_l(ch, __l) != 0);
if ((m & blank) == blank) result |= (iswblank_l(ch, __l) != 0);
if (m & space) result |= (iswspace_l(ch, __l) != 0);
if (m & print) result |= (iswprint_l(ch, __l) != 0);
if (m & cntrl) result |= (iswcntrl_l(ch, __l) != 0);
if (m & upper) result |= (iswupper_l(ch, __l) != 0);
if (m & lower) result |= (iswlower_l(ch, __l) != 0);
if (m & alpha) result |= (iswalpha_l(ch, __l) != 0);
if (m & digit) result |= (iswdigit_l(ch, __l) != 0);
if (m & punct) result |= (iswpunct_l(ch, __l) != 0);
if (m & xdigit) result |= (iswxdigit_l(ch, __l) != 0);
if (m & blank) result |= (iswblank_l(ch, __l) != 0);
return result;
#endif
}
@ -1238,16 +1238,16 @@ ctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type*
break;
#else
wint_t ch = static_cast<wint_t>(*low);
if ((m & space) == space && iswspace_l(ch, __l)) break;
if ((m & print) == print && iswprint_l(ch, __l)) break;
if ((m & cntrl) == cntrl && iswcntrl_l(ch, __l)) break;
if ((m & upper) == upper && iswupper_l(ch, __l)) break;
if ((m & lower) == lower && iswlower_l(ch, __l)) break;
if ((m & alpha) == alpha && iswalpha_l(ch, __l)) break;
if ((m & digit) == digit && iswdigit_l(ch, __l)) break;
if ((m & punct) == punct && iswpunct_l(ch, __l)) break;
if ((m & xdigit) == xdigit && iswxdigit_l(ch, __l)) break;
if ((m & blank) == blank && iswblank_l(ch, __l)) break;
if (m & space && iswspace_l(ch, __l)) break;
if (m & print && iswprint_l(ch, __l)) break;
if (m & cntrl && iswcntrl_l(ch, __l)) break;
if (m & upper && iswupper_l(ch, __l)) break;
if (m & lower && iswlower_l(ch, __l)) break;
if (m & alpha && iswalpha_l(ch, __l)) break;
if (m & digit && iswdigit_l(ch, __l)) break;
if (m & punct && iswpunct_l(ch, __l)) break;
if (m & xdigit && iswxdigit_l(ch, __l)) break;
if (m & blank && iswblank_l(ch, __l)) break;
#endif
}
return low;
@ -1263,16 +1263,16 @@ ctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type
break;
#else
wint_t ch = static_cast<wint_t>(*low);
if ((m & space) == space && iswspace_l(ch, __l)) continue;
if ((m & print) == print && iswprint_l(ch, __l)) continue;
if ((m & cntrl) == cntrl && iswcntrl_l(ch, __l)) continue;
if ((m & upper) == upper && iswupper_l(ch, __l)) continue;
if ((m & lower) == lower && iswlower_l(ch, __l)) continue;
if ((m & alpha) == alpha && iswalpha_l(ch, __l)) continue;
if ((m & digit) == digit && iswdigit_l(ch, __l)) continue;
if ((m & punct) == punct && iswpunct_l(ch, __l)) continue;
if ((m & xdigit) == xdigit && iswxdigit_l(ch, __l)) continue;
if ((m & blank) == blank && iswblank_l(ch, __l)) continue;
if (m & space && iswspace_l(ch, __l)) continue;
if (m & print && iswprint_l(ch, __l)) continue;
if (m & cntrl && iswcntrl_l(ch, __l)) continue;
if (m & upper && iswupper_l(ch, __l)) continue;
if (m & lower && iswlower_l(ch, __l)) continue;
if (m & alpha && iswalpha_l(ch, __l)) continue;
if (m & digit && iswdigit_l(ch, __l)) continue;
if (m & punct && iswpunct_l(ch, __l)) continue;
if (m & xdigit && iswxdigit_l(ch, __l)) continue;
if (m & blank && iswblank_l(ch, __l)) continue;
break;
#endif
}