mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Ensure SmallVector::insert doesn't overwrite the last element in the range with the already-moved-from value
This would cause the last element in a range to be in a moved-from state after an insert at a non-end position, losing that value entirely in the process. Side note: move_backward is subtle. It copies [A, B) to C-1 and down. (the fact that it decrements both the second and third iterators before the first movement is the subtle part... kind of surprising, anyway) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210426 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -531,4 +531,26 @@ TEST(SmallVectorCustomTest, NoAssignTest) {
|
||||
EXPECT_EQ(42, vec.pop_back_val().x);
|
||||
}
|
||||
|
||||
struct MovedFrom {
|
||||
bool hasValue;
|
||||
MovedFrom() : hasValue(true) {
|
||||
}
|
||||
MovedFrom(MovedFrom&& m) : hasValue(m.hasValue) {
|
||||
m.hasValue = false;
|
||||
}
|
||||
MovedFrom &operator=(MovedFrom&& m) {
|
||||
hasValue = m.hasValue;
|
||||
m.hasValue = false;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
TEST(SmallVectorTest, MidInsert) {
|
||||
SmallVector<MovedFrom, 3> v;
|
||||
v.push_back(MovedFrom());
|
||||
v.insert(v.begin(), MovedFrom());
|
||||
for (MovedFrom &m : v)
|
||||
EXPECT_TRUE(m.hasValue);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user