================ @@ -288,92 +476,82 @@ template <class _Tp, class _Allocator> template <class _ForwardIterator> _LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::__construct_at_end_with_size(_ForwardIterator __first, size_type __n) { - _ConstructTransaction __tx(std::addressof(this->__end_), __n); + _ConstructTransaction __tx(this, __data_.end(), __n); for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void)++__first) { - __alloc_traits::construct(__alloc_, std::__to_address(__tx.__pos_), *__first); + __alloc_traits::construct(__data_.__alloc_, std::__to_address(__tx.__pos_), *__first); } } template <class _Tp, class _Allocator> _LIBCPP_CONSTEXPR_SINCE_CXX20 inline void __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type) { - while (__begin_ != __new_begin) - __alloc_traits::destroy(__alloc_, std::__to_address(__begin_++)); + pointer __begin = __data_.__begin_; + while (__begin != __new_begin) + __alloc_traits::destroy(__data_.__alloc_, std::__to_address(__begin++)); + __data_.__update_begin(__begin); ---------------- ldionne wrote:
Although we may not have the same issue I described above with respect to exception handling since this is destroying objects (and not constructing them), I think a comment like this would be welcome: ``` // Updating __data_'s begin at every iteration is unnecessary because destruction can't throw ``` That explains why we're OK with doing things this way and doesn't pessimize anything. https://github.com/llvm/llvm-project/pull/139632 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits