diff options
author | Howard Hinnant <hhinnant@apple.com> | 2012-08-02 18:35:07 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2012-08-02 18:35:07 +0000 |
commit | 4df0a6adf63864517279743e335993c45c6e6d62 (patch) | |
tree | 72ad8611aecc8d30bb949057dd93201550e5682f /libcxx/src | |
parent | fab892945960b67a2b90f0964f2b00c032e4c6a3 (diff) | |
download | bcm5719-llvm-4df0a6adf63864517279743e335993c45c6e6d62.tar.gz bcm5719-llvm-4df0a6adf63864517279743e335993c45c6e6d62.zip |
Andrew Morrow: Among the various libc++ tests that currently don't pass on Linux are
localization/locale.categories/category.collate/category.ctype/locale.ctype.byname/is_1.pass.cpp
and scan_is.pass.cpp. The tests fail when the character class being
tested is compound, like ctype_base::alnum or ctype_base::graph,
because the existing series of conditionals in do_is an do_scan_is
will abort too early. For instance, if the character class being
tested is alnum, and the character is numeric, do_is will return false
because iswalpha_l will return false, 'result' becomes false, and the
'true' result from the later call to iswdigit_l ends up being ignored
. A similar problem exists in do_scan_is.
llvm-svn: 161192
Diffstat (limited to 'libcxx/src')
-rw-r--r-- | libcxx/src/locale.cpp | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp index fe994881d46..854fd239cfa 100644 --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -1052,17 +1052,17 @@ ctype_byname<wchar_t>::do_is(mask m, char_type c) const #ifdef _LIBCPP_WCTYPE_IS_MASK return static_cast<bool>(iswctype_l(c, m, __l)); #else - bool result = true; - if (m & space && !iswspace_l(c, __l)) result = false; - if (m & print && !iswprint_l(c, __l)) result = false; - if (m & cntrl && !iswcntrl_l(c, __l)) result = false; - if (m & upper && !iswupper_l(c, __l)) result = false; - if (m & lower && !iswlower_l(c, __l)) result = false; - if (m & alpha && !iswalpha_l(c, __l)) result = false; - if (m & digit && !iswdigit_l(c, __l)) result = false; - if (m & punct && !iswpunct_l(c, __l)) result = false; - if (m & xdigit && !iswxdigit_l(c, __l)) result = false; - if (m & blank && !iswblank_l(c, __l)) result = false; + bool result = false; + if (m & space) result |= (iswspace_l(c, __l) != 0); + if (m & print) result |= (iswprint_l(c, __l) != 0); + if (m & cntrl) result |= (iswcntrl_l(c, __l) != 0); + if (m & upper) result |= (iswupper_l(c, __l) != 0); + if (m & lower) result |= (iswlower_l(c, __l) != 0); + if (m & alpha) result |= (iswalpha_l(c, __l) != 0); + if (m & digit) result |= (iswdigit_l(c, __l) != 0); + if (m & punct) result |= (iswpunct_l(c, __l) != 0); + if (m & xdigit) result |= (iswxdigit_l(c, __l) != 0); + if (m & blank) result |= (iswblank_l(c, __l) != 0); return result; #endif } @@ -1109,17 +1109,16 @@ ctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* if (iswctype_l(*low, m, __l)) break; #else - if (m & space && !iswspace_l(*low, __l)) continue; - if (m & print && !iswprint_l(*low, __l)) continue; - if (m & cntrl && !iswcntrl_l(*low, __l)) continue; - if (m & upper && !iswupper_l(*low, __l)) continue; - if (m & lower && !iswlower_l(*low, __l)) continue; - if (m & alpha && !iswalpha_l(*low, __l)) continue; - if (m & digit && !iswdigit_l(*low, __l)) continue; - if (m & punct && !iswpunct_l(*low, __l)) continue; - if (m & xdigit && !iswxdigit_l(*low, __l)) continue; - if (m & blank && !iswblank_l(*low, __l)) continue; - break; + if (m & space && iswspace_l(*low, __l)) break; + if (m & print && iswprint_l(*low, __l)) break; + if (m & cntrl && iswcntrl_l(*low, __l)) break; + if (m & upper && iswupper_l(*low, __l)) break; + if (m & lower && iswlower_l(*low, __l)) break; + if (m & alpha && iswalpha_l(*low, __l)) break; + if (m & digit && iswdigit_l(*low, __l)) break; + if (m & punct && iswpunct_l(*low, __l)) break; + if (m & xdigit && iswxdigit_l(*low, __l)) break; + if (m & blank && iswblank_l(*low, __l)) break; #endif } return low; |