From: François Dumont Date: Wed, 10 Jan 2024 18:06:48 +0000 (+0100) Subject: libstdc++: [_GLIBCXX_DEBUG] Fix assignment of value-initialized iterator [PR112477] X-Git-Tag: basepoints/gcc-15~2988 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46afbeb81414302829fbf10c107e5466a3cf44d7;p=thirdparty%2Fgcc.git 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 --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 54092f541baf..5d6bb5b7547a 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 000000000000..bde613b8905a --- /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); +}