From 49722de99527a97373df517dcb457f3170693a4f Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 11 Feb 2022 08:33:59 -0800 Subject: [PATCH] QWeakPointer: befriend other QWeakPointers Commit c677b3b8afcdc1d7b57353826cc01f378cd25e99 added move constructors, which introduced the issue. Pick-to: 6.2 6.3 Fixes: QTBUG-100795 Change-Id: I74249c52dc02478ba93cfffd16d2c879b923e352 Reviewed-by: Allan Sandfeld Jensen --- src/corelib/tools/qsharedpointer_impl.h | 3 +- .../qsharedpointer/tst_qsharedpointer.cpp | 55 ++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index b29de5f79a9..1b982c0cf90 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2021 The Qt Company Ltd. -** Copyright (C) 2020 Intel Corporation. +** Copyright (C) 2022 Intel Corporation. ** Copyright (C) 2019 Klarälvdalens Datakonsult AB. ** Contact: https://www.qt.io/licensing/ ** @@ -686,6 +686,7 @@ public: private: friend struct QtPrivate::EnableInternalData; template friend class QSharedPointer; + template friend class QWeakPointer; template friend class QPointer; template diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp index d526314d41f..5cba44dfb11 100644 --- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp +++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. -** Copyright (C) 2020 Intel Corporation. -** Copyright (C) 2019 Klarälvdalens Datakonsult AB. +** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 Intel Corporation. +** Copyright (C) 2021 Klarälvdalens Datakonsult AB. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -795,9 +795,14 @@ public: void tst_QSharedPointer::downCast() { { + // copy construction QSharedPointer ptr = QSharedPointer(new DerivedData); + QSharedPointer copy = ptr; QSharedPointer baseptr = qSharedPointerCast(ptr); QSharedPointer other; + QWeakPointer weak = ptr; + QWeakPointer baseweak = qSharedPointerCast(ptr); + QWeakPointer baseweak2 = qSharedPointerCast(weak); QVERIFY(ptr == baseptr); QVERIFY(baseptr == ptr); @@ -808,11 +813,55 @@ void tst_QSharedPointer::downCast() QVERIFY(other != ptr); QVERIFY(! (ptr == other)); QVERIFY(! (other == ptr)); + + // copy assignments + baseptr = qSharedPointerCast(ptr); + baseweak = qSharedPointerCast(ptr); + baseweak2 = baseweak; + + // move assignments (these don't actually move) + baseptr = qSharedPointerCast(std::move(ptr)); + ptr = copy; + baseweak = qSharedPointerCast(std::move(ptr)); + ptr = copy; + baseweak2 = qSharedPointerCast(std::move(baseweak)); + + // move construction (these don't actually move) + ptr = copy; + QSharedPointer ptr3(qSharedPointerCast(std::move(ptr))); + ptr = copy; + QWeakPointer baseweak3(qSharedPointerCast(std::move(ptr))); + ptr = copy; + QWeakPointer baseweak4(qSharedPointerCast(std::move(weak))); } { + // copy construction QSharedPointer ptr = QSharedPointer(new DerivedData); + QSharedPointer copy = ptr; QSharedPointer baseptr = ptr; + QWeakPointer weak = ptr; + QWeakPointer baseweak = ptr; + QWeakPointer baseweak2 = weak; + + // copy assignments + baseptr = ptr; + baseweak = ptr; + baseweak2 = weak; + + // move assignments (only the QSharedPointer-QSharedPointer actually moves) + baseweak = std::move(ptr); + baseweak2 = std::move(weak); + ptr = copy; + baseptr = std::move(ptr); + + // move construction (only the QSharedPointer-QSharedPointer actually moves) + ptr = copy; + QWeakPointer baseweak3(std::move(ptr)); + ptr = copy; + QWeakPointer baseweak4(std::move(weak)); + ptr = copy; + QSharedPointer baseptr2(std::move(ptr)); } int destructorCount;