[PATCH] Add std::deque shrink_to_fit test

Jonathan Wakely jwakely@redhat.com
Thu Apr 10 20:45:51 GMT 2025


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.carlini@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?

>+#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;
> }



More information about the Libstdc++ mailing list