diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2024-01-10 19:06:48 +0100 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2024-01-11 19:29:37 +0100 |
commit | 46afbeb81414302829fbf10c107e5466a3cf44d7 (patch) | |
tree | ed2480ca692f9915f988c59c0989ba472460b92a | |
parent | d2cb4693a0b383e971f67feb96d3b48ff997d2d5 (diff) | |
download | gcc-46afbeb81414302829fbf10c107e5466a3cf44d7.zip gcc-46afbeb81414302829fbf10c107e5466a3cf44d7.tar.gz gcc-46afbeb81414302829fbf10c107e5466a3cf44d7.tar.bz2 |
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 <jwakely@redhat.com>
-rw-r--r-- | libstdc++-v3/src/c++11/debug.cc | 8 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/map/debug/112477.cc | 20 |
2 files changed, 28 insertions, 0 deletions
diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 54092f5..5d6bb5b 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 0000000..bde613b --- /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 <map> + +int main() +{ + using M = std::map<int, int>; + using I = M::iterator; + + M map{ {1, 1}, {2, 2} }; + + I it1 = map.begin(); + it1 = I{}; + + I it2{}; + (void)(it1 == it2); +} |