From 03635c2677d49f2d522855f46f21011c3badd890 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 5 Jan 2023 10:06:33 -0300 Subject: [PATCH] QUrlQuery: add missing move constructor It wasn't added when this class was created in 5.0 because we couldn't add move constructors and still keep the ability to compile Qt with C++98 compilers. We've forgot to correct this shortcoming since 5.6. Fixes: QTBUG-109842 Change-Id: I69ecc04064514f939896fffd17376b8243b73c52 Reviewed-by: Marc Mutz (cherry picked from commit fc8dad2f10e7976cfa778ca7d75e651012629b21) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/io/qurlquery.cpp | 10 ++++++++ src/corelib/io/qurlquery.h | 1 + .../corelib/io/qurlquery/tst_qurlquery.cpp | 24 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/src/corelib/io/qurlquery.cpp b/src/corelib/io/qurlquery.cpp index 57e66142ca1..d90c80be6da 100644 --- a/src/corelib/io/qurlquery.cpp +++ b/src/corelib/io/qurlquery.cpp @@ -363,6 +363,16 @@ QUrlQuery::QUrlQuery(const QUrlQuery &other) { } +/*! + \since 6.5 + Moves the contents of the \a other QUrlQuery object, including the query + delimiters. +*/ +QUrlQuery::QUrlQuery(QUrlQuery &&other) noexcept + : d(std::move(other.d)) +{ +} + /*! Copies the contents of the \a other QUrlQuery object, including the query delimiters. diff --git a/src/corelib/io/qurlquery.h b/src/corelib/io/qurlquery.h index 16dcc44ff23..411f19a4c80 100644 --- a/src/corelib/io/qurlquery.h +++ b/src/corelib/io/qurlquery.h @@ -30,6 +30,7 @@ public: } QUrlQuery(const QUrlQuery &other); + QUrlQuery(QUrlQuery &&other) noexcept; QUrlQuery &operator=(const QUrlQuery &other); QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QUrlQuery) ~QUrlQuery(); diff --git a/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp b/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp index 41482f42562..deb6fce5635 100644 --- a/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp +++ b/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp @@ -172,6 +172,7 @@ void tst_QUrlQuery::constructing() QVERIFY(other != empty); QVERIFY(!(other == empty)); + // copy-construct QUrlQuery copy(other); QCOMPARE(copy, other); @@ -179,10 +180,33 @@ void tst_QUrlQuery::constructing() QVERIFY(copy.isEmpty()); QVERIFY(copy != other); + // copy-assign copy = other; QVERIFY(!copy.isEmpty()); QCOMPARE(copy, other); + // move-construct + QUrlQuery moved(std::move(other)); + QCOMPARE(moved, copy); + + // self move-assign + moved = std::move(moved); + QCOMPARE(moved, copy); + + // self move-assign of moved-from (Hinnant Criterion) + other = std::move(other); + // shouldn't crash; here, or further down + + // copy-assign to moved-from object + other = copy; + QCOMPARE(other, copy); + QCOMPARE(other, moved); + + // move-assign + moved = std::move(other); + QCOMPARE(moved, copy); + + // (move-)assign default-constructed copy = QUrlQuery(); QVERIFY(copy.isEmpty());