libstdc++: Remove noexcept from match_results comparisons (PR 94627)
These functions can't be noexcept because the iterators stored in the sub_match objects can throw on any operation. libstdc++-v3/ChangeLog: PR libstdc++/94627 * include/bits/regex.h (operator==, operator!=): Remove noexcept equality comparisons for match_results. * testsuite/28_regex/match_results/94627.cc: New test.
This commit is contained in:
parent
039a630d78
commit
a1a0dc4548
@ -2099,7 +2099,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
||||
template<typename _Bi_iter, typename _Alloc>
|
||||
inline bool
|
||||
operator==(const match_results<_Bi_iter, _Alloc>& __m1,
|
||||
const match_results<_Bi_iter, _Alloc>& __m2) noexcept
|
||||
const match_results<_Bi_iter, _Alloc>& __m2)
|
||||
{
|
||||
if (__m1.ready() != __m2.ready())
|
||||
return false;
|
||||
@ -2124,7 +2124,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
||||
template<typename _Bi_iter, class _Alloc>
|
||||
inline bool
|
||||
operator!=(const match_results<_Bi_iter, _Alloc>& __m1,
|
||||
const match_results<_Bi_iter, _Alloc>& __m2) noexcept
|
||||
const match_results<_Bi_iter, _Alloc>& __m2)
|
||||
{ return !(__m1 == __m2); }
|
||||
#endif
|
||||
|
||||
|
75
libstdc++-v3/testsuite/28_regex/match_results/94627.cc
Normal file
75
libstdc++-v3/testsuite/28_regex/match_results/94627.cc
Normal file
@ -0,0 +1,75 @@
|
||||
// Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
#include <regex>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
struct iterator
|
||||
{
|
||||
using value_type = char;
|
||||
using difference_type = std::ptrdiff_t;
|
||||
using reference = char&;
|
||||
using pointer = char*;
|
||||
using iterator_category = std::bidirectional_iterator_tag;
|
||||
|
||||
iterator() : ptr() { }
|
||||
explicit iterator(pointer p) : ptr(p) { }
|
||||
|
||||
iterator& operator++() { if (bang) throw 1; ++ptr; return *this; }
|
||||
iterator operator++(int) { auto copy = *this; ++*this; return copy; }
|
||||
iterator& operator--() { if (bang) throw 1; --ptr; return *this; }
|
||||
iterator operator--(int) { auto copy = *this; --*this; return copy; }
|
||||
|
||||
reference operator*() const noexcept { return *ptr; }
|
||||
pointer operator->() const noexcept { return ptr; }
|
||||
|
||||
bool operator==(iterator rhs) const noexcept { return ptr == rhs.ptr; }
|
||||
bool operator!=(iterator rhs) const noexcept { return ptr != rhs.ptr; }
|
||||
|
||||
static bool bang;
|
||||
|
||||
private:
|
||||
pointer ptr;
|
||||
};
|
||||
|
||||
bool iterator::bang = false;
|
||||
|
||||
int main()
|
||||
{
|
||||
char str[] = "abc";
|
||||
std::regex r(str);
|
||||
std::match_results<iterator> m;
|
||||
std::regex_match(iterator(str), iterator(str+3), m, r);
|
||||
iterator::bang = true;
|
||||
bool caught = false;
|
||||
try {
|
||||
(void) (m == m);
|
||||
} catch (int) {
|
||||
caught = true;
|
||||
}
|
||||
VERIFY( caught );
|
||||
caught = false;
|
||||
|
||||
try {
|
||||
(void) (m != m);
|
||||
} catch (int) {
|
||||
caught = true;
|
||||
}
|
||||
VERIFY( caught );
|
||||
}
|
Loading…
Reference in New Issue
Block a user