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?

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

Reply via email to