[llvm-branch-commits] [llvm] f1278ce - Revert "[ADT] Allow SmallVector move construction without move assignment (#2…"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 2 02:54:53 PDT 2026
Author: Mehdi Amini
Date: 2026-09-02T11:54:48+02:00
New Revision: f1278ce113a89e8476f216a358002deb8efe94a7
URL: https://github.com/llvm/llvm-project/commit/f1278ce113a89e8476f216a358002deb8efe94a7
DIFF: https://github.com/llvm/llvm-project/commit/f1278ce113a89e8476f216a358002deb8efe94a7.diff
LOG: Revert "[ADT] Allow SmallVector move construction without move assignment (#2…"
This reverts commit af2ddf42e4499169f8d96d1ff928f3d92bbcc9a2.
Added:
Modified:
llvm/include/llvm/ADT/SmallVector.h
llvm/unittests/ADT/SmallVectorTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h
index d7fcc3a97a88c..134c74bfd48d0 100644
--- a/llvm/include/llvm/ADT/SmallVector.h
+++ b/llvm/include/llvm/ADT/SmallVector.h
@@ -616,20 +616,6 @@ class SmallVectorImpl : public SmallVectorTemplateBase<T> {
RHS.resetToSmall();
}
- void moveConstructFrom(SmallVectorImpl &&RHS) {
- assert(this->empty() && "move construction requires an empty vector");
- if (!RHS.isSmall()) {
- assignRemote(std::move(RHS));
- return;
- }
-
- // Construct inline elements directly instead of requiring T to be move
- // assignable through the general move-assignment implementation.
- append(std::make_move_iterator(RHS.begin()),
- std::make_move_iterator(RHS.end()));
- RHS.clear();
- }
-
~SmallVectorImpl() {
// Subclass has already destructed this vector's elements.
// If this wasn't grown from the inline copy, deallocate the old space.
@@ -1297,12 +1283,12 @@ class LLVM_GSL_OWNER SmallVector : public SmallVectorImpl<T>,
SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
if (!RHS.empty())
- this->moveConstructFrom(::std::move(RHS));
+ SmallVectorImpl<T>::operator=(::std::move(RHS));
}
SmallVector(SmallVectorImpl<T> &&RHS) : SmallVectorImpl<T>(N) {
if (!RHS.empty())
- this->moveConstructFrom(::std::move(RHS));
+ SmallVectorImpl<T>::operator=(::std::move(RHS));
}
SmallVector &operator=(SmallVector &&RHS) {
diff --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp
index 03f58fabeb54c..4a32c6d2ff08a 100644
--- a/llvm/unittests/ADT/SmallVectorTest.cpp
+++ b/llvm/unittests/ADT/SmallVectorTest.cpp
@@ -167,22 +167,6 @@ struct NonCopyable {
NonCopyable &operator=(const NonCopyable &) = delete;
};
-struct MoveConstructOnly {
- explicit MoveConstructOnly(int Value) : Value(Value) {}
- MoveConstructOnly(MoveConstructOnly &&RHS) : Value(RHS.Value) {
- RHS.Value = -1;
- }
-
- MoveConstructOnly(const MoveConstructOnly &) = delete;
- MoveConstructOnly &operator=(const MoveConstructOnly &) = delete;
- MoveConstructOnly &operator=(MoveConstructOnly &&) = delete;
-
- int Value;
-};
-
-static_assert(std::is_move_constructible_v<MoveConstructOnly>);
-static_assert(!std::is_move_assignable_v<MoveConstructOnly>);
-
LLVM_ATTRIBUTE_USED void CompileTest() {
SmallVector<NonCopyable, 0> V;
V.resize(42);
@@ -193,50 +177,6 @@ TEST(SmallVectorTest, ConstructNonCopyableTest) {
EXPECT_EQ(V.size(), (size_t)42);
}
-TEST(SmallVectorTest, MoveConstructNonMoveAssignableInlineElements) {
- SmallVector<MoveConstructOnly, 2> From;
- From.emplace_back(1);
- From.emplace_back(2);
- const MoveConstructOnly *FromData = From.data();
-
- SmallVector<MoveConstructOnly, 2> To(std::move(From));
-
- EXPECT_TRUE(From.empty());
- ASSERT_EQ(2u, To.size());
- EXPECT_NE(FromData, To.data());
- EXPECT_EQ(1, To[0].Value);
- EXPECT_EQ(2, To[1].Value);
-}
-
-TEST(SmallVectorTest, MoveConstructNonMoveAssignableAllocatedElements) {
- SmallVector<MoveConstructOnly, 1> From;
- From.emplace_back(1);
- From.emplace_back(2);
- const MoveConstructOnly *FromData = From.data();
-
- SmallVector<MoveConstructOnly, 1> To(std::move(From));
-
- EXPECT_TRUE(From.empty());
- ASSERT_EQ(2u, To.size());
- EXPECT_EQ(FromData, To.data());
- EXPECT_EQ(1, To[0].Value);
- EXPECT_EQ(2, To[1].Value);
-}
-
-TEST(SmallVectorTest, MoveConstructNonMoveAssignableFromSmallVectorImpl) {
- SmallVector<MoveConstructOnly, 2> From;
- From.emplace_back(1);
- From.emplace_back(2);
-
- SmallVector<MoveConstructOnly, 0> To(
- std::move(static_cast<SmallVectorImpl<MoveConstructOnly> &>(From)));
-
- EXPECT_TRUE(From.empty());
- ASSERT_EQ(2u, To.size());
- EXPECT_EQ(1, To[0].Value);
- EXPECT_EQ(2, To[1].Value);
-}
-
// Assert that v contains the specified values, in order.
template <typename VectorT>
void assertValuesInOrder(VectorT &v, size_t size, ...) {
More information about the llvm-branch-commits
mailing list