[Bug libstdc++/124444] debug _M_invalidate_if incompatible with C++20 since r16-5845

François Dumont frs.dumont@gmail.com
Sat Mar 14 20:37:57 GMT 2026


Patch extracted from this PR:

https://forge.sourceware.org/gcc/gcc-TEST/pulls/136

I was able to reproduce the bug in the context  the same PR on those tests:

23_containers/vector/bool/capacity/constexpr.cc
23_containers/vector/bool/modifiers/constexpr.cc
23_containers/vector/modifiers/constexpr.cc

It was the reason of doing this change in the PR.

     libstdc++: [_GLIBCXX_DEBUG] _M_invalidate_if incompatible with 
C++20 [PR124444]

     __gnu_cxx::__scoped_lock cannot be instantiated in a C++20 
constexpr function.

     libstdc++-v3/ChangeLog:

             * 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.

Tested under Linux x86_64 _GLIBCXX_DEBUG mode.

Ok to commit ?

François
-------------- next part --------------
diff --git a/libstdc++-v3/include/debug/safe_sequence.h b/libstdc++-v3/include/debug/safe_sequence.h
index e7658bb26a7..4415f689c9f 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 884478fad9d..f55767258be 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++ mailing list