Commit 216f7526 by Tim Shen Committed by Tim Shen

re PR libstdc++/70745 (Wrong handling of regex_constant::match_not_eow and…

re PR libstdc++/70745 (Wrong handling of regex_constant::match_not_eow and regex_constant::match_not_bow)

	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
parent ab0fc037
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> 2016-04-20 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/69703 PR libstdc++/69703
......
...@@ -413,6 +413,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -413,6 +413,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>:: bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
_M_word_boundary() const _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; bool __left_is_word = false;
if (_M_current != _M_begin if (_M_current != _M_begin
|| (_M_flags & regex_constants::match_prev_avail)) || (_M_flags & regex_constants::match_prev_avail))
...@@ -424,13 +429,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -424,13 +429,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool __right_is_word = bool __right_is_word =
_M_current != _M_end && _M_is_word(*_M_current); _M_current != _M_end && _M_is_word(*_M_current);
if (__left_is_word == __right_is_word) return __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;
} }
_GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION
......
...@@ -45,7 +45,20 @@ test02() ...@@ -45,7 +45,20 @@ test02()
"/ghci" "/ghci"
}; };
auto rx = std::regex(re_str, std::regex_constants::grep | std::regex_constants::icase); 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 int
...@@ -53,6 +66,7 @@ main() ...@@ -53,6 +66,7 @@ main()
{ {
test01(); test01();
test02(); test02();
test03();
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment