aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrançois Dumont <fdumont@gcc.gnu.org>2024-01-10 19:06:48 +0100
committerFrançois Dumont <fdumont@gcc.gnu.org>2024-01-11 19:29:37 +0100
commit46afbeb81414302829fbf10c107e5466a3cf44d7 (patch)
treeed2480ca692f9915f988c59c0989ba472460b92a
parentd2cb4693a0b383e971f67feb96d3b48ff997d2d5 (diff)
downloadgcc-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.cc8
-rw-r--r--libstdc++-v3/testsuite/23_containers/map/debug/112477.cc20
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);
+}