[gcc r16-2572] libstdc++: Support braces as arguments for std::erase on inplace_vector [PR121196]
Tomasz Kaminski
tkaminsk@gcc.gnu.org
Mon Jul 28 06:34:16 GMT 2025
https://gcc.gnu.org/g:bdff4d7a8c0a39c66cd2609c7d818d7afe05ce6c
commit r16-2572-gbdff4d7a8c0a39c66cd2609c7d818d7afe05ce6c
Author: Tomasz Kamiński <tkaminsk@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 <ppalka@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@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; });
More information about the Libstdc++-cvs
mailing list