diff options
author | Tim Shen <timshen@google.com> | 2016-11-09 22:11:32 +0000 |
---|---|---|
committer | Tim Shen <timshen@gcc.gnu.org> | 2016-11-09 22:11:32 +0000 |
commit | 7ce69e5a7156b6ada7064e6b4e75da82d582982a (patch) | |
tree | 0e81d112ff6e0f52f5581c22bc26db396d352b6d | |
parent | 39de19551b6b39d83ad791a39c72ec51f958b48b (diff) | |
download | gcc-7ce69e5a7156b6ada7064e6b4e75da82d582982a.zip gcc-7ce69e5a7156b6ada7064e6b4e75da82d582982a.tar.gz gcc-7ce69e5a7156b6ada7064e6b4e75da82d582982a.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex.tcc | 17 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/28_regex/regression.cc | 22 |
4 files changed, 41 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 61dafba..f405ccd 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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> * include/bits/c++config (_GLIBCXX_NOEXCEPT_PARM) diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index a7d45e6..aadf312 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -2454,7 +2454,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 * one-past-the-end of a range. */ regex_iterator() - : _M_match() + : _M_pregex() { } /** diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc index 4a3d7c3..3f8969d 100644 --- a/libstdc++-v3/include/bits/regex.tcc +++ b/libstdc++-v3/include/bits/regex.tcc @@ -496,12 +496,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION regex_iterator<_Bi_iter, _Ch_type, _Rx_traits>:: operator==(const regex_iterator& __rhs) const { - return (_M_match.empty() && __rhs._M_match.empty()) - || (_M_begin == __rhs._M_begin - && _M_end == __rhs._M_end - && _M_pregex == __rhs._M_pregex - && _M_flags == __rhs._M_flags - && _M_match[0] == __rhs._M_match[0]); + if (_M_pregex == nullptr && __rhs._M_pregex == nullptr) + return true; + return _M_pregex == __rhs._M_pregex + && _M_begin == __rhs._M_begin + && _M_end == __rhs._M_end + && _M_flags == __rhs._M_flags + && _M_match[0] == __rhs._M_match[0]; } template<typename _Bi_iter, @@ -525,7 +526,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { if (__start == _M_end) { - _M_match = value_type(); + _M_pregex = nullptr; return *this; } else @@ -558,7 +559,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_match._M_begin = _M_begin; } else - _M_match = value_type(); + _M_pregex = nullptr; } return *this; } diff --git a/libstdc++-v3/testsuite/28_regex/regression.cc b/libstdc++-v3/testsuite/28_regex/regression.cc index effb356..5214fe3 100644 --- a/libstdc++-v3/testsuite/28_regex/regression.cc +++ b/libstdc++-v3/testsuite/28_regex/regression.cc @@ -72,6 +72,27 @@ test05() 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 main() { @@ -80,6 +101,7 @@ main() test03(); test04(); test05(); + test06(); return 0; } |