From: Jonathan Wakely Date: Tue, 4 Apr 2023 19:28:59 +0000 (+0100) Subject: libstdc++: Define std::sub_match::swap member function (LWG 3204) X-Git-Tag: releases/gcc-12.3.0~61 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=400f16556727b2ec8fe96dc13f44486683e4ecdf;p=thirdparty%2Fgcc.git 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. (cherry picked from commit 44e17b8d8999a658af9f86681504d74a119a5f6f) --- diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index a94ef1900123..097ebf5a2663 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -980,6 +980,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 diff --git a/libstdc++-v3/testsuite/28_regex/sub_match/lwg3204.cc b/libstdc++-v3/testsuite/28_regex/sub_match/lwg3204.cc new file mode 100644 index 000000000000..58ef0df58a14 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/sub_match/lwg3204.cc @@ -0,0 +1,38 @@ +// { dg-do run { target c++11 } } +#include +#include + +// LWG 3204. sub_match::swap only swaps the base class + +int main() +{ + std::sub_match 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().swap(std::declval())) ); +using IS = std::sub_match; +static_assert( ! noexcept(std::declval().swap(std::declval())) );