changeset 32187:829a32a4171c

Use same destructor order in std::vector unconditionally (patch #10366). * libinterp/corefcn/stack-frame.cc (~base_value_stack_frame): Use the non-default destructor unconditionally on whether Octave is linking to libc++. Use more C++11 idioms.
author Markus Mützel <markus.muetzel@gmx.de>
date Tue, 11 Jul 2023 19:43:03 +0200
parents c462bb91dae4
children 85255746fc21
files libinterp/corefcn/stack-frame.cc
diffstat 1 files changed, 11 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/stack-frame.cc	Tue Jul 11 18:32:20 2023 +0200
+++ b/libinterp/corefcn/stack-frame.cc	Tue Jul 11 19:43:03 2023 +0200
@@ -1187,23 +1187,22 @@
   base_value_stack_frame&
   operator = (const base_value_stack_frame& elt) = delete;
 
-// LLVM libc++ has the opposite element dtor order compared to GNU libstdc++
-// for std::vector.  So, overwrite elements manually from first to last when
-// using LLVM libc++ to have identical dtor call order, e.g., for classdefs.
-#if defined (HAVE_LLVM_LIBCXX)
   ~base_value_stack_frame ()
   {
+    // The C++ standard doesn't guarantee in which order the elements of a
+    // std::vector are destroyed.  GNU libstdc++ and LLVM libc++ seem to
+    // destroy them in a different order.  So, overwrite elements manually
+    // from first to last to be able to guarantee a destructor call order
+    // independent of the used STL, e.g., for classdef objects.
+
     // Member dtor order is last to first.  So, m_auto_vars before m_values.
 
-    for (std::size_t i = 0; i < m_auto_vars.size (); i++)
-      m_auto_vars[i] = octave_value ();
-
-    for (std::size_t i = 0; i < m_values.size (); i++)
-      m_values[i] = octave_value ();
+    for (auto& auto_var : m_auto_vars)
+      auto_var = octave_value ();
+
+    for (auto& value : m_values)
+      value = octave_value ();
   }
-#else
-  ~base_value_stack_frame () = default;
-#endif
 
   std::size_t size () const
   {