# HG changeset patch # User Petter T. # Date 1687647403 -7200 # Sun Jun 25 00:56:43 2023 +0200 # Node ID 6b2ace2f94425828748c019ccea9c08060f6ecd8 # Parent 7b6c9c6bce7dae978cf96802459c9e2fd27e679c Same destructor order for octave_value:s in frame in std::vector for libstdc++ and libc++ * libinterp/corefcn/stack-frame.cc: Explicitly overwrite octave_value:s in libstdc++ order for libc++ users diff -r 7b6c9c6bce7d -r 6b2ace2f9442 libinterp/corefcn/stack-frame.cc --- a/libinterp/corefcn/stack-frame.cc Sat Jun 24 01:19:50 2023 +0200 +++ b/libinterp/corefcn/stack-frame.cc Sun Jun 25 00:56:43 2023 +0200 @@ -1187,7 +1187,23 @@ base_value_stack_frame& operator = (const base_value_stack_frame& elt) = delete; +// Clang's friend libc++ have opposite element dtor order from libstdc++ for std::vector +// so we overwrite elements in the first to last order for libc++ to not reverse +// dtor call order for e.g. classdefs comparered to libstdc++ users. +#ifdef _LIBCPP_VERSION + // This dtor is for libc++ + ~base_value_stack_frame () + { + // 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 (); + } +#else ~base_value_stack_frame () = default; +#endif std::size_t size () const {