https://gcc.gnu.org/g:a1f1a60fc6490e677d63b637cc268b513749cc5c
commit r16-8101-ga1f1a60fc6490e677d63b637cc268b513749cc5c Author: François Dumont <[email protected]> Date: Sat Mar 14 14:34:29 2026 +0100 libstdc++: [_GLIBCXX_DEBUG] _M_invalidate_if incompatible with C++20 [PR124444] __gnu_cxx::__scoped_lock cannot be instantiated in a C++20 constexpr function. Use an intermediate method to avoid this situation. libstdc++-v3/ChangeLog: PR libstdc++/124444 * include/debug/safe_sequence.h (_Safe_sequence::_M_invalidate_if_impl): New. (_Safe_sequence::_M_invalidate_if): Call later if not __is_constant_evaluated. * include/debug/safe_sequence.tcc: Rename _M_invalidate_if into _M_invalidate_if_impl and remove C++20 constexpr. Reviewed-by: Jonathan Wakely <[email protected]> Diff: --- libstdc++-v3/include/debug/safe_sequence.h | 12 +++++++++++- libstdc++-v3/include/debug/safe_sequence.tcc | 7 ++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/libstdc++-v3/include/debug/safe_sequence.h b/libstdc++-v3/include/debug/safe_sequence.h index e7658bb26a77..4415f689c9fe 100644 --- a/libstdc++-v3/include/debug/safe_sequence.h +++ b/libstdc++-v3/include/debug/safe_sequence.h @@ -110,6 +110,10 @@ namespace __gnu_debug template<typename _Sequence> class _Safe_sequence : public _Safe_sequence_base { + template<typename _Predicate> + void + _M_invalidate_if_impl(_Predicate __pred) const; + public: /** Invalidates all iterators @c x that reference this sequence, are not singular, and for which @c __pred(x) returns @c @@ -117,7 +121,13 @@ namespace __gnu_debug in the safe ones. */ template<typename _Predicate> _GLIBCXX20_CONSTEXPR void - _M_invalidate_if(_Predicate __pred) const; + _M_invalidate_if(_Predicate __pred) const + { + if (std::__is_constant_evaluated()) + return; + + _M_invalidate_if_impl(__pred); + } /** Transfers all iterators @c x that reference @c from sequence, are not singular, and for which @c __pred(x) returns @c diff --git a/libstdc++-v3/include/debug/safe_sequence.tcc b/libstdc++-v3/include/debug/safe_sequence.tcc index 884478fad9d7..f55767258be5 100644 --- a/libstdc++-v3/include/debug/safe_sequence.tcc +++ b/libstdc++-v3/include/debug/safe_sequence.tcc @@ -33,13 +33,10 @@ namespace __gnu_debug { template<typename _Sequence> template<typename _Predicate> - _GLIBCXX20_CONSTEXPR void + void _Safe_sequence<_Sequence>:: - _M_invalidate_if(_Predicate __pred) const + _M_invalidate_if_impl(_Predicate __pred) const { - if (std::__is_constant_evaluated()) - return; - typedef typename _Sequence::iterator iterator; typedef typename _Sequence::const_iterator const_iterator;
