From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1720) id 02E52386F432; Thu, 11 Jan 2024 18:31:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 02E52386F432 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1704997871; bh=JxpCGst8hnY0jVlRHt+k9G9O0m3J4m7e4LBAKsJC/fc=; h=From:To:Subject:Date:From; b=fQdCrbivg5Fq3077Fm5mZc+XET7aoQcE897EntQWxG8ueVtHvYbhdORAb06sOEnNu gL/G7gVDPTzhiAr0ViccWrfYI+U8hIohCjvUTm0EccgzXqLiCWH0wpzLwh36BX+FVm aQC0BheBJC3aC1eMksUz4oij8EdilkeA+3T/6jr4= MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" From: Francois Dumont To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r14-7151] libstdc++: [_GLIBCXX_DEBUG] Fix assignment of value-initialized iterator [PR112477] X-Act-Checkin: gcc X-Git-Author: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Git-Refname: refs/heads/master X-Git-Oldrev: d2cb4693a0b383e971f67feb96d3b48ff997d2d5 X-Git-Newrev: 46afbeb81414302829fbf10c107e5466a3cf44d7 Message-Id: <20240111183111.02E52386F432@sourceware.org> Date: Thu, 11 Jan 2024 18:31:10 +0000 (GMT) List-Id: https://gcc.gnu.org/g:46afbeb81414302829fbf10c107e5466a3cf44d7 commit r14-7151-g46afbeb81414302829fbf10c107e5466a3cf44d7 Author: François Dumont Date: Wed Jan 10 19:06:48 2024 +0100 libstdc++: [_GLIBCXX_DEBUG] Fix assignment of value-initialized iterator [PR112477] Now that _M_Detach do not reset iterator _M_version value we need to reset it when the iterator is attached to a new sequence, even if this sequencer is null when assigning a value-initialized iterator. In this case _M_version shall be resetted to 0. libstdc++-v3/ChangeLog: PR libstdc++/112477 * src/c++11/debug.cc (_Safe_iterator_base::_M_attach): Reset _M_version to 0 if attaching to null sequence. (_Safe_iterator_base::_M_attach_single): Likewise. (_Safe_local_iterator_base::_M_attach): Likewise. (_Safe_local_iterator_base::_M_attach_single): Likewise. * testsuite/23_containers/map/debug/112477.cc: New test case. Reviewed-by: Jonathan Wakely Diff: --- libstdc++-v3/src/c++11/debug.cc | 8 ++++++++ .../testsuite/23_containers/map/debug/112477.cc | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 54092f541ba..5d6bb5b7547 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -437,6 +437,8 @@ namespace __gnu_debug _M_version = _M_sequence->_M_version; _M_sequence->_M_attach(this, __constant); } + else + _M_version = 0; } void @@ -452,6 +454,8 @@ namespace __gnu_debug _M_version = _M_sequence->_M_version; _M_sequence->_M_attach_single(this, __constant); } + else + _M_version = 0; } void @@ -528,6 +532,8 @@ namespace __gnu_debug _M_version = _M_sequence->_M_version; _M_get_container()->_M_attach_local(this, __constant); } + else + _M_version = 0; } void @@ -543,6 +549,8 @@ namespace __gnu_debug _M_version = _M_sequence->_M_version; _M_get_container()->_M_attach_local_single(this, __constant); } + else + _M_version = 0; } void diff --git a/libstdc++-v3/testsuite/23_containers/map/debug/112477.cc b/libstdc++-v3/testsuite/23_containers/map/debug/112477.cc new file mode 100644 index 00000000000..bde613b8905 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/map/debug/112477.cc @@ -0,0 +1,20 @@ +// { dg-do run { target c++11 } } +// { dg-require-debug-mode "" } + +// PR libstdc++/112477 + +#include + +int main() +{ + using M = std::map; + using I = M::iterator; + + M map{ {1, 1}, {2, 2} }; + + I it1 = map.begin(); + it1 = I{}; + + I it2{}; + (void)(it1 == it2); +}