libstdc++: Define std::sub_match::swap member function (LWG 3204)

This was approved at the C++ meeting in February.

libstdc++-v3/ChangeLog:

	* include/bits/regex.h (sub_match::swap): New function.
	* testsuite/28_regex/sub_match/lwg3204.cc: New test.
This commit is contained in:
Jonathan Wakely
2023-04-04 20:28:59 +01:00
parent fdc5abbdcf
commit 44e17b8d89
2 changed files with 48 additions and 0 deletions
+10
View File
@@ -1006,6 +1006,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
{ return this->_M_str().compare({__s, __n}); }
/// @endcond
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 3204. sub_match::swap only swaps the base class
/// Swap the values of two sub_match objects.
void
swap(sub_match& __s) noexcept(__is_nothrow_swappable<_BiIter>::value)
{
this->pair<_BiIter, _BiIter>::swap(__s);
std::swap(matched, __s.matched);
}
private:
// Simplified basic_string_view for C++11
struct __string_view
@@ -0,0 +1,38 @@
// { dg-do run { target c++11 } }
#include <regex>
#include <testsuite_hooks.h>
// LWG 3204. sub_match::swap only swaps the base class
int main()
{
std::sub_match<const char*> a, b;
a.matched = true;
a.swap(b);
VERIFY( ! a.matched );
VERIFY( b.matched );
}
struct iter
{
using value_type = char;
using difference_type = long;
using pointer = const char*;
using reference = const char&;
using iterator_category = std::bidirectional_iterator_tag;
iter();
iter(const iter&) noexcept(false);
iter& operator++();
iter operator++(int);
iter& operator--();
iter operator--(int);
reference operator*() const;
pointer operator->() const;
};
using CS = std::csub_match;
static_assert( noexcept(std::declval<CS&>().swap(std::declval<CS&>())) );
using IS = std::sub_match<iter>;
static_assert( ! noexcept(std::declval<IS&>().swap(std::declval<IS&>())) );