On 19/01/15 18:01 -0800, Tim Shen wrote:
PR libstdc++/64649 * include/bits/regex.tcc (regex_traits<>::lookup_collatename, regex_traits<>::lookup_classname): Correctly narrow input chars. * testsuite/28_regex/traits/wchar_t/user_defined.cc: New testcase.
OK for trunk, as this is actually fixing a regression (we did narrow the input range before the last patch for this bug).
--- a/libstdc++-v3/testsuite/28_regex/traits/wchar_t/user_defined.cc +++ b/libstdc++-v3/testsuite/28_regex/traits/wchar_t/user_defined.cc @@ -55,8 +55,32 @@ test01() VERIFY(!regex_match(L"\u2029", re)); } +struct MyCtype : std::ctype<wchar_t> +{ + char + do_narrow(wchar_t c, char dflt) const override + { + if (c >= 256) + return dflt; + return ((char)c)+1; + } +}; + +void +test02() +{ + std::locale loc(std::locale(), new MyCtype); + std::regex_traits<wchar_t> traits; + traits.imbue(loc); + wchar_t wch = L'p'; + VERIFY(traits.lookup_collatename(&wch, &wch+1) == L"q"); + std::wstring ws = L"`kog`"; // chars of "alpha" shifted by 1.
Could this use "digit" instead of "alpha" so it shifts to "chfhs" instead of something with non-alphabetic characters?