Mercurial > octave
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 {