From: François Dumont Date: Fri, 8 Mar 2019 05:37:50 +0000 (+0000) Subject: re PR libstdc++/89608 (Undetected iterator invalidations on unordered containers... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=20a4550ce01ab79ac7cd3412ce669cb9a032ca5e;p=gcc.git re PR libstdc++/89608 (Undetected iterator invalidations on unordered containers in debug mode) 2019-03-08 François Dumont 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 298b73bf7b4..d98a591f3a3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2019-03-08 François Dumont + + 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 * config/abi/post/riscv64-linux-gnu: New directory. diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index 6dde32ae3be..0a7485d6e18 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -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 diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index 8d5625e7b36..a593143aa93 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -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 index 00000000000..871b1c3381d --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/debug/89608_neg.cc @@ -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 +// . +// +// { dg-do run { target c++11 xfail *-*-* } } +// { dg-require-debug-mode "" } + +// PR libstdc++/89608 + +#include + +int main() +{ + std::unordered_set 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; +}