On Thu, Apr 10, 2025 at 10:47 PM Jonathan Wakely <jwak...@redhat.com> wrote:
> On 10/04/25 22:36 +0200, François Dumont wrote: > >After running the test with -fno-exceptions option we rather need this > >patch. > > > >Ok to commit ? > > > >François > > > > > >On 10/04/2025 21:08, François Dumont wrote: > >>Hi > >> > >> No problem detected now that we really test std::deque > >>shrink_to_fit implementation. > >> > >> libstdc++: Add std::deque<>::shrink_to_fit test > >> > >> The existing test is currently testing std::vector. Make it test > >>std::deque. > >> > >> libstdc++-v3/ChangeLog: > >> > >> * > >>testsuite/23_containers/deque/capacity/shrink_to_fit.cc: Adapt test > >> to check std::deque shrink_to_fit method. > >> > >>Tested under Linux x64. > >> > >>Ok to commit ? > >> > >>François > > >diff --git > a/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc > b/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc > >index 7cb67079214..9c8b3a926e8 100644 > >--- a/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc > >+++ b/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc > >@@ -1,4 +1,5 @@ > > // { dg-do run { target c++11 } } > >+// { dg-add-options no_pch } > > Tests using replacement_memory_operators.h need: > > // { dg-require-effective-target std_allocator_new } > // { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } } > > See e.g. 23_containers/unordered_set/96088.cc > > > > > // 2010-01-08 Paolo Carlini <paolo.carl...@oracle.com> > > > >@@ -19,18 +20,39 @@ > > // with this library; see the file COPYING3. If not see > > // <http://www.gnu.org/licenses/>. > > > >-#include <vector> > >+#define _GLIBCXX_DEQUE_BUF_SIZE sizeof(int) * 3 > > Couldn't the test just create more elements, instead of modifying the > internals? We should test it using the default parameters, no? > In from_range test I have used a class that contains some padding, to be able to fill the deque buffer, while still test with few elements, struct EightInBuf { EightInBuf(int x) : elems{x} { } private: int elems[512 / (sizeof(int) * 8)]; friend constexpr bool operator==(EightInBuf const& lhs, int rhs) { return lhs.elems[0] == rhs; } }; > >+#include <deque> > > #include <testsuite_hooks.h> > >+#include <replacement_memory_operators.h> > > > > // libstdc++/42573 > > void test01() > > { > >- std::vector<int> d(100); > >+ __gnu_test::counter::reset(); > >+ > >+ std::deque<int> d; > > d.push_back(1); > > d.push_back(1); > >- // VERIFY( d.size() < d.capacity() ); > >+ d.push_back(1); > >+ d.pop_front(); > >+ VERIFY( d.size() == 2 ); > >+ // 1 node array allocation + 2 node allocation = 3. > >+ VERIFY( __gnu_test::counter::count() == 3 ); > >+ VERIFY( __gnu_test::counter::get()._M_increments == 3 ); > >+ > > d.shrink_to_fit(); > >- // VERIFY( d.size() == d.capacity() ); > >+ VERIFY( d.size() == 2 ); > >+#if __cpp_exceptions > >+ // 1 node array allocation + 1 node allocation = 2. > >+ const int expected_count = 2; > >+ const int expected_increments = 2; > >+#else > > It would be useful to add a comment here saying that shrink_to_fit() > is a no-op for -fno-exceptions because we choose not to reallocate. > > >+ const int expected_count = 3; > >+ const int expected_increments = 0; > >+#endif > >+ VERIFY( __gnu_test::counter::count() == expected_count ); > >+ VERIFY( __gnu_test::counter::get()._M_increments == 3 + > expected_increments ); > > } > > > > int main() > >diff --git a/libstdc++-v3/testsuite/util/replacement_memory_operators.h > b/libstdc++-v3/testsuite/util/replacement_memory_operators.h > >index 2516cd24ae1..69afa77754d 100644 > >--- a/libstdc++-v3/testsuite/util/replacement_memory_operators.h > >+++ b/libstdc++-v3/testsuite/util/replacement_memory_operators.h > >@@ -36,8 +36,12 @@ namespace __gnu_test > > > > ~counter() THROW (counter_error) > > { > >+#if __cpp_exceptions > > if (_M_throw && _M_count != 0) > > throw counter_error(); > >+#else > >+ VERIFY( !_M_throw || _M_count == 0 ); > >+#endif > > } > > > > static void > >@@ -133,8 +137,12 @@ void* operator new(std::size_t size) > THROW(std::bad_alloc) > > { > > std::printf("operator new is called \n"); > > void* p = std::malloc(size); > >+#if __cpp_exceptions > > if (!p) > > throw std::bad_alloc(); > >+#else > >+ VERIFY( p ); > >+#endif > > __gnu_test::counter::increment(); > > return p; > > } > >