diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 7927a6dd2b9..a9c6babbf58 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -569,7 +569,7 @@ public: template = true> Q_NODISCARD_CTOR QWeakPointer(QWeakPointer &&other) noexcept - : d(other.d), value(other.value) + : d(other.d), value(other.toStrongRef().get()) // must go through QSharedPointer, see below { other.d = nullptr; other.value = nullptr; @@ -677,7 +677,7 @@ private: template inline QWeakPointer &assign(X *ptr) - { return *this = QWeakPointer(ptr, true); } + { return *this = QWeakPointer(ptr, true); } #ifndef QT_NO_QOBJECT template = true> diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp index 4b1354dc419..5c4514eeb49 100644 --- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp +++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp @@ -1275,6 +1275,22 @@ void tst_QSharedPointer::virtualBaseDifferentPointers() QVERIFY(baseptr == aBase); } safetyCheck(); + { + VirtualDerived *aData = new VirtualDerived; + + QSharedPointer ptr = QSharedPointer(aData); + QWeakPointer wptr = ptr; + + ptr.reset(); + QVERIFY(wptr.toStrongRef().isNull()); + + QWeakPointer wptr2 = wptr; + QVERIFY(wptr2.toStrongRef().isNull()); + + QWeakPointer wptr3 = std::move(wptr); + QVERIFY(wptr3.toStrongRef().isNull()); + } + safetyCheck(); } #ifndef QTEST_NO_RTTI