mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-26 19:26:16 +08:00
libstdc++: Fix _Safe_local_iterator<>::_M_valid_range
Unordered container local_iterator range shall not contain any singular iterator unless both iterators are both value-initialized. libstdc++-v3/ChangeLog: * include/debug/safe_local_iterator.tcc (_Safe_local_iterator::_M_valid_range): Add _M_value_initialized and _M_singular checks. * testsuite/23_containers/unordered_set/debug/114316.cc: New test case.
This commit is contained in:
parent
b96c543688
commit
5f6e0853c3
@ -78,7 +78,13 @@ namespace __gnu_debug
|
||||
_M_valid_range(const _Safe_local_iterator& __rhs,
|
||||
std::pair<difference_type, _Distance_precision>& __dist) const
|
||||
{
|
||||
if (!_M_can_compare(__rhs))
|
||||
if (_M_value_initialized() && __rhs._M_value_initialized())
|
||||
{
|
||||
__dist = { 0, __dp_exact };
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_M_singular() || __rhs._M_singular() || !_M_can_compare(__rhs))
|
||||
return false;
|
||||
|
||||
if (bucket() != __rhs.bucket())
|
||||
|
@ -0,0 +1,28 @@
|
||||
// { dg-do run { target c++11 } }
|
||||
// { dg-require-debug-mode "" }
|
||||
|
||||
// PR libstdc++/114316
|
||||
|
||||
#include <unordered_set>
|
||||
#include <algorithm>
|
||||
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void test01()
|
||||
{
|
||||
std::unordered_set<int>::iterator it{};
|
||||
VERIFY( std::find(it, it, 0) == it );
|
||||
}
|
||||
|
||||
void test02()
|
||||
{
|
||||
std::unordered_set<int>::local_iterator it{};
|
||||
VERIFY( std::find(it, it, 0) == it );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user