]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
vec.h: Properly destruct elements in auto_vec auto storage [PR118400]
authorJakub Jelinek <jakub@redhat.com>
Thu, 16 Jan 2025 08:17:50 +0000 (09:17 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 10 Feb 2025 14:37:26 +0000 (15:37 +0100)
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;

2025-01-16  Jakub Jelinek  <jakub@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.

(cherry picked from commit 43f4d44bebd63b354f8798fcef512d4d2b42c655)

gcc/vec.h

index bc83827f644eb706112214eb93f07aa36fdf683f..84540d4802e08e78e29cbf9c8cdf1a44520e2635 100644 (file)
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -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;
     }