https://gcc.gnu.org/g:5826d8444caa4dfeda28f95d72fa658b0b3c771c
commit r17-2400-g5826d8444caa4dfeda28f95d72fa658b0b3c771c Author: François Dumont <[email protected]> Date: Tue Jul 14 20:57:54 2026 +0200 libstdc++: [_GLIBCXX_DEBUG] Make constant evaluation compatible Cleanup _Safe_iterator and _Safe_local_iterator implementations. Use base constructor for the special _Unchecked constructor. Remove intermediate typedefs, use directly the template parameter type and the base class. libstdc++-v3/ChangeLog: * include/debug/safe_iterator.h (_Safe_iterator::_Iter_base, _Safe_iterator::_Safe_base): Remove. (_Safe_iterator(const _Safe_iterator&, _Unchecked)): Delegate to correct base classes constructors. * include/debug/safe_local_iterator.h (_Safe_local_iterator::_Iter_base, _Safe_local_iterator::_Safe_base): Remove. (_Safe_local_iterator(const _Safe_local_iterator&, _Unchecked)): Delegate to the correct base classes constructors. Diff: --- libstdc++-v3/include/debug/safe_iterator.h | 26 +++++++++--------------- libstdc++-v3/include/debug/safe_local_iterator.h | 26 ++++++++++-------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 77e45ae073eb..ceda5575a523 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -131,9 +131,6 @@ namespace __gnu_debug : private _Iterator, public _Safe_iterator_base { - typedef _Iterator _Iter_base; - typedef _Safe_iterator_base _Safe_base; - typedef std::iterator_traits<_Iterator> _Traits; protected: @@ -149,11 +146,8 @@ namespace __gnu_debug _GLIBCXX20_CONSTEXPR _Safe_iterator(const _Safe_iterator& __x, _Unchecked) _GLIBCXX_NOEXCEPT - : _Iter_base(__x.base()), _Safe_base() - { - if (!std::__is_constant_evaluated()) - _M_attach(__x._M_sequence); - } + : _Iterator(__x), _Safe_iterator_base(__x, _S_constant()) + { } public: typedef _Iterator iterator_type; @@ -169,7 +163,7 @@ namespace __gnu_debug /// @post the iterator is singular and unattached _GLIBCXX20_CONSTEXPR - _Safe_iterator() _GLIBCXX_NOEXCEPT : _Iter_base() { } + _Safe_iterator() _GLIBCXX_NOEXCEPT : _Iterator() { } /** * @brief Safe iterator construction from an unsafe iterator and @@ -181,7 +175,7 @@ namespace __gnu_debug _GLIBCXX20_CONSTEXPR _Safe_iterator(_Iterator __i, const _Safe_sequence_base* __seq) _GLIBCXX_NOEXCEPT - : _Iter_base(__i), _Safe_base(__seq, _S_constant()) + : _Iterator(__i), _Safe_iterator_base(__seq, _S_constant()) { } /** @@ -189,7 +183,7 @@ namespace __gnu_debug */ _GLIBCXX20_CONSTEXPR _Safe_iterator(const _Safe_iterator& __x) _GLIBCXX_NOEXCEPT - : _Iter_base(__x.base()), _Safe_base() + : _Iterator(__x), _Safe_iterator_base() { if (std::__is_constant_evaluated()) return; @@ -211,7 +205,7 @@ namespace __gnu_debug */ _GLIBCXX20_CONSTEXPR _Safe_iterator(_Safe_iterator&& __x) noexcept - : _Iter_base() + : _Iterator() { if (std::__is_constant_evaluated()) { @@ -243,7 +237,7 @@ namespace __gnu_debug std::__are_same<_MutableIterator, _OtherIterator>::__value, _Category>::__type>& __x) _GLIBCXX_NOEXCEPT - : _Iter_base(__x.base()) + : _Iterator(__x.base()) { if (std::__is_constant_evaluated()) return; @@ -446,12 +440,12 @@ namespace __gnu_debug /** Attach iterator to the given sequence. */ void _M_attach(const _Safe_sequence_base* __seq) - { _Safe_base::_M_attach(__seq, _S_constant()); } + { _Safe_iterator_base::_M_attach(__seq, _S_constant()); } /** Likewise, but not thread-safe. */ void _M_attach_single(const _Safe_sequence_base* __seq) - { _Safe_base::_M_attach_single(__seq, _S_constant()); } + { _Safe_iterator_base::_M_attach_single(__seq, _S_constant()); } /// Is the iterator dereferenceable? bool @@ -478,7 +472,7 @@ namespace __gnu_debug /// Is the iterator value-initialized? bool _M_value_initialized() const - { return _M_version == 0 && base() == _Iter_base(); } + { return _M_version == 0 && base() == _Iterator(); } // Can we advance the iterator @p __n steps (@p __n may be negative) bool diff --git a/libstdc++-v3/include/debug/safe_local_iterator.h b/libstdc++-v3/include/debug/safe_local_iterator.h index d37168a040bb..18b7b0b61914 100644 --- a/libstdc++-v3/include/debug/safe_local_iterator.h +++ b/libstdc++-v3/include/debug/safe_local_iterator.h @@ -65,9 +65,6 @@ namespace __gnu_debug : private _Iterator , public _Safe_local_iterator_base { - typedef _Iterator _Iter_base; - typedef _Safe_local_iterator_base _Safe_base; - typedef typename _UContainer::size_type size_type; typedef std::iterator_traits<_Iterator> _Traits; @@ -85,10 +82,9 @@ namespace __gnu_debug struct _Unchecked { }; - _Safe_local_iterator(const _Safe_local_iterator& __x, - _Unchecked) noexcept - : _Iter_base(__x.base()) - { _M_attach(__x._M_safe_container()); } + _Safe_local_iterator(const _Safe_local_iterator& __x, _Unchecked) noexcept + : _Iterator(__x), _Safe_local_iterator_base(__x, _S_constant()) + { } public: typedef _Iterator iterator_type; @@ -99,7 +95,7 @@ namespace __gnu_debug typedef typename _Traits::pointer pointer; /// @post the iterator is singular and unattached - _Safe_local_iterator() noexcept : _Iter_base() { } + _Safe_local_iterator() noexcept : _Iterator() { } /** * @brief Safe iterator construction from an unsafe iterator and @@ -110,14 +106,14 @@ namespace __gnu_debug */ _Safe_local_iterator(_Iterator __i, const _Safe_unordered_container_base* __cont) - : _Iter_base(__i), _Safe_base(__cont, _S_constant()) + : _Iterator(__i), _Safe_local_iterator_base(__cont, _S_constant()) { } /** * @brief Copy construction. */ _Safe_local_iterator(const _Safe_local_iterator& __x) noexcept - : _Iter_base(__x.base()) + : _Iterator(__x) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // DR 408. Is vector<reverse_iterator<char*> > forbidden? @@ -134,7 +130,7 @@ namespace __gnu_debug * @post __x is singular and unattached */ _Safe_local_iterator(_Safe_local_iterator&& __x) noexcept - : _Iter_base() + : _Iterator() { _GLIBCXX_DEBUG_VERIFY(!__x._M_singular() || __x._M_value_initialized(), @@ -157,7 +153,7 @@ namespace __gnu_debug typename __gnu_cxx::__enable_if<_IsConstant::__value && std::__are_same<_MutableIterator, _OtherIterator>::__value, _UContainer>::__type>& __x) noexcept - : _Iter_base(__x.base()) + : _Iterator(__x.base()) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // DR 408. Is vector<reverse_iterator<char*> > forbidden? @@ -321,12 +317,12 @@ namespace __gnu_debug /** Attach iterator to the given unordered container. */ void _M_attach(const _Safe_unordered_container_base* __cont) - { _Safe_base::_M_attach(__cont, _S_constant()); } + { _Safe_local_iterator_base::_M_attach(__cont, _S_constant()); } /** Likewise, but not thread-safe. */ void _M_attach_single(const _Safe_unordered_container_base* __cont) - { _Safe_base::_M_attach_single(__cont, _S_constant()); } + { _Safe_local_iterator_base::_M_attach_single(__cont, _S_constant()); } /// Is the iterator dereferenceable? bool @@ -341,7 +337,7 @@ namespace __gnu_debug /// Is the iterator value-initialized? bool _M_value_initialized() const - { return _M_version == 0 && base() == _Iter_base{}; } + { return _M_version == 0 && base() == _Iterator{}; } // Is the iterator range [*this, __rhs) valid? bool
