libstdc++: [_GLIBCXX_DEBUG] Fix std::__niter_wrap behavior

In _GLIBCXX_DEBUG mode the std::__niter_base can remove 2 layers, the
__gnu_debug::_Safe_iterator<> and the __gnu_cxx::__normal_iterator<>.
When std::__niter_wrap is called to build a __gnu_debug::_Safe_iterator<>
from a __gnu_cxx::__normal_iterator<> we then have a consistency issue
as the difference between the 2 iterators will done on a __normal_iterator
on one side and a C pointer on the other. To avoid this problem call
std::__niter_base on both input iterators.

libstdc++-v3/ChangeLog:

	* include/bits/stl_algobase.h (std::__niter_wrap): Add a call to
	std::__niter_base on res iterator.
This commit is contained in:
François Dumont 2024-02-20 19:24:47 +01:00
parent 14ba8d5b87
commit ca5f509903

View file

@ -344,7 +344,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX20_CONSTEXPR
inline _From
__niter_wrap(_From __from, _To __res)
{ return __from + (__res - std::__niter_base(__from)); }
{ return __from + (std::__niter_base(__res) - std::__niter_base(__from)); }
// No need to wrap, iterator already has the right type.
template<typename _Iterator>