From bfb9b02d3b36244dc19c94a5693071a738bac8a2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 8 Apr 2020 12:13:55 -0300 Subject: QCborValue: fix the move-assignment operator The double-swap technique I used was flawed and broke on self-assignment. What I had meant to use was the move-and-swap technique. Thanks to Peppe for pointing it out. This also fixes a compiler bug in the Green Hills compiler. It was finding the wrong "swap" function in qSwap: using std::swap; swap(value1, value2); It's supposed to find swap(QCborValue &, QCborValue &) due to argument- dependent lookup. It's instead finding std::swap, which recurses. Fixes: QTBUG-83390 Change-Id: Ibdc95e9af7bd456a94ecfffd1603e1bee90cd107 Reviewed-by: Giuseppe D'Angelo --- src/corelib/serialization/qcborvalue.h | 5 ++--- .../auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/corelib/serialization/qcborvalue.h b/src/corelib/serialization/qcborvalue.h index f7064ac6e1..aa51e5da81 100644 --- a/src/corelib/serialization/qcborvalue.h +++ b/src/corelib/serialization/qcborvalue.h @@ -188,9 +188,8 @@ public: QCborValue &operator=(const QCborValue &other); QCborValue &operator=(QCborValue &&other) noexcept { - QCborValue tmp; - qSwap(*this, tmp); - qSwap(other, *this); + QCborValue tmp(std::move(other)); + swap(tmp); return *this; } diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp index 05cf199abe..64321c11fa 100644 --- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp +++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp @@ -385,9 +385,21 @@ void tst_QCborValue::copyCompare() { QFETCH(QCborValue, v); QCborValue other = v; + + // self-moving + v = std::move(v); + QCOMPARE(v, other); // make sure it's still valid + + // moving + v = std::move(other); + other = std::move(v); + + // normal copying + other = v; other = v; v = other; + QCOMPARE(v.compare(other), 0); QCOMPARE(v, other); QVERIFY(!(v != other)); -- cgit v1.2.3