[PATCH] Implement std::__debug::inplace_vector

François Dumont frs.dumont@gmail.com
Sat Nov 1 21:09:56 GMT 2025


Hi

Here is the implementation of the std::__debug::inplace_vector.

I eventually had to introduce a dedicated std::erase_if/std::erase 
implementation for the __debug version. When directly using 
__gnu_debug::inplace_vector the std::erase_if was used downcasting the 
inplace_vector into the std::inplace_vector base class so breaking 
encapsulation. So we really need dedicated implementations and I'll 
prepare patches for other containers.

I also added tests for std::swap. Overloading it in std:: namespace 
seems the best option to me. If it is defined in std::__debug:: as it 
should then calls to std::swap in user code are replaced by the generic 
call to swap in move.h instead of calling inplace_vector<>::swap. It 
still works to invalidate iterators but is a major performance issue. I 
noticed this running in gdb, is there a way to test for call to the 
correct swap ?

I also wonder in 
testsuite/23_containers/inplace_vector/debug/invalidation/swap.cc test02 
how gcc does to find the proper swap method on the unqualified call ?

     Add _GLIBCXX_DEBUG std::inplace_vector implementation.

     Unlike other _GLIBCXX_DEBUG containers the 
std::__debug::inplace_vector is
     inheriting privately from both __gnu_debug::_Safe_sequence<> and 
std::inplace_vector
     classes to preserve encapsulation. Iterators won't be created or 
invalidated without
     std::__debug::inplace_vector being aware. However 
std::__debug::inplace_vector<T, 0>
     inherits publicly from std::inplace_vector<T, 0> to benefit from 
the same std::
     functions overloads.

     libstdc++-v3/ChangeLog:

             * include/Makefile.am (debug_headers): Add inplace_vector.
             * include/Makefile.in: Regenerate.
             * include/debug/inplace_vector: New.
             * include/debug/safe_base.h (~_Safe_sequence_base()): Add 
C++11 noexcept
             qualification.
             (_Safe_sequence_base::operator=(const 
_Safe_sequence_base&)): New.
(_Safe_sequence_base::operator=(_Safe_sequence_base&&)): New.
             (_Safe_sequence_base::_M_invalidate_all): Add C++20 
constexpr qualification.
             * include/debug/safe_container.h
             (_Safe_container::operator=(const _Safe_container&)): 
Implement using same
             _Safe_sequence_base operator.
             * include/std/inplace_vector 
[_GLIBCXX_DEBUG](std::inplace_vector<>): Move
             implementation into __cxx1998 namespace.
             (erase, erase_if): Limit to non-debug inplace_vector<>, 
cleanup code.
             [_GLIBCXX_DEBUG]: Add include <debug/inplace_vector>.
             * testsuite/23_containers/inplace_vector/cons/1.cc: Adapt, 
skip several
             is_trivially_xxx checks when in _GLIBCXX_DEBUG mode.
             * testsuite/23_containers/inplace_vector/copy.cc: Likewise.
             * testsuite/23_containers/inplace_vector/move.cc: Likewise.
             * 
testsuite/23_containers/inplace_vector/debug/assign1_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/assign2_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/assign3_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/assign4_backtrace_neg.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/assign4_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/construct1_neg.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/construct2_neg.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/construct3_neg.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/construct4_neg.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/debug_functions.cc: New 
test case.
             * testsuite/23_containers/inplace_vector/debug/erase.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/insert1_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/insert2_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/insert3_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/insert4_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/insert5_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/insert7_neg.cc: New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/1.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/2.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/3.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/4.cc: New test 
case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/append_range.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/erase.cc: New 
test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/pop_back.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/push_back.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/swap.cc: New 
test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/try_append_range.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/try_emplace_back.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/try_push_back.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/invalidation/unchecked_emplace_back.cc: 
New test case.
             * 
testsuite/23_containers/inplace_vector/debug/multithreaded_swap.cc: New 
test case.
             * testsuite/util/debug/checks.h: Avoid using _GLIBCXX_DEBUG 
containers in test
             implementations.

Tested under Linux x86_64.

Ok to commit ?

PR: https://forge.sourceware.org/gcc/gcc-TEST/pulls/119

François



More information about the Libstdc++ mailing list