https://gcc.gnu.org/g:bdff4d7a8c0a39c66cd2609c7d818d7afe05ce6c
commit r16-2572-gbdff4d7a8c0a39c66cd2609c7d818d7afe05ce6c Author: Tomasz Kamiński <tkami...@redhat.com> Date: Fri Jul 25 14:50:26 2025 +0200 libstdc++: Support braces as arguments for std::erase on inplace_vector [PR121196] PR libstdc++/121196 libstdc++-v3/ChangeLog: * include/std/inplace_vector (std::erase): Provide default argument for _Up parameter. * testsuite/23_containers/inplace_vector/erasure.cc: Add test for using braces-init-list as arguments to erase_if and use function to verify content of inplace_vector Reviewed-by: Patrick Palka <ppa...@redhat.com> Signed-off-by: Tomasz Kamiński <tkami...@redhat.com> Diff: --- libstdc++-v3/include/std/inplace_vector | 2 +- .../23_containers/inplace_vector/erasure.cc | 26 +++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/include/std/inplace_vector b/libstdc++-v3/include/std/inplace_vector index 290cf6eb0e92..b5a81bed3c98 100644 --- a/libstdc++-v3/include/std/inplace_vector +++ b/libstdc++-v3/include/std/inplace_vector @@ -1354,7 +1354,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } - template<typename _Tp, size_t _Nm, typename _Up> + template<typename _Tp, size_t _Nm, typename _Up = _Tp> constexpr size_t erase(inplace_vector<_Tp, _Nm>& __cont, const _Up& __value) { diff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc index c7fda0978967..8fb56e906234 100644 --- a/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc +++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc @@ -2,18 +2,38 @@ #include <inplace_vector> #include <testsuite_hooks.h> +#include <span> + +template<typename T, size_t N> +constexpr bool +eq(const std::inplace_vector<T, N>& l, std::span<const T> r) { + if (l.size() != r.size()) + return false; + for (auto i = 0u; i < l.size(); ++i) + if (l[i] != r[i]) + return false; + return true; +}; constexpr void test_erase() { - std::inplace_vector<int, 15> c{1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 4, 4, 9}; + std::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( (c == std::inplace_vector<int, 15>{2, 3, 5, 6, 5, 3, 2}) ); + 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}) ); std::inplace_vector<int, 0> e; std::erase(e, 10); @@ -29,7 +49,7 @@ test_erase_if() std::erase_if(c, [](int i) { return i == 4; }); VERIFY( c.size() == 8 ); std::erase_if(c, [](int i) { return i & 1; }); - VERIFY( (c == std::inplace_vector<int, 15>{2, 2}) ); + VERIFY( eq(c, {2, 2}) ); std::inplace_vector<int, 0> e; std::erase_if(e, [](int i) { return i > 5; });