From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id BDA683858D35; Mon, 11 Oct 2021 19:37:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BDA683858D35 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-4325] libstdc++: Fix std::match_results::end() for failed matches [PR102667] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 008e7397dad971c03c08fc1b0a4a98fddccaaed8 X-Git-Newrev: 84088dc4bb6a546c896a068dc201463493babf43 Message-Id: <20211011193717.BDA683858D35@sourceware.org> Date: Mon, 11 Oct 2021 19:37:17 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Oct 2021 19:37:17 -0000 https://gcc.gnu.org/g:84088dc4bb6a546c896a068dc201463493babf43 commit r12-4325-g84088dc4bb6a546c896a068dc201463493babf43 Author: Jonathan Wakely Date: Mon Oct 11 09:07:15 2021 +0100 libstdc++: Fix std::match_results::end() for failed matches [PR102667] The end() function needs to consider whether the underlying vector is empty, not whether the match_results object is empty. That's because the underlying vector will always contain at least three elements for a match_results object that is "ready". It contains three extra elements which are stored in the vector but are not considered part of sequence, and so should not be part of the [begin(),end()) range. libstdc++-v3/ChangeLog: PR libstdc++/102667 * include/bits/regex.h (match_result::empty()): Optimize by calling the base function directly. (match_results::end()): Check _Base_type::empty() not empty(). * testsuite/28_regex/match_results/102667.C: New test. Diff: --- libstdc++-v3/include/bits/regex.h | 4 +-- .../testsuite/28_regex/match_results/102667.C | 39 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index ff908da3e94..bf02bff7c49 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -1828,7 +1828,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 */ _GLIBCXX_NODISCARD bool empty() const noexcept - { return size() == 0; } + { return _Unchecked::size() <= 3; } ///@} @@ -1946,7 +1946,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 */ const_iterator end() const noexcept - { return _Base_type::end() - (empty() ? 0 : 3); } + { return _Base_type::end() - (_Base_type::empty() ? 0 : 3); } /** * @brief Gets an iterator to one-past-the-end of the collection. diff --git a/libstdc++-v3/testsuite/28_regex/match_results/102667.C b/libstdc++-v3/testsuite/28_regex/match_results/102667.C new file mode 100644 index 00000000000..9e38c9edaa4 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/match_results/102667.C @@ -0,0 +1,39 @@ +// { dg-do run { target c++11 } } + +#include +#include + +void +test01() +{ + std::cmatch sm; + VERIFY( sm.empty() ); + VERIFY( sm.size() == 0 ); + VERIFY( sm.begin() == sm.end() ); // PR libstdc++/83600 + + bool matched = std::regex_match("a", sm, std::regex("b")); + VERIFY( ! matched ); + VERIFY( sm.ready() ); + VERIFY( sm.empty() ); + VERIFY( sm.size() == 0 ); + VERIFY( sm.begin() == sm.end() ); // PR libstdc++/102667 + + matched = std::regex_match("a", sm, std::regex("a")); + VERIFY( matched ); + VERIFY( sm.ready() ); + VERIFY( ! sm.empty() ); + VERIFY( sm.size() == 1 ); + VERIFY( (sm.end() - sm.begin()) == 1 ); + + matched = std::regex_search("abcd", sm, std::regex("(b)(c)")); + VERIFY( matched ); + VERIFY( sm.ready() ); + VERIFY( ! sm.empty() ); + VERIFY( sm.size() == 3 ); + VERIFY( (sm.end() - sm.begin()) == 3 ); +} + +int main() +{ + test01(); +}