[PATCH] Add std::deque shrink_to_fit test

François Dumont frs.dumont@gmail.com
Mon Apr 14 20:25:02 GMT 2025


On 14/04/2025 08:29, Tomasz Kaminski wrote:
>
>
> On Sun, Apr 13, 2025 at 12:13 PM François Dumont 
> <frs.dumont@gmail.com> wrote:
>
>
>     On 11/04/2025 08:36, Tomasz Kaminski wrote:
>>
>>
>>     On Thu, Apr 10, 2025 at 10:47 PM Jonathan Wakely
>>     <jwakely@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
>>
>     Thanks, I new I needed to add something like that but then forgot
>     to amend my test.
>
>
>>
>>         >
>>         > // 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?
>>
>     Sounds better indeed, done using std::__deque_buf_size extension.
>
>
>>     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; }
>>      }; 	
>>     	
>>
>>     	
>>
>>
>     It is a nice alternative even if you are still relying on the 512
>     implementation detail hidden by _GLIBCXX_DEQUE_BUF_SIZE macro.
>
>     This is why I preferred to use__deque_buf_size.
>
> When using _GLIBCXX_DEBUG this function will be defined inside 
> std::__cxx1998 namespace, not in the std directly.
> There is a macro _GLIBCXX_STD_C that can be used to refer to it, but 
> it works only inside std namespace.

Fixed in this new version.

Ok to commit ?

François

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20250414/415618b1/attachment.htm>
-------------- next part --------------
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..4dbf405d57b 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,6 @@
 // { dg-do run { target c++11 } }
+// { dg-require-effective-target std_allocator_new }
+// { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } }
 
 // 2010-01-08  Paolo Carlini  <paolo.carlini@oracle.com>
 
@@ -19,18 +21,42 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-#include <vector>
+#include <deque>
 #include <testsuite_hooks.h>
+#include <replacement_memory_operators.h>
 
 // libstdc++/42573
 void test01()
 {
-  std::vector<int> d(100);
-  d.push_back(1);
-  d.push_back(1);
-  // VERIFY( d.size() < d.capacity() );
+  using namespace std;
+  __gnu_test::counter::reset();
+
+  const size_t buf_size = _GLIBCXX_STD_C::__deque_buf_size(sizeof(size_t));
+  deque<size_t> d;
+  for (size_t i = 0; i != buf_size; ++i)
+    d.push_back(i);
+
+  // No shrink if 1st buffer is full, create some front capacity.
+  d.pop_front();
+
+  // 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() );
+
+  // No reallocation if no exception support, shrink_to_fit is then a
+  // no-op.
+#if __cpp_exceptions
+  // 1 node array allocation + 1 node allocation = 2.
+  const int expected_count = 2;
+  const int expected_increments = 2;
+#else
+  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