[PATCH][_GLIBCXX_DEBUG] Remove std::inplace_vector alias

François Dumont frs.dumont@gmail.com
Mon Oct 12 05:20:47 GMT 2026


Hi

I tried but failed to found a good solution to the not C++ Standard 
conforming __gnu_debug implementation of inplace_vector.

So I'd like to propose to keep the implementation only for explicit 
usage through #include <debug/inplace_vector> and use of 
__gnu_debug::inplace_vector. Clearly that's a much more limited use cases.

     libstdc++ [_GLIBCXX_DEBUG] Remove std::inplace_vector alias

     The _GLIBCXX_DEBUG implementation of std::inplace_vector cannot 
fully comply
     to the C++ Standard. Due to the additional state to store 
container's iterators
     the constructors cannot be made trivial when C++ Standard imposed 
them to be.

     Keep __gnu_debug::inplace_vector as a possible replacement of the 
std::inplace_vector
     accessible by including <debug/inplace_vector>.

     libstdc++-v3/ChangeLog:

             * include/debug/inplace_vector: Move the class to the 
__gnu_debug namespace.
             Adapt to add the now necessary 'std::'.
             * include/std/inplace_vector: Remove the 
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
             _GLIBCXX_END_NAMESPACE_CONTAINER enclosing namespace.
             (erase_if, erase): Adapt to take std::inplace_vector.
             * testsuite/23_containers/inplace_vector/copy.cc: Remove 
_GLIBCXX_DEBUG checks.
             * testsuite/23_containers/inplace_vector/move.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/assign1_neg.cc: Run test
             directly on __gnu_debug::inplace_vector.
             * 
testsuite/23_containers/inplace_vector/debug/assign2_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/assign3_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/construct1_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/construct2_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/construct3_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/debug_functions.cc: Likewise.
             * testsuite/23_containers/inplace_vector/debug/erase.cc: 
Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/insert1_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/insert2_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/insert3_neg.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/insert5_neg.cc: Likewise.
             * testsuite/23_containers/inplace_vector/debug/erasure.cc: 
New test case.
             * testsuite/util/debug/checks.h: Allow usage of all checks 
even if _GLIBCXX_DEBUG
             is not defined. Include the debug/ headers unconditionnally.
             (check_assign3): Use explicitely __gnu_debug::list.
             (check_construct3): Likewise.
             (check_insert3): Likewise.

Tested under Linux x86_64 on testsuite/23_containers/inplace_vector/*.

Ok to commit ?

François
-------------- next part --------------
diff --git a/libstdc++-v3/include/debug/inplace_vector b/libstdc++-v3/include/debug/inplace_vector
index 3dc26d476a2..603cac5f4ec 100644
--- a/libstdc++-v3/include/debug/inplace_vector
+++ b/libstdc++-v3/include/debug/inplace_vector
@@ -35,10 +35,6 @@
 
 #include <debug/debug.h>
 
-namespace std _GLIBCXX_VISIBILITY(default) { namespace __debug {
-  template<typename _Tp, size_t _Nm> class inplace_vector;
-} } // namespace std::__debug
-
 #include <inplace_vector>
 
 #ifdef __glibcxx_inplace_vector // C++ >= 26
@@ -46,17 +42,15 @@ namespace std _GLIBCXX_VISIBILITY(default) { namespace __debug {
 #include <debug/safe_sequence.h>
 #include <debug/safe_iterator.h>
 
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-namespace __debug
+namespace __gnu_debug
 {
   /// Class std::inplace_vector with safety/checking/debug instrumentation.
   template<typename _Tp, size_t _Nm>
     class inplace_vector
     : public __gnu_debug::_Safe_sequence<inplace_vector<_Tp, _Nm>>
-    , public _GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>
+    , public std::inplace_vector<_Tp, _Nm>
     {
-      using _Base = _GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>;
+      using _Base = std::inplace_vector<_Tp, _Nm>;
       using _Base_iterator = typename _Base::iterator;
       using _Base_const_iterator = typename _Base::const_iterator;
       using _Equal = __gnu_debug::_Equal_to<_Base_const_iterator>;
@@ -91,20 +85,20 @@ namespace __debug
       inplace_vector(size_type __n, const _Tp& __value)
 	: _Base(__n, __value) { }
 
-      template<__any_input_iterator _InputIterator>
+      template<std::__any_input_iterator _InputIterator>
 	constexpr
 	inplace_vector(_InputIterator __first, _InputIterator __last)
 	: _Base(__gnu_debug::__base(
 		  __glibcxx_check_valid_constructor_range(__first, __last)),
 		__gnu_debug::__base(__last)) { }
 
-      template<__detail::__container_compatible_range<_Tp> _Rg>
+      template<std::__detail::__container_compatible_range<_Tp> _Rg>
 	constexpr
-	inplace_vector(from_range_t, _Rg&& __rg)
-	  : _Base(from_range_t{}, std::forward<_Rg>(__rg)) { }
+	inplace_vector(std::from_range_t, _Rg&& __rg)
+	  : _Base(std::from_range_t{}, std::forward<_Rg>(__rg)) { }
 
       constexpr
-      inplace_vector(initializer_list<_Tp> __il)
+      inplace_vector(std::initializer_list<_Tp> __il)
       : _Base(__il) { }
 
       inplace_vector(const inplace_vector&) = default;
@@ -118,14 +112,14 @@ namespace __debug
       operator=(inplace_vector&&) = default;
 
       constexpr inplace_vector&
-      operator=(initializer_list<_Tp> __il)
+      operator=(std::initializer_list<_Tp> __il)
       {
 	_Base::operator=(__il);
 	this->_M_invalidate_all();
 	return *this;
       }
 
-      template<__any_input_iterator _InputIterator>
+      template<std::__any_input_iterator _InputIterator>
 	constexpr void
 	assign(_InputIterator __first, _InputIterator __last)
 	{
@@ -146,7 +140,7 @@ namespace __debug
 	    this->_M_invalidate_if(_Equal(__end));
 	}
 
-      template<__detail::__container_compatible_range<_Tp> _Rg>
+      template<std::__detail::__container_compatible_range<_Tp> _Rg>
 	constexpr void
 	assign_range(_Rg&& __rg)
 	{
@@ -162,7 +156,7 @@ namespace __debug
       }
 
       constexpr void
-      assign(initializer_list<_Tp> __il)
+      assign(std::initializer_list<_Tp> __il)
       {
 	_Base::assign(__il);
 	this->_M_invalidate_all();
@@ -318,7 +312,7 @@ namespace __debug
       push_back(_Tp&& __x)
       { return emplace_back(std::move(__x)); }
 
-      template<__detail::__container_compatible_range<_Tp> _Rg>
+      template<std::__detail::__container_compatible_range<_Tp> _Rg>
 	constexpr void
 	append_range(_Rg&& __rg)
 	{
@@ -338,11 +332,11 @@ namespace __debug
       }
 
       template<typename... _Args>
-	constexpr optional<_Tp&>
+	constexpr std::optional<_Tp&>
 	try_emplace_back(_Args&&... __args)
 	{
 	  auto __end = _Base::cend();
-	  optional<_Tp&> __res
+	  std::optional<_Tp&> __res
 	    = _Base::try_emplace_back(std::forward<_Args>(__args)...);
 
 	  if (__res)
@@ -351,11 +345,11 @@ namespace __debug
 	  return __res;
 	}
 
-      constexpr optional<_Tp&>
+      constexpr std::optional<_Tp&>
       try_push_back(const _Tp& __x)
       {
 	const auto __end = _Base::cend();
-	optional<_Tp&> __res = _Base::try_push_back(__x);
+	std::optional<_Tp&> __res = _Base::try_push_back(__x);
 
 	if (__res)
 	  this->_M_invalidate_if(_Equal(__end));
@@ -363,11 +357,11 @@ namespace __debug
 	return __res;
       }
 
-      constexpr optional<_Tp&>
+      constexpr std::optional<_Tp&>
       try_push_back(_Tp&& __x)
       {
 	const auto __end = _Base::cend();
-	optional<_Tp&> __res = _Base::try_push_back(std::move(__x));
+	std::optional<_Tp&> __res = _Base::try_push_back(std::move(__x));
 
 	if (__res)
 	  this->_M_invalidate_if(_Equal(__end));
@@ -436,7 +430,7 @@ namespace __debug
 	return { __res, this };
       }
 
-      template<__any_input_iterator _InputIterator>
+      template<std::__any_input_iterator _InputIterator>
 	constexpr iterator
 	insert(const_iterator __position, _InputIterator __first,
 	       _InputIterator __last)
@@ -464,7 +458,7 @@ namespace __debug
 	  return { __res, this };
 	}
 
-      template<__detail::__container_compatible_range<_Tp> _Rg>
+      template<std::__detail::__container_compatible_range<_Tp> _Rg>
 	constexpr iterator
 	insert_range(const_iterator __position, _Rg&& __rg)
 	{
@@ -478,7 +472,7 @@ namespace __debug
 	}
 
       constexpr iterator
-      insert(const_iterator __position, initializer_list<_Tp> __il)
+      insert(const_iterator __position, std::initializer_list<_Tp> __il)
       {
 	if consteval {
 	    return iterator(_Base::insert(__position.base(), __il), this);
@@ -531,7 +525,8 @@ namespace __debug
 
       constexpr void
       swap(inplace_vector& __x)
-      noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
+      noexcept(std::is_nothrow_swappable_v<_Tp> &&
+	       std::is_nothrow_move_constructible_v<_Tp>)
       {
 	this->_M_invalidate_all();
 	__x._M_invalidate_all();
@@ -552,7 +547,7 @@ namespace __debug
       constexpr friend auto
       operator<=>(const inplace_vector& __x, const inplace_vector& __y)
       requires requires (const _Tp __t) {
-	{ __t < __t } -> __detail::__boolean_testable;
+	{ __t < __t } -> std::__detail::__boolean_testable;
       }
       { return __x._M_base() <=> __y._M_base(); }
 
@@ -581,9 +576,9 @@ namespace __debug
   // and empty regardless of _Tp.
   template<typename _Tp>
     class inplace_vector<_Tp, 0>
-    : public _GLIBCXX_STD_C::inplace_vector<_Tp, 0>
+    : public std::inplace_vector<_Tp, 0>
     {
-      using _Base = _GLIBCXX_STD_C::inplace_vector<_Tp, 0>;
+      using _Base = std::inplace_vector<_Tp, 0>;
 
     public:
       // types:
@@ -608,20 +603,20 @@ namespace __debug
       inplace_vector(size_type __n, const _Tp& __value)
 	: _Base(__n, __value) { }
 
-      template<__any_input_iterator _InputIterator>
+      template<std::__any_input_iterator _InputIterator>
 	constexpr
 	inplace_vector(_InputIterator __first, _InputIterator __last)
 	: _Base(__gnu_debug::__base(
 		  __glibcxx_check_valid_constructor_range(__first, __last)),
 		__gnu_debug::__base(__last)) { }
 
-      template <__detail::__container_compatible_range<_Tp> _Rg>
+      template <std::__detail::__container_compatible_range<_Tp> _Rg>
 	constexpr
-	inplace_vector(from_range_t, _Rg&& __rg)
-	  : _Base(from_range_t{}, std::forward<_Rg>(__rg)) { }
+	inplace_vector(std::from_range_t, _Rg&& __rg)
+	  : _Base(std::from_range_t{}, std::forward<_Rg>(__rg)) { }
 
       constexpr
-      inplace_vector(initializer_list<_Tp> __il)
+      inplace_vector(std::initializer_list<_Tp> __il)
 	: _Base(__il) { }
 
       inplace_vector(const inplace_vector&) = default;
@@ -637,7 +632,7 @@ namespace __debug
       operator=(inplace_vector&&) = default;
 
       constexpr inplace_vector&
-      operator=(initializer_list<_Tp> __il)
+      operator=(std::initializer_list<_Tp> __il)
       {
 	_Base::operator=(__il);
 	return *this;
@@ -648,13 +643,15 @@ namespace __debug
       noexcept
       { }
     };
-} // namespace __debug
+} // namespace __gnu_debug
 
+namespace std _GLIBCXX_VISIBILITY(default)
+{
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<typename _Tp, size_t _Nm, typename _Predicate>
     constexpr size_t
-    erase_if(__debug::inplace_vector<_Tp, _Nm>& __cont, _Predicate __pred)
+    erase_if(__gnu_debug::inplace_vector<_Tp, _Nm>& __cont, _Predicate __pred)
     {
       if constexpr (_Nm != 0)
 	{
@@ -667,7 +664,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<typename _Tp, size_t _Nm, typename _Up = _Tp>
     constexpr size_t
-    erase(__debug::inplace_vector<_Tp, _Nm>& __cont, const _Up& __value)
+    erase(__gnu_debug::inplace_vector<_Tp, _Nm>& __cont, const _Up& __value)
     { return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
 
 _GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/include/std/inplace_vector b/libstdc++-v3/include/std/inplace_vector
index b16edcb98d9..8d80b19a428 100644
--- a/libstdc++-v3/include/std/inplace_vector
+++ b/libstdc++-v3/include/std/inplace_vector
@@ -54,7 +54,6 @@
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
-_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
   // [indirect], class template indirect
   template<typename _Tp, size_t _Nm>
@@ -1318,12 +1317,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       { }
     };
 
-_GLIBCXX_END_NAMESPACE_CONTAINER
-
   template<typename _Tp, size_t _Nm, typename _Predicate>
     constexpr size_t
-    erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
-	     _Predicate __pred)
+    erase_if(inplace_vector<_Tp, _Nm>& __cont, _Predicate __pred)
     {
       if constexpr (_Nm != 0)
 	return __detail::__erase_if(__cont, __cont, std::move(__pred));
@@ -1333,15 +1329,11 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
 
   template<typename _Tp, size_t _Nm, typename _Up = _Tp>
     constexpr  size_t
-    erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont, const _Up& __value)
+    erase(inplace_vector<_Tp, _Nm>& __cont, const _Up& __value)
     { return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 
-#ifdef _GLIBCXX_DEBUG
-# include <debug/inplace_vector>
-#endif
-
 #endif // __glibcxx_inplace_vector
 #endif // _GLIBCXX_INPLACE_VECTOR
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc
index a2f5e7d3486..9f706195beb 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc
@@ -72,14 +72,12 @@ static_assert(!std::is_nothrow_copy_constructible_v<std::inplace_vector<N<false,
 static_assert(std::is_nothrow_copy_constructible_v<std::inplace_vector<D, 2>>);
 static_assert(!std::is_nothrow_copy_constructible_v<std::inplace_vector<U, 2>>);
 
-#if !_GLIBCXX_DEBUG
 static_assert(std::is_trivially_copy_constructible_v<std::inplace_vector<int, 2>>);
 static_assert(!std::is_trivially_copy_constructible_v<std::inplace_vector<X, 2>>);
 static_assert(!std::is_trivially_copy_constructible_v<std::inplace_vector<N<true, true>, 2>>);
 // is_trivially_copy_constructible_v checks destructor
 static_assert(!std::is_trivially_copy_constructible_v<std::inplace_vector<D, 2>>);
 static_assert(std::is_trivially_copy_constructible_v<std::inplace_vector<U, 2>>);
-#endif
 
 static_assert(std::is_copy_assignable_v<std::inplace_vector<int, 2>>);
 static_assert(std::is_copy_assignable_v<std::inplace_vector<X, 2>>);
@@ -98,7 +96,6 @@ static_assert(!std::is_nothrow_copy_assignable_v<std::inplace_vector<N<false, fa
 static_assert(std::is_nothrow_copy_assignable_v<std::inplace_vector<D, 2>>);
 static_assert(!std::is_nothrow_copy_assignable_v<std::inplace_vector<U, 2>>);
 
-#if !_GLIBCXX_DEBUG
 // conditional noexcept here is libstdc++ extension,
 static_assert(std::is_trivially_copy_assignable_v<std::inplace_vector<int, 2>>);
 static_assert(!std::is_trivially_copy_assignable_v<std::inplace_vector<X, 2>>);
@@ -106,7 +103,6 @@ static_assert(!std::is_trivially_copy_assignable_v<std::inplace_vector<N<true, t
 // destructor is not trivial
 static_assert(!std::is_trivially_copy_assignable_v<std::inplace_vector<D, 2>>);
 static_assert(std::is_trivially_copy_assignable_v<std::inplace_vector<U, 2>>);
-#endif
 
 static_assert(std::is_nothrow_copy_constructible_v<std::inplace_vector<int, 0>>);
 static_assert(std::is_nothrow_copy_constructible_v<std::inplace_vector<X, 0>>);
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign1_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign1_neg.cc
index 37c80c32bbd..34ef4198fad 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign1_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_assign1<std::inplace_vector<int, 10> >();
+  __gnu_test::check_assign1<__gnu_debug::inplace_vector<int, 10> >();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign2_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign2_neg.cc
index ff6c9a73acc..63b6885fe9f 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign2_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_assign2<std::inplace_vector<int, 10>>();
+  __gnu_test::check_assign2<__gnu_debug::inplace_vector<int, 10>>();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign3_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign3_neg.cc
index 42f811d07e1..b1aba5ee40f 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign3_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign3_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_assign3<std::inplace_vector<int, 10>>();
+  __gnu_test::check_assign3<__gnu_debug::inplace_vector<int, 10>>();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct1_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct1_neg.cc
index 28ede4c47b9..099b35727ae 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct1_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_construct1<std::inplace_vector<int, 10> >();
+  __gnu_test::check_construct1<__gnu_debug::inplace_vector<int, 10> >();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct2_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct2_neg.cc
index be37ddeaaf2..04b8bf23e9e 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct2_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_construct2<std::inplace_vector<int, 10> >();
+  __gnu_test::check_construct2<__gnu_debug::inplace_vector<int, 10> >();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct3_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct3_neg.cc
index 80861831b48..17f25b40a9a 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct3_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/construct3_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_construct3<std::inplace_vector<int, 10> >();
+  __gnu_test::check_construct3<__gnu_debug::inplace_vector<int, 10> >();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/debug_functions.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/debug_functions.cc
index bc5ed50113f..20445a0ffd5 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/debug_functions.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/debug_functions.cc
@@ -1,14 +1,11 @@
 // { dg-do run { target c++26 } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <testsuite_hooks.h>
 
 void test02()
 {
-  using namespace __gnu_debug;
-
-  std::inplace_vector<int, 10> v1(3, 1);
+  __gnu_debug::inplace_vector<int, 10> v1(3, 1);
   VERIFY( !__check_singular(v1.begin()) );
   auto it = v1.begin();
   VERIFY( !__check_singular(it) );
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erase.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erase.cc
index 94da94627f3..cdafa7276ca 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erase.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erase.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <testsuite_hooks.h>
 
 void test01()
 {
-  std::inplace_vector<int, 10> v;
+  __gnu_debug::inplace_vector<int, 10> v;
 
   for (int i = 0; i != 10; ++i)
     v.push_back(i);
@@ -22,7 +21,7 @@ void test01()
 
 void test02()
 {
-  std::inplace_vector<int, 0> v;
+  __gnu_debug::inplace_vector<int, 0> v;
 
   VERIFY( std::erase(v, 6) == 0 );
 }
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erasure.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erasure.cc
new file mode 100644
index 00000000000..598fbacb846
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/erasure.cc
@@ -0,0 +1,64 @@
+// { dg-do run { target c++26 } }
+
+#include <debug/inplace_vector>
+#include <ranges>
+#include <testsuite_hooks.h>
+
+template<typename T, size_t N>
+constexpr bool
+eq(const __gnu_debug::inplace_vector<T, N>& l,
+   std::initializer_list<std::type_identity_t<T>> r)
+{ return std::ranges::equal(l, r); };
+
+constexpr void
+test_erase()
+{
+  __gnu_debug::inplace_vector<int, 15> c{1, 0, 3, 4, 5, 6, 5, 4, 3, 0, 1, 4, 4, 9};
+  std::erase(c, 4);
+  VERIFY( c.size() == 10 );
+  std::erase(c, 1);
+  VERIFY( c.size() == 8 );
+  std::erase(c, 9);
+  VERIFY( c.size() == 7 );
+  VERIFY( eq(c, {0, 3, 5, 6, 5, 3, 0}) );
+  
+  std::erase(c, {});
+  VERIFY( c.size() == 5 );
+  VERIFY( eq(c, {3, 5, 6, 5, 3}) );
+
+  std::erase(c, {5});
+  VERIFY( c.size() == 3 );
+  VERIFY( eq(c, {3, 6, 3}) );
+
+  __gnu_debug::inplace_vector<int, 0> e;
+  std::erase(e, 10);
+  VERIFY( e.empty() );
+}
+
+constexpr void
+test_erase_if()
+{
+  __gnu_debug::inplace_vector<int, 15> c{1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 4, 4, 9};
+  std::erase_if(c, [](int i) { return i > 5; });
+  VERIFY( c.size() == 12 );
+  std::erase_if(c, [](int i) { return i == 4; });
+  VERIFY( c.size() == 8 );
+  std::erase_if(c, [](int i) { return i & 1; });
+  VERIFY( eq(c, {2, 2}) );
+
+  __gnu_debug::inplace_vector<int, 0> e;
+  std::erase_if(e, [](int i) { return i > 5; });
+  VERIFY( e.empty() );
+}
+
+int main()
+{
+  test_erase();
+  test_erase_if();
+
+  constexpr bool _ = [] {
+    test_erase();
+    test_erase_if();
+    return true;
+  }();
+}
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert1_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert1_neg.cc
index f85cfaa90b4..59e9f4b1722 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert1_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_insert1<std::inplace_vector<int, 10>>();
+  __gnu_test::check_insert1<__gnu_debug::inplace_vector<int, 10>>();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert2_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert2_neg.cc
index 6a203696ec9..f0867e5a8e1 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert2_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_insert2<std::inplace_vector<int, 10>>();
+  __gnu_test::check_insert2<__gnu_debug::inplace_vector<int, 10>>();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert3_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert3_neg.cc
index 63f6e05d655..da1282d0015 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert3_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert3_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_insert3<std::inplace_vector<int, 10>>();
+  __gnu_test::check_insert3<__gnu_debug::inplace_vector<int, 10>>();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert5_neg.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert5_neg.cc
index e1fbd65b711..dca1f1e59f3 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert5_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/debug/insert5_neg.cc
@@ -1,12 +1,11 @@
 // { dg-do run { target c++26 xfail *-*-* } }
-// { dg-require-debug-mode "" }
 
-#include <inplace_vector>
+#include <debug/inplace_vector>
 #include <debug/checks.h>
 
 void test01()
 {
-  __gnu_test::check_insert4<std::inplace_vector<int, 10>>();
+  __gnu_test::check_insert4<__gnu_debug::inplace_vector<int, 10>>();
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc
index 5419dc0edb6..5ed0107b89f 100644
--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc
+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc
@@ -91,14 +91,12 @@ static_assert(!std::is_nothrow_move_constructible_v<std::inplace_vector<N<false,
 static_assert(std::is_nothrow_move_constructible_v<std::inplace_vector<D, 2>>);
 static_assert(!std::is_nothrow_move_constructible_v<std::inplace_vector<U, 2>>);
 
-#if !_GLIBCXX_DEBUG
 static_assert(std::is_trivially_move_constructible_v<std::inplace_vector<int, 2>>);
 static_assert(!std::is_trivially_move_constructible_v<std::inplace_vector<X, 2>>);
 static_assert(!std::is_trivially_move_constructible_v<std::inplace_vector<N<true, true>, 2>>);
 // is_trivially_move_constructible_v checks destructor
 static_assert(!std::is_trivially_move_constructible_v<std::inplace_vector<D, 2>>);
 static_assert(std::is_trivially_move_constructible_v<std::inplace_vector<U, 2>>);
-#endif
 
 static_assert(std::is_move_assignable_v<std::inplace_vector<int, 2>>);
 static_assert(std::is_move_assignable_v<std::inplace_vector<X, 2>>);
@@ -117,14 +115,12 @@ static_assert(!std::is_nothrow_move_assignable_v<std::inplace_vector<N<false, fa
 static_assert(std::is_nothrow_move_assignable_v<std::inplace_vector<D, 2>>);
 static_assert(!std::is_nothrow_move_assignable_v<std::inplace_vector<U, 2>>);
 
-#if !_GLIBCXX_DEBUG
 static_assert(std::is_trivially_move_assignable_v<std::inplace_vector<int, 2>>);
 static_assert(!std::is_trivially_move_assignable_v<std::inplace_vector<X, 2>>);
 static_assert(!std::is_trivially_move_assignable_v<std::inplace_vector<N<true, true>, 2>>);
 // destructor is not trivial
 static_assert(!std::is_trivially_move_assignable_v<std::inplace_vector<D, 2>>);
 static_assert(std::is_trivially_move_assignable_v<std::inplace_vector<U, 2>>);
-#endif
 
 static_assert(std::is_nothrow_swappable_v<std::inplace_vector<int, 2>>);
 static_assert(!std::is_nothrow_swappable_v<std::inplace_vector<X, 2>>);
diff --git a/libstdc++-v3/testsuite/util/debug/checks.h b/libstdc++-v3/testsuite/util/debug/checks.h
index fcb758b59b2..9ecc191df2c 100644
--- a/libstdc++-v3/testsuite/util/debug/checks.h
+++ b/libstdc++-v3/testsuite/util/debug/checks.h
@@ -20,12 +20,10 @@
 #include <deque>
 #include <list>
 #include <inplace_vector>
-#ifndef _GLIBCXX_DEBUG
-#  include <debug/vector>
-#  include <debug/deque>
-#  include <debug/list>
-#  include <debug/inplace_vector>
-#endif
+#include <debug/vector>
+#include <debug/deque>
+#include <debug/list>
+#include <debug/inplace_vector>
 #include <testsuite_hooks.h>
 
 namespace __gnu_test
@@ -150,7 +148,7 @@ namespace __gnu_test
       typedef _Tp cont_type;
       typedef typename cont_type::value_type cont_val_type;
       typedef typename CopyableValueType<cont_val_type>::value_type val_type;
-      typedef std::list<val_type> list_type;
+      typedef __gnu_debug::list<val_type> list_type;
 
       generate_unique<val_type> gu;
 
@@ -225,7 +223,7 @@ namespace __gnu_test
       typedef _Tp cont_type;
       typedef typename cont_type::value_type cont_val_type;
       typedef typename CopyableValueType<cont_val_type>::value_type val_type;
-      typedef std::list<val_type> list_type;
+      typedef __gnu_debug::list<val_type> list_type;
 
       generate_unique<val_type> gu;
 
@@ -295,13 +293,13 @@ namespace __gnu_test
     struct InsertRangeHelper<__gnu_debug::list<_Tp1, _Tp2> >
     : InsertRangeHelperAux<__gnu_debug::list<_Tp1, _Tp2> >
     { };
+#endif
 
-# ifdef __glibcxx_inplace_vector // C++ >= 26
+#ifdef __glibcxx_inplace_vector // C++ >= 26
   template<typename _Tp, size_t _Nm>
     struct InsertRangeHelper<__gnu_debug::inplace_vector<_Tp, _Nm> >
     : InsertRangeHelperAux<__gnu_debug::inplace_vector<_Tp, _Nm> >
     { };
-# endif
 #endif
 
   template<typename _Tp>
@@ -367,7 +365,7 @@ namespace __gnu_test
       typedef _Tp cont_type;
       typedef typename cont_type::value_type cont_val_type;
       typedef typename CopyableValueType<cont_val_type>::value_type val_type;
-      typedef std::list<val_type> list_type;
+      typedef __gnu_debug::list<val_type> list_type;
 
       generate_unique<val_type> gu;
 


More information about the Libstdc++ mailing list