[gcc r16-8101] libstdc++: [_GLIBCXX_DEBUG] _M_invalidate_if incompatible with C++20 [PR124444]
Francois Dumont
fdumont@gcc.gnu.org
Sun Mar 15 08:13:56 GMT 2026
https://gcc.gnu.org/g:a1f1a60fc6490e677d63b637cc268b513749cc5c
commit r16-8101-ga1f1a60fc6490e677d63b637cc268b513749cc5c
Author: François Dumont <frs.dumont@gmail.com>
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 <jwakely@redhat.com>
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;
More information about the Libstdc++-cvs
mailing list