[libcxx-commits] [libcxx] 8458bbe - [libc++] Fix capacity increase issue with `shrink_to_fit` for `__split_buffer` (#117720)

via libcxx-commits libcxx-commits at lists.llvm.org
Tue Nov 26 13:38:50 PST 2024


Author: Peng Liu
Date: 2024-11-26T16:38:47-05:00
New Revision: 8458bbe5947db75041579c7c1a0f7f79c8e992d9

URL: https://github.com/llvm/llvm-project/commit/8458bbe5947db75041579c7c1a0f7f79c8e992d9
DIFF: https://github.com/llvm/llvm-project/commit/8458bbe5947db75041579c7c1a0f7f79c8e992d9.diff

LOG: [libc++] Fix capacity increase issue with `shrink_to_fit` for `__split_buffer` (#117720)

This PR fixes the issue where `__split_buffer::shrink_to_fit` may
unexpectedly increase the capacity, similar to the issue for
`std::vector` in #97895. The fix follows the same approach
used in #97895 for `std::vector`.

Added: 
    

Modified: 
    libcxx/include/__split_buffer

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer
index a44811c766735a..a637c83d17d107 100644
--- a/libcxx/include/__split_buffer
+++ b/libcxx/include/__split_buffer
@@ -410,12 +410,14 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::shrink_to_fi
     try {
 #endif // _LIBCPP_HAS_EXCEPTIONS
       __split_buffer<value_type, __alloc_rr&> __t(size(), 0, __alloc_);
-      __t.__construct_at_end(move_iterator<pointer>(__begin_), move_iterator<pointer>(__end_));
-      __t.__end_ = __t.__begin_ + (__end_ - __begin_);
-      std::swap(__first_, __t.__first_);
-      std::swap(__begin_, __t.__begin_);
-      std::swap(__end_, __t.__end_);
-      std::swap(__cap_, __t.__cap_);
+      if (__t.capacity() < capacity()) {
+        __t.__construct_at_end(move_iterator<pointer>(__begin_), move_iterator<pointer>(__end_));
+        __t.__end_ = __t.__begin_ + (__end_ - __begin_);
+        std::swap(__first_, __t.__first_);
+        std::swap(__begin_, __t.__begin_);
+        std::swap(__end_, __t.__end_);
+        std::swap(__cap_, __t.__cap_);
+      }
 #if _LIBCPP_HAS_EXCEPTIONS
     } catch (...) {
     }


        


More information about the libcxx-commits mailing list