Gentle reminder.
On 12/18/25 22:33, François Dumont wrote:
Hi
libstdc++: Fix std::erase_if behavior for std::__debug containers
Complete fix of std::erase_if/std::erase for all std::__debug
containers and
__gnu_debug::basic_string. Make sure that iterators erased by this
function
will be properly detected as such by the debug container and so
considered as
invalid.
Doing so introduce a new std::__detail::__erase_if function
dealing, similarly
to std::__detail::__erase_node_if, with non-node containers.
libstdc++-v3/ChangeLog:
* include/bits/erase_if.h (__detail::__erase_if): New.
* include/debug/deque (std::erase_if<>(__debug::deque<>&,
_Pred): Use latter.
* include/debug/inplace_vector
(std::erase_if<>(__debug::inplace_vector<>&, _Pred)):
Likewise.
* include/debug/vector
(std::erase_if<>(__debug::vector<>&, _Pred)): Likewise.
* include/std/deque: Include erase_if.h.
(std::erase_if<>(std::vector<>&, _Pred)): Adapt to use
__detail::__erase_if.
* include/std/inplace_vector
(std::erase_if<>(std::inplace_vector<>&, _Pred)):
Likewise.
* include/std/string
(std::erase_if<>(std::basic_string<>&, _Pred)): Likewise.
* include/std/vector (std::erase_if<>(std::vector<>&,
_Pred)): Likewise.
* include/debug/forward_list
(std::erase_if<>(__debug::forward_list<>&, _Pred)): New.
(std::erase<>(__debug::forward_list<>&, const _Up&)): New.
* include/debug/list
(std::erase_if<>(__debug::list<>&, _Pred)): New.
(std::erase<>(__debug::list<>&, const _Up&)): New.
* include/debug/map (std::erase_if<>(__debug::map<>&,
_Pred)): New.
(std::erase_if<>(__debug::multimap<>&, _Pred)): New.
* include/debug/set (std::erase_if<>(__debug::set<>&,
_Pred)): New.
(std::erase_if<>(__debug::multiset<>&, _Pred)): New.
* include/debug/string
(std::erase_if<>(__gnu_debug::basic_string<>&, _Pred)): New.
(std::erase<>(__gnu_debug::basic_string<>&, const _Up&)): New.
* include/debug/unordered_map
(std::erase_if<>(__debug::unordered_map<>&, _Pred)): New.
(std::erase_if<>(__debug::unordered_multimap<>&, _Pred)): New.
* include/debug/unordered_set
(std::erase_if<>(__debug::unordered_set<>&, _Pred)): New.
(std::erase_if<>(__debug::unordered_multiset<>&, _Pred)): New.
* include/std/forward_list
(std::erase_if<>(std::forward_list<>&, _Pred)):
Adapt to work exclusively for normal implementation.
(std::erase<>(std::forward_list<>&, const _Up&)): Likewise.
* include/std/list (std::erase_if<>(std::list<>&, _Pred)):
Likewise.
(std::erase<>(std::list<>&, const _Up&)): Likewise.
* include/std/map (std::erase_if<>(std::map<>&, _Pred)):
Likewise.
(std::erase_if<>(std::multimap<>&, _Pred)): Likewise.
* include/debug/set (std::erase_if<>(std::set<>&, _Pred)):
Likewise.
(std::erase_if<>(std::multiset<>&, _Pred)): Likewise.
* include/std/unordered_map
(std::erase_if<>(std::unordered_map<>&, _Pred)): Likewise.
(std::erase_if<>(std::unordered_multimap<>&, _Pred)): Likewise.
* include/std/unordered_set
(std::erase_if<>(std::unordered_set<>&, _Pred)): Likewise.
(std::erase_if<>(std::unordered_multiset<>&, _Pred)): Likewise.
* testsuite/21_strings/basic_string/debug/erase.cc: New
test case.
* testsuite/23_containers/forward_list/debug/erase.cc: New
test case.
*
testsuite/23_containers/forward_list/debug/invalidation/erase.cc: New
test case.
* testsuite/23_containers/list/debug/erase.cc: New test case.
*
testsuite/23_containers/list/debug/invalidation/erase.cc: New test case.
* testsuite/23_containers/map/debug/erase_if.cc: New test
case.
*
testsuite/23_containers/map/debug/invalidation/erase_if.cc: New test
case.
* testsuite/23_containers/multimap/debug/erase_if.cc: New
test case.
*
testsuite/23_containers/multimap/debug/invalidation/erase_if.cc: New
test case.
* testsuite/23_containers/multiset/debug/erase_if.cc: New
test case.
*
testsuite/23_containers/multiset/debug/invalidation/erase_if.cc: New
test case.
* testsuite/23_containers/set/debug/erase_if.cc: New test
case.
*
testsuite/23_containers/set/debug/invalidation/erase_if.cc: New test
case.
* testsuite/23_containers/unordered_map/debug/erase_if.cc:
New test case.
*
testsuite/23_containers/unordered_map/debug/invalidation/erase_if.cc:
New test case.
*
testsuite/23_containers/unordered_multimap/debug/erase_if.cc: New test
case.
*
testsuite/23_containers/unordered_multimap/debug/invalidation/erase_if.cc:
New test case.
*
testsuite/23_containers/unordered_multiset/debug/erase_if.cc: New test
case.
*
testsuite/23_containers/unordered_multiset/debug/invalidation/erase_if.cc:
New test case.
* testsuite/23_containers/unordered_set/debug/erase_if.cc:
New test case.
*
testsuite/23_containers/unordered_set/debug/invalidation/erase_if.cc:
New test case.
All testsuite/23_containers tests run under Linux x64 normal and
_GLIBCXX_DEBUG modes.
https://forge.sourceware.org/gcc/gcc-TEST/pulls/131
Ok to commit ?
François