]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/64649 (regex_traits::lookup_classname() only works with random access...
authorTim Shen <timshen@google.com>
Tue, 3 Feb 2015 08:59:24 +0000 (08:59 +0000)
committerTim Shen <timshen@gcc.gnu.org>
Tue, 3 Feb 2015 08:59:24 +0000 (08:59 +0000)
PR libstdc++/64649
Backported from mainline
2015-01-22  Tim Shen  <timshen@google.com>

* 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.

From-SVN: r220365

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/regex.tcc
libstdc++-v3/testsuite/28_regex/traits/wchar_t/user_defined.cc

index c2d665f67600348157643d0be1a5db3cdd82c333..ba81f03633ca8e9c9488738f4b3983926e61bc0e 100644 (file)
@@ -1,3 +1,13 @@
+2015-02-03  Tim Shen  <timshen@google.com>
+
+       PR libstdc++/64649
+       Backported from mainline
+       2015-01-22  Tim Shen  <timshen@google.com>
+
+       * 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.
+
 2015-01-19  Tim Shen  <timshen@google.com>
 
        PR libstdc++/64649
index 5eeb0e66f74a4475043de32b9b91ad2eb00aa681..792ed9206ce95f542b18aac39bfbd221c07f088e 100644 (file)
@@ -277,7 +277,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          "DEL",
        };
 
-      string __s(__first, __last);
+      string __s;
+      for (; __first != __last; ++__first)
+       __s += __fctyp.narrow(*__first, 0);
+
       for (const auto& __it : __collatenames)
        if (__s == __it)
          return string_type(1, __fctyp.widen(
@@ -319,8 +322,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       };
 
       string __s;
-      for (auto __cur = __first; __cur != __last; ++__cur)
-       __s += __fctyp.narrow(__fctyp.tolower(*__cur), '?');
+      for (; __first != __last; ++__first)
+       __s += __fctyp.narrow(__fctyp.tolower(*__first), 0);
 
       for (const auto& __it : __classnames)
        if (__s == __it.first)
index 7eca2d5474d8142d9c6a5a68b53f81262334d30e..975a943f74c5744ef43bfcddc58db5b968010915 100644 (file)
@@ -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"chfhs"; // chars of "digit" shifted by 1.
+  VERIFY(traits.lookup_classname(ws.begin(), ws.end()) != 0);
+}
+
 int main()
 {
   test01();
+  test02();
   return 0;
 }