Skip to content

Commit

Permalink
Stabilize autotest
Browse files Browse the repository at this point in the history
calling emplace() on a std::vector with a reference
pointing into the same vector is undefined behavior.
Fix this by using a temporary inbetween.

Change-Id: I47c28700dffa2107fb0cba302168c86b659eafb3
Reviewed-by: Thiago Macieira <[email protected]>
  • Loading branch information
laknoll committed Jun 1, 2020
1 parent 51beb81 commit 4c5f6eb
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions tests/auto/corelib/tools/qvector/tst_qvector.cpp
Original file line number Diff line number Diff line change
@@ -2793,36 +2793,40 @@ void tst_QVector::emplaceConsistentWithStdVectorImpl() const
stdVec.emplace(stdVec.begin() + 3, 'g');
vecEq(qVec, stdVec);

T t;
// while QVector is safe with regards to emplacing elements moved form itself, it's UB
// for std::vector, so do the moving in two steps there.
qVec.emplaceBack(std::move(qVec[0]));
stdVec.emplace_back(std::move(stdVec[0]));
stdVec.emplace_back(std::move(t = std::move(stdVec[0])));
vecEq(qVec, stdVec);

squeezeVec(qVec, stdVec);

qVec.emplaceBack(std::move(qVec[1]));
stdVec.emplace_back(std::move(stdVec[1]));
stdVec.emplace_back(std::move(t = std::move(stdVec[1])));
vecEq(qVec, stdVec);

squeezeVec(qVec, stdVec);

qVec.emplace(3, std::move(qVec[5]));
stdVec.emplace(stdVec.begin() + 3, std::move(stdVec[5]));
stdVec.emplace(stdVec.begin() + 3, std::move(t = std::move(stdVec[5])));

vecEq(qVec, stdVec);

qVec.emplaceBack(qVec[3]);
stdVec.emplace_back(stdVec[3]);
stdVec.emplace_back((t = stdVec[3]));
vecEq(qVec, stdVec);

squeezeVec(qVec, stdVec);

qVec.emplaceBack(qVec[4]);
stdVec.emplace_back(stdVec[4]);
stdVec.emplace_back((t = stdVec[4]));
vecEq(qVec, stdVec);

squeezeVec(qVec, stdVec);

qVec.emplace(5, qVec[7]);
stdVec.emplace(stdVec.begin() + 5, stdVec[7]);
stdVec.emplace(stdVec.begin() + 5, (t = stdVec[7]));
vecEq(qVec, stdVec);
}

0 comments on commit 4c5f6eb

Please sign in to comment.