summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-05-26 14:53:14 +0200
committerLars Knoll <lars.knoll@qt.io>2020-06-01 20:57:55 +0200
commit4c5f6eb74cfb3282513c0837c80a08705c1da844 (patch)
tree7850ddbe3546d929820226fd7c925e7c527642de
parent51beb816e8be43b3e1ac4ab92dfe732d0fd91b2b (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.cpp16
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);
}