re PR libstdc++/70745 (Wrong handling of regex_constant::match_not_eow and regex_cons...
authorTim Shen <timshen@google.com>
Sat, 23 Apr 2016 03:58:37 +0000 (03:58 +0000)
committerTim Shen <timshen@gcc.gnu.org>
Sat, 23 Apr 2016 03:58:37 +0000 (03:58 +0000)
PR libstdc++/70745
* include/bits/regex_executor.tcc (_Executor<>::_M_word_boundary):
Fix the match_not_bow and match_not_eow behavior.
* testsuite/28_regex/regression.cc: Add testcase.

From-SVN: r235382

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/regex_executor.tcc
libstdc++-v3/testsuite/28_regex/regression.cc

index e6934a5972ef10ea387e7daabe1f80ac11fc3f9d..386e83285285245641a7f6bdb189fb8aaf600904 100644 (file)
@@ -1,3 +1,10 @@
+2016-04-22  Tim Shen  <timshen@google.com>
+
+       PR libstdc++/70745
+       * include/bits/regex_executor.tcc (_Executor<>::_M_word_boundary):
+       Fix the match_not_bow and match_not_eow behavior.
+       * testsuite/28_regex/regression.cc: Add testcase.
+
 2016-04-20  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/69703
index 2abd02099db49141050663e8a98457fff8c76e08..6bbcb1b4977d1df26a26d1d1ecce5b81c98e6095 100644 (file)
@@ -413,6 +413,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
     _M_word_boundary() const
     {
+      if (_M_current == _M_begin && (_M_flags & regex_constants::match_not_bow))
+       return false;
+      if (_M_current == _M_end && (_M_flags & regex_constants::match_not_eow))
+       return false;
+
       bool __left_is_word = false;
       if (_M_current != _M_begin
          || (_M_flags & regex_constants::match_prev_avail))
@@ -424,13 +429,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       bool __right_is_word =
         _M_current != _M_end && _M_is_word(*_M_current);
 
-      if (__left_is_word == __right_is_word)
-       return false;
-      if (__left_is_word && !(_M_flags & regex_constants::match_not_eow))
-       return true;
-      if (__right_is_word && !(_M_flags & regex_constants::match_not_bow))
-       return true;
-      return false;
+      return __left_is_word != __right_is_word;
     }
 
 _GLIBCXX_END_NAMESPACE_VERSION
index c9a3402011ef447e29c6c1ded07bd372e79c98ee..d367c8becc1e3c89b0c031af36ff9ea7d090ced4 100644 (file)
@@ -45,7 +45,20 @@ test02()
       "/ghci"
     };
   auto rx = std::regex(re_str, std::regex_constants::grep | std::regex_constants::icase);
-  VERIFY(std::regex_search("/abcd", rx));
+  VERIFY(regex_search_debug("/abcd", rx));
+}
+
+void
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  VERIFY(regex_match_debug("a.", regex(R"(a\b.)"), regex_constants::match_not_eow));
+  VERIFY(regex_match_debug(".a", regex(R"(.\ba)"), regex_constants::match_not_bow));
+  VERIFY(regex_search_debug("a", regex(R"(^\b)")));
+  VERIFY(regex_search_debug("a", regex(R"(\b$)")));
+  VERIFY(!regex_search_debug("a", regex(R"(^\b)"), regex_constants::match_not_bow));
+  VERIFY(!regex_search_debug("a", regex(R"(\b$)"), regex_constants::match_not_eow));
 }
 
 int
@@ -53,6 +66,7 @@ main()
 {
   test01();
   test02();
+  test03();
   return 0;
 }