diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-05-26 14:53:14 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-06-01 20:57:55 +0200 |
commit | 4c5f6eb74cfb3282513c0837c80a08705c1da844 (patch) | |
tree | 7850ddbe3546d929820226fd7c925e7c527642de | |
parent | 51beb816e8be43b3e1ac4ab92dfe732d0fd91b2b (diff) |
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>
-rw-r--r-- | tests/auto/corelib/tools/qvector/tst_qvector.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp index 739c841ae1..d4f2b8afd5 100644 --- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp +++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp @@ -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); } |