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:
parent
39de19551b
commit
7ce69e5a71
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue