re PR libstdc++/89608 (Undetected iterator invalidations on unordered containers in debug mode)

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
This commit is contained in:
François Dumont 2019-03-08 05:37:50 +00:00
parent bddee796d0
commit 20a4550ce0
4 changed files with 52 additions and 4 deletions

View 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.

View 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

View 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

View File

@ -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;
}