https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116369

--- Comment #19 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Francois Dumont <fdum...@gcc.gnu.org>:

https://gcc.gnu.org/g:2fd6f42c17a8040dbd3460ca34d93695dacf8575

commit r16-2084-g2fd6f42c17a8040dbd3460ca34d93695dacf8575
Author: François Dumont <frs.dum...@gmail.com>
Date:   Thu Mar 27 19:02:59 2025 +0100

    libstdc++: Make debug iterator pointer sequence const [PR116369]

    In revision a35dd276cbf6236e08bcf6e56e62c2be41cf6e3c the debug sequence
    have been made mutable to allow attach iterators to const containers.
    This change completes this fix by also declaring debug unordered container
    members mutable.

    Additionally the debug iterator sequence is now a pointer-to-const and so
    _Safe_sequence_base _M_attach and all other methods are const qualified.
    Not-const methods exported are preserved for abi backward compatibility.

    libstdc++-v3/ChangeLog:

            PR c++/116369
            * config/abi/pre/gnu-versioned-namespace.ver: Use new const
qualified symbols.
            * config/abi/pre/gnu.ver: Add new const qualified symbols.
            * include/debug/safe_base.h
            (_Safe_iterator_base::_M_sequence): Declare as pointer-to-const.
            (_Safe_iterator_base::_M_attach, _M_attach_single): New, take
pointer-to-const
            _Safe_sequence_base.
            (_Safe_sequence_base::_M_detach_all, _M_detach_singular,
_M_revalidate_singular)
            (_M_swap, _M_get_mutex): New, const qualified.
            (_Safe_sequence_base::_M_attach, _M_attach_single, _M_detach,
_M_detach_single):
            const qualify.
            * include/debug/safe_container.h (_Safe_container<>::_M_cont): Add
const qualifier.
            (_Safe_container<>::_M_swap_base): New.
            (_Safe_container(_Safe_container&&, const _Alloc&,
std::false_type)):
            Adapt to use latter.
            (_Safe_container<>::operator=(_Safe_container&&)): Likewise.
            (_Safe_container<>::_M_swap): Likewise and take parameter as const
reference.
            * include/debug/safe_unordered_base.h
            (_Safe_local_iterator_base::_M_safe_container): New.
            (_Safe_local_iterator_base::_Safe_local_iterator_base): Take
            _Safe_unordered_container_base as pointer-to-const.
            (_Safe_unordered_container_base::_M_attach, _M_attach_single): New,
take
            container as _Safe_unordered_container_base pointer-to-const.
            (_Safe_unordered_container_base::_M_local_iterators,
_M_const_local_iterators):
            Add mutable.
            (_Safe_unordered_container_base::_M_detach_all, _M_swap): New,
const qualify.
            (_Safe_unordered_container_base::_M_attach_local,
_M_attach_local_single)
            (_M_detach_local, _M_detach_local_single): Add const qualifier.
            * include/debug/safe_unordered_container.h
(_Safe_unordered_container::_M_self()): New.
            * include/debug/safe_unordered_container.tcc
            (_Safe_unordered_container::_M_invalidate_if,
_M_invalidated_local_if): Use latter.
            * include/debug/safe_iterator.h (_Safe_iterator<>::_M_attach,
_M_attach_single):
            Take _Safe_sequence_base as pointer-to-const.
            (_Safe_iterator<>::_M_get_sequence): Add const_cast and comment
about it.
            * include/debug/safe_local_iterator.h (_Safe_local_iterator<>):
Replace usages
            of _M_sequence member by _M_safe_container().
            (_Safe_local_iterator<>::_M_attach, _M_attach_single): Take
            _Safe_unordered_container_base as pointer-to-const.
            (_Safe_local_iterator<>::_M_get_sequence): Rename into...
            (_Safe_local_iterator<>::_M_get_ucontainer): ...this. Add necessary
const_cast and
            comment to explain it.
            (_Safe_local_iterator<>::_M_is_begin, _M_is_end): Adapt.
            * include/debug/safe_local_iterator.tcc: Adapt.
            * include/debug/safe_sequence.h
            (_Safe_sequence<>::_M_invalidate_if, _M_transfer_from_if): Add
const qualifier.
            * include/debug/safe_sequence.tcc: Adapt.
            * include/debug/deque (std::__debug::deque::erase): Adapt to use
new const
            qualified methods.
            * include/debug/formatter.h: Adapt.
            * include/debug/forward_list (_Safe_forward_list::_M_this): Add
const
            qualification and return pointer for consistency with 'this'
keyword.
            (_Safe_forward_list::_M_swap_aux): Rename into...
            (_Safe_forward_list::_S_swap_aux): ...this and take sequence as
const reference.
            (forward_list<>::resize): Adapt to use const methods.
            * include/debug/list (list<>::resize): Likewise.
            * src/c++11/debug.cc: Adapt to const qualification.
            * testsuite/util/testsuite_containers.h
            (forward_members_unordered::forward_members_unordered): Add check
on local_iterator
            conversion to const_local_iterator.
            (forward_members::forward_members): Add check on iterator
conversion to
            const_iterator.
            * testsuite/23_containers/unordered_map/const_container.cc: New
test case.
            * testsuite/23_containers/unordered_multimap/const_container.cc:
New test case.
            * testsuite/23_containers/unordered_multiset/const_container.cc:
New test case.
            * testsuite/23_containers/unordered_set/const_container.cc: New
test case.
            * testsuite/23_containers/vector/debug/mutex_association.cc: Adapt.

Reply via email to