Hi!

For T with non-trivial destructors, we were destructing objects in the
vector on release only when not using auto storage of auto_vec.

The following patch calls truncate (0) instead of m_vecpfx.m_num clearing,
and truncate takes care of that destruction:
  unsigned l = length ();
  gcc_checking_assert (l >= size);
  if (!std::is_trivially_destructible <T>::value)
    vec_destruct (address () + size, l - size);
  m_vecpfx.m_num = size;

Bootstrapped/regtested on x86_64-linux and i686-linux, plus tested on the
testcase from the PR under valgrind, ok for trunk?

2025-01-15  Jakub Jelinek  <ja...@redhat.com>

        PR ipa/118400
        * vec.h (vec<T, va_heap, vl_ptr>::release): Call m_vec->truncate (0)
        instead of clearing m_vec->m_vecpfx.m_num.

--- gcc/vec.h.jj        2025-01-15 08:43:16.259249515 +0100
+++ gcc/vec.h   2025-01-15 09:32:25.755433708 +0100
@@ -2020,7 +2020,7 @@ vec<T, va_heap, vl_ptr>::release (void)
 
   if (using_auto_storage ())
     {
-      m_vec->m_vecpfx.m_num = 0;
+      m_vec->truncate (0);
       return;
     }
 

        Jakub

Reply via email to