On Fri, 25 Jul 2025, Tomasz Kamiński wrote: > 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 > --- > I believe the actual fix (adding = _Tp) is trivial and could be commited > without review. I have done more extensive changes to tests. > > Tested on x86_64-linux. > > 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 290cf6eb0e9..b5a81bed3c9 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 c7fda097896..8fb56e90623 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; > +};
Is this helper function to make the equality checks more concise? I like to just use: ranges::equal(c, (int[]){3, 6, 3}); which works generally for any range 'c' (of integers). But either approach works for me. LGTM either way. > > 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; }); > -- > 2.49.0 > >