regex.h (regex_iterator::regex_iterator()): Define end() as _M_pregex == nullptr.

* libstdc++-v3/include/bits/regex.h (regex_iterator::regex_iterator()):
	Define end() as _M_pregex == nullptr.
	* libstdc++-v3/include/bits/regex.tcc (regex_iterator::operator==(),
	regex_iterator::operator++()): Fix operator==() and operator++() to
	look at null-ness of _M_pregex on both sides.
	* testsuite/28_regex/regression.cc: New testcase.

From-SVN: r242025
This commit is contained in:
Tim Shen 2016-11-09 22:11:32 +00:00 committed by Tim Shen
parent 39de19551b
commit 7ce69e5a71
4 changed files with 41 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2016-11-09 Tim Shen <timshen@google.com>
* libstdc++-v3/include/bits/regex.h (regex_iterator::regex_iterator()):
Define end() as _M_pregex == nullptr.
* libstdc++-v3/include/bits/regex.tcc (regex_iterator::operator==(),
regex_iterator::operator++()): Fix operator==() and operator++() to
look at null-ness of _M_pregex on both sides.
* testsuite/28_regex/regression.cc: New testcase.
2016-11-07 Jason Merrill <jason@redhat.com> 2016-11-07 Jason Merrill <jason@redhat.com>
* include/bits/c++config (_GLIBCXX_NOEXCEPT_PARM) * include/bits/c++config (_GLIBCXX_NOEXCEPT_PARM)

View File

@ -2454,7 +2454,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
* one-past-the-end of a range. * one-past-the-end of a range.
*/ */
regex_iterator() regex_iterator()
: _M_match() : _M_pregex()
{ } { }
/** /**

View File

@ -496,12 +496,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
regex_iterator<_Bi_iter, _Ch_type, _Rx_traits>:: regex_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
operator==(const regex_iterator& __rhs) const operator==(const regex_iterator& __rhs) const
{ {
return (_M_match.empty() && __rhs._M_match.empty()) if (_M_pregex == nullptr && __rhs._M_pregex == nullptr)
|| (_M_begin == __rhs._M_begin return true;
&& _M_end == __rhs._M_end return _M_pregex == __rhs._M_pregex
&& _M_pregex == __rhs._M_pregex && _M_begin == __rhs._M_begin
&& _M_flags == __rhs._M_flags && _M_end == __rhs._M_end
&& _M_match[0] == __rhs._M_match[0]); && _M_flags == __rhs._M_flags
&& _M_match[0] == __rhs._M_match[0];
} }
template<typename _Bi_iter, template<typename _Bi_iter,
@ -525,7 +526,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
if (__start == _M_end) if (__start == _M_end)
{ {
_M_match = value_type(); _M_pregex = nullptr;
return *this; return *this;
} }
else else
@ -558,7 +559,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_match._M_begin = _M_begin; _M_match._M_begin = _M_begin;
} }
else else
_M_match = value_type(); _M_pregex = nullptr;
} }
return *this; return *this;
} }

View File

@ -72,6 +72,27 @@ test05()
VERIFY(regex_match_debug("-", std::regex("[a-]"))); VERIFY(regex_match_debug("-", std::regex("[a-]")));
} }
// PR libstdc++/78236
void
test06()
{
char const s[] = "afoo";
std::basic_regex<char> r("(f+)");
{
std::cregex_iterator i(s, s+sizeof(s), r);
std::cregex_iterator j(s, s+sizeof(s), r);
VERIFY(i == j);
}
// The iterator manipulation code must be repeated in the same scope
// to expose the undefined read during the execution of the ==
// operator (stack location reuse)
{
std::cregex_iterator i(s, s+sizeof(s), r);
std::cregex_iterator j;
VERIFY(!(i == j));
}
}
int int
main() main()
{ {
@ -80,6 +101,7 @@ main()
test03(); test03();
test04(); test04();
test05(); test05();
test06();
return 0; return 0;
} }