diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2024-02-14 06:59:12 +0100 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2024-02-17 15:08:01 +0100 |
commit | 9739d7ebf05aefcdd85477900528d8bee69df215 (patch) | |
tree | 8274f75060308fdb69ace83f5ae1aaa24769e202 /libstdc++-v3/include | |
parent | 76aac40f5ecbc9cfb3b8734d181599e1b5a24bdf (diff) | |
download | gcc-9739d7ebf05aefcdd85477900528d8bee69df215.zip gcc-9739d7ebf05aefcdd85477900528d8bee69df215.tar.gz gcc-9739d7ebf05aefcdd85477900528d8bee69df215.tar.bz2 |
libstdc++: [_GLIBCXX_DEBUG] Fix std::__niter_base behavior
std::__niter_base is used in _GLIBCXX_DEBUG mode to remove _Safe_iterator<>
wrapper on random access iterators. But doing so it should also preserve original
behavior to remove __normal_iterator wrapper.
libstdc++-v3/ChangeLog:
* include/bits/stl_algobase.h (std::__niter_base): Redefine the overload
definitions for __gnu_debug::_Safe_iterator.
* include/debug/safe_iterator.tcc (std::__niter_base): Adapt declarations.
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 16 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/safe_iterator.tcc | 18 |
2 files changed, 32 insertions, 2 deletions
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index e7207f6..0f73da1 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -317,12 +317,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value) { return __it; } +#if __cplusplus < 201103L template<typename _Ite, typename _Seq> - _GLIBCXX20_CONSTEXPR _Ite __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, std::random_access_iterator_tag>&); + template<typename _Ite, typename _Cont, typename _Seq> + _Ite + __niter_base(const ::__gnu_debug::_Safe_iterator< + ::__gnu_cxx::__normal_iterator<_Ite, _Cont>, _Seq, + std::random_access_iterator_tag>&); +#else + template<typename _Ite, typename _Seq> + _GLIBCXX20_CONSTEXPR + decltype(std::__niter_base(std::declval<_Ite>())) + __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, + std::random_access_iterator_tag>&) + noexcept(std::is_nothrow_copy_constructible<_Ite>::value); +#endif + // Reverse the __niter_base transformation to get a // __normal_iterator back again (this assumes that __normal_iterator // is only used to wrap random access iterators, like pointers). diff --git a/libstdc++-v3/include/debug/safe_iterator.tcc b/libstdc++-v3/include/debug/safe_iterator.tcc index 6eb70cb..a8b2423 100644 --- a/libstdc++-v3/include/debug/safe_iterator.tcc +++ b/libstdc++-v3/include/debug/safe_iterator.tcc @@ -235,13 +235,29 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#if __cplusplus < 201103L template<typename _Ite, typename _Seq> - _GLIBCXX20_CONSTEXPR _Ite __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, std::random_access_iterator_tag>& __it) { return __it.base(); } + template<typename _Ite, typename _Cont, typename _DbgSeq> + _Ite + __niter_base(const ::__gnu_debug::_Safe_iterator< + ::__gnu_cxx::__normal_iterator<_Ite, _Cont>, _DbgSeq, + std::random_access_iterator_tag>& __it) + { return __it.base().base(); } +#else + template<typename _Ite, typename _Seq> + _GLIBCXX20_CONSTEXPR + decltype(std::__niter_base(std::declval<_Ite>())) + __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, + std::random_access_iterator_tag>& __it) + noexcept(std::is_nothrow_copy_constructible<_Ite>::value) + { return std::__niter_base(__it.base()); } +#endif + template<bool _IsMove, typename _Ite, typename _Seq, typename _Cat, typename _OI> _GLIBCXX20_CONSTEXPR |