[PATCH] libstdc++: Add std::inplace_vector for C++26 (P0843R14) [PR119137]

Jonathan Wakely jwakely@redhat.com
Thu Jul 17 16:39:27 GMT 2025


On 17/07/25 15:31 +0200, Tomasz Kamiński wrote:
>From: Jonathan Wakely <jwakely@redhat.com>
>
>Implement std::inplace_vector as specified in P0843R14, without follow
>up papers, in particular P3074R7 (trivial unions). In consequence
>inplace_vector<T, N> can be used inside constant evaluations only
>if T is trivial of N is equal to zero.
>
>We provide a separate specialization for inplace_vector<T, 0> to meet
>the requirements of N5008 [inplace.vector.overview] p5. In particular
>objects of such types needs to be empty.
>
>To allow contexpr variable of inplace_vector v, where v.size() < v.capacity(),
>we need to guaranteed that all elements of the storage array are initialized,
>even ones in range [v.data() + v.size(), v.data() + v.capacity()). This is
>perfomed by _M_init function, that is alled by each constructored. By storing
>the array in animous union, we can perform this intialization in constant
>evaluation, avoiding the impact on runtime path.
>
>The size() function conveys the information that _M_size <= _Nm to compiler,
>by calling __builtin_unreachable(). In particular this allows us to eliminate
>FP warnings by using _Nm - size() instead of _Nm - _M_size, when computing
>available elements.
>
>However, we still have one -Waggressive-loop-optimizations (to best of our
>knowledge false-positive warning produced in cons/from_range.cc and
>cons/throws.cc. Currently it is pruned using dg-prune-output and tracked by
>PR121143.
>
>The included test cover almost all code paths at runtime, however some
>compile time evaluation test are not yet implemented:
>* operations on range, they depenend on making testsuite_iterators constexpr
>* negative test for invoking operations with preconditions at compile time,
>  especially for zero size specialization.
>
>	PR libstdc++/119137
>
>libstdc++-v3/ChangeLog:
>
>	* doc/doxygen/user.cfg.in (INPUT): Add new header.
>	* include/Makefile.am: Add new header.
>	* include/Makefile.in: Regenerate.
>	* include/bits/version.def (inplace_vector): Define.
>	* include/bits/version.h: Regenerate.
>	* include/precompiled/stdc++.h: Include new header.
>	* src/c++23/std.cc.in: Export contents if new header.
>	* include/std/inplace_vector: New file.
>	* testsuite/23_containers/inplace_vector/access/capacity.cc: New file.
>	* testsuite/23_containers/inplace_vector/access/elem.cc: New file.
>	* testsuite/23_containers/inplace_vector/access/elem_neg.cc: New file.
>	* testsuite/23_containers/inplace_vector/cons/1.cc: New file.
>	* testsuite/23_containers/inplace_vector/cons/from_range.cc: New file.
>	* testsuite/23_containers/inplace_vector/cons/throws.cc: New file.
>	* testsuite/23_containers/inplace_vector/copy.cc: New file.
>	* testsuite/23_containers/inplace_vector/erasure.cc: New file.
>	* testsuite/23_containers/inplace_vector/modifiers/assign.cc: New file.
>	* testsuite/23_containers/inplace_vector/modifiers/erase.cc: New file.
>	* testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:
>	New file.
>	* testsuite/23_containers/inplace_vector/modifiers/single_insert.cc:
>	New file.
>	* testsuite/23_containers/inplace_vector/move.cc: New file.
>	* testsuite/23_containers/inplace_vector/relops.cc: New file.
>	* testsuite/23_containers/inplace_vector/version.cc: New file.
>	* testsuite/util/testsuite_iterators.h (input_iterator_wrapper::base):
>	Define.
>
>Co-authored-by: Tomasz Kamiński <tkaminsk@redhat.com>
>Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
>---
>Jonathan have provided initial implementation, that I (Tomasz) have
>later finished and extended the test coverate. Details can be found at:
>https://forge.sourceware.org/gcc/gcc-TEST/pulls/58
>
>Tested on x86_64-linux. OK for trunk?

OK for trunk with the typos in the commit msg fixed, and the redundant
header remove that Patrick noticed.




More information about the Libstdc++ mailing list