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:
François Dumont 2024-03-17 17:30:58 +01:00
parent b96c543688
commit 5f6e0853c3
2 changed files with 35 additions and 1 deletions

View File

@ -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())

View File

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