Fix a bug in regex_Iterator where it would report zero-length matches forever. Reported as http://llvm.org/PR33681. Thanks to Karen Arutyunov for the report.

llvm-svn: 307171
This commit is contained in:
Marshall Clow 2017-07-05 16:37:19 +00:00
parent c40ca13519
commit 52f4f72fa9
2 changed files with 19 additions and 1 deletions

View File

@ -6142,7 +6142,7 @@ regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
{
__flags_ |= regex_constants::__no_update_pos;
_BidirectionalIterator __start = __match_[0].second;
if (__match_.empty())
if (__match_[0].first == __match_[0].second)
{
if (__start == __end_)
{

View File

@ -95,4 +95,22 @@ int main()
assert((*i2).position() == 0);
assert((*i2).str() == "555-1234");
}
{ // http://llvm.org/PR33681
std::regex rex(".*");
const char foo[] = "foo";
// The -1 is because we don't want the implicit null from the array.
std::cregex_iterator i(std::begin(foo), std::end(foo) - 1, rex);
std::cregex_iterator e;
assert(i != e);
assert((*i).size() == 1);
assert((*i).str() == "foo");
++i;
assert(i != e);
assert((*i).size() == 1);
assert((*i).str() == "");
++i;
assert(i == e);
}
}