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;

Reply via email to