re PR libstdc++/89608 (Undetected iterator invalidations on unordered containers...
authorFrançois Dumont <fdumont@gcc.gnu.org>
Fri, 8 Mar 2019 05:37:50 +0000 (05:37 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Fri, 8 Mar 2019 05:37:50 +0000 (05:37 +0000)
2019-03-08  François Dumont  <fdumont@gcc.gnu.org>

PR libstdc++/89608
* include/debug/unordered_map (unordered_map<>::_M_check_rehashed):
Invalidate all iterators in case of rehash.
(unordered_multimap<>::_M_check_rehashed): Likewise.
* include/debug/unordered_set
(unordered_set<>::_M_check_rehashed): Likewise.
(unordered_multiset<>::_M_check_rehashed): Likewise.
* testsuite/23_containers/unordered_set/debug/89608_neg.cc: New.

From-SVN: r269478

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/unordered_map
libstdc++-v3/include/debug/unordered_set
libstdc++-v3/testsuite/23_containers/unordered_set/debug/89608_neg.cc [new file with mode: 0644]

index 298b73bf7b4f4da8d0f166c52f16cddba611bc65..d98a591f3a36edbb2cbc9024795d772c0401526c 100644 (file)
@@ -1,3 +1,14 @@
+2019-03-08  François Dumont  <fdumont@gcc.gnu.org>
+
+       PR libstdc++/89608
+       * include/debug/unordered_map (unordered_map<>::_M_check_rehashed):
+       Invalidate all iterators in case of rehash.
+       (unordered_multimap<>::_M_check_rehashed): Likewise.
+       * include/debug/unordered_set
+       (unordered_set<>::_M_check_rehashed): Likewise.
+       (unordered_multiset<>::_M_check_rehashed): Likewise.
+       * testsuite/23_containers/unordered_set/debug/89608_neg.cc: New.
+
 2019-03-07  Andreas Schwab  <schwab@suse.de>
 
        * config/abi/post/riscv64-linux-gnu: New directory.
index 6dde32ae3befe6b595b403ce6ca05af4a92ec63f..0a7485d6e18e8787916f12cc18aa1cc6e24c5480 100644 (file)
@@ -611,7 +611,7 @@ namespace __debug
       _M_check_rehashed(size_type __prev_count)
       {
        if (__prev_count != this->bucket_count())
-         this->_M_invalidate_locals();
+         this->_M_invalidate_all();
       }
 
       void
@@ -1210,7 +1210,7 @@ namespace __debug
       _M_check_rehashed(size_type __prev_count)
       {
        if (__prev_count != this->bucket_count())
-         this->_M_invalidate_locals();
+         this->_M_invalidate_all();
       }
 
       void
index 8d5625e7b36b90db80e3f3363722d584f7979947..a593143aa93872fe45f5309a5f77cc45536aab7e 100644 (file)
@@ -496,7 +496,7 @@ namespace __debug
       _M_check_rehashed(size_type __prev_count)
       {
        if (__prev_count != this->bucket_count())
-         this->_M_invalidate_locals();
+         this->_M_invalidate_all();
       }
 
       void
@@ -1050,7 +1050,7 @@ namespace __debug
       _M_check_rehashed(size_type __prev_count)
       {
        if (__prev_count != this->bucket_count())
-         this->_M_invalidate_locals();
+         this->_M_invalidate_all();
       }
 
       void
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/debug/89608_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/debug/89608_neg.cc
new file mode 100644 (file)
index 0000000..871b1c3
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+//
+// { dg-do run { target c++11 xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+// PR libstdc++/89608
+
+#include <unordered_set>
+
+int main()
+{
+  std::unordered_set<int> myset;
+  myset.reserve(2);
+  myset.insert(0);
+  myset.insert(1);
+
+  int i = 2;
+  for (auto it = myset.begin(), end = myset.end(); it != end; ++it)
+    myset.insert(i++);
+
+  return 0;
+}