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
This commit is contained in:
parent
ab0fc037f0
commit
216f7526fe
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user