From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id AB8D13858D20; Wed, 5 Apr 2023 11:24:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AB8D13858D20 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1680693843; bh=Y1rVFnCn9xAZ8kaDlZXhJcMRN5cogFKV41mEtwMuvac=; h=From:To:Subject:Date:From; b=nSvH1pQV36QVtP48NFya1Ht3TCvduiH7M0i2Qe5dW5usHOXtFcXDeRMIIJPrFrOKy H7g4mJSdIXcSHvxYRmup9bjkMV6mB3T4kspVSK2124d6WFsu8G4MVb/NJeTlpYKM+S 9l+aB1/VSYJeXccSNc1B9GnbWj1C7cTTXwTmlBAI= 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 r13-7009] libstdc++: Define std::sub_match::swap member function (LWG 3204) X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: fdc5abbdcfb65d415af6c40230f8f07872e51e49 X-Git-Newrev: 44e17b8d8999a658af9f86681504d74a119a5f6f Message-Id: <20230405112403.AB8D13858D20@sourceware.org> Date: Wed, 5 Apr 2023 11:24:03 +0000 (GMT) List-Id: https://gcc.gnu.org/g:44e17b8d8999a658af9f86681504d74a119a5f6f commit r13-7009-g44e17b8d8999a658af9f86681504d74a119a5f6f Author: Jonathan Wakely Date: Tue Apr 4 20:28:59 2023 +0100 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. Diff: --- libstdc++-v3/include/bits/regex.h | 10 ++++++ .../testsuite/28_regex/sub_match/lwg3204.cc | 38 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 79903fad1e5..26ac6a21c31 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -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 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 00000000000..58ef0df58a1 --- /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())) );