Stabilize autotest

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 <thiago.macieira@intel.com>
This commit is contained in:
Lars Knoll 2020-05-26 14:53:14 +02:00
parent 51beb816e8
commit 4c5f6eb74c

View File

@ -2793,36 +2793,40 @@ void tst_QVector::emplaceConsistentWithStdVectorImpl() const
stdVec.emplace(stdVec.begin() + 3, 'g'); stdVec.emplace(stdVec.begin() + 3, 'g');
vecEq(qVec, stdVec); 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])); 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); vecEq(qVec, stdVec);
squeezeVec(qVec, stdVec); squeezeVec(qVec, stdVec);
qVec.emplaceBack(std::move(qVec[1])); 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); vecEq(qVec, stdVec);
squeezeVec(qVec, stdVec); squeezeVec(qVec, stdVec);
qVec.emplace(3, std::move(qVec[5])); 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); vecEq(qVec, stdVec);
qVec.emplaceBack(qVec[3]); qVec.emplaceBack(qVec[3]);
stdVec.emplace_back(stdVec[3]); stdVec.emplace_back((t = stdVec[3]));
vecEq(qVec, stdVec); vecEq(qVec, stdVec);
squeezeVec(qVec, stdVec); squeezeVec(qVec, stdVec);
qVec.emplaceBack(qVec[4]); qVec.emplaceBack(qVec[4]);
stdVec.emplace_back(stdVec[4]); stdVec.emplace_back((t = stdVec[4]));
vecEq(qVec, stdVec); vecEq(qVec, stdVec);
squeezeVec(qVec, stdVec); squeezeVec(qVec, stdVec);
qVec.emplace(5, qVec[7]); qVec.emplace(5, qVec[7]);
stdVec.emplace(stdVec.begin() + 5, stdVec[7]); stdVec.emplace(stdVec.begin() + 5, (t = stdVec[7]));
vecEq(qVec, stdVec); vecEq(qVec, stdVec);
} }