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 <allan.jensen@qt.io>
This commit is contained in:
parent
e09dd6b124
commit
49722de995
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2021 The Qt Company Ltd.
|
** Copyright (C) 2021 The Qt Company Ltd.
|
||||||
** Copyright (C) 2020 Intel Corporation.
|
** Copyright (C) 2022 Intel Corporation.
|
||||||
** Copyright (C) 2019 Klarälvdalens Datakonsult AB.
|
** Copyright (C) 2019 Klarälvdalens Datakonsult AB.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
@ -686,6 +686,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
friend struct QtPrivate::EnableInternalData;
|
friend struct QtPrivate::EnableInternalData;
|
||||||
template <class X> friend class QSharedPointer;
|
template <class X> friend class QSharedPointer;
|
||||||
|
template <class X> friend class QWeakPointer;
|
||||||
template <class X> friend class QPointer;
|
template <class X> friend class QPointer;
|
||||||
|
|
||||||
template <class X>
|
template <class X>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2019 The Qt Company Ltd.
|
** Copyright (C) 2021 The Qt Company Ltd.
|
||||||
** Copyright (C) 2020 Intel Corporation.
|
** Copyright (C) 2022 Intel Corporation.
|
||||||
** Copyright (C) 2019 Klarälvdalens Datakonsult AB.
|
** Copyright (C) 2021 Klarälvdalens Datakonsult AB.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of the test suite of the Qt Toolkit.
|
** This file is part of the test suite of the Qt Toolkit.
|
||||||
@ -795,9 +795,14 @@ public:
|
|||||||
void tst_QSharedPointer::downCast()
|
void tst_QSharedPointer::downCast()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
// copy construction
|
||||||
QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData);
|
QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData);
|
||||||
|
QSharedPointer<DerivedData> copy = ptr;
|
||||||
QSharedPointer<Data> baseptr = qSharedPointerCast<Data>(ptr);
|
QSharedPointer<Data> baseptr = qSharedPointerCast<Data>(ptr);
|
||||||
QSharedPointer<Data> other;
|
QSharedPointer<Data> other;
|
||||||
|
QWeakPointer<DerivedData> weak = ptr;
|
||||||
|
QWeakPointer<Data> baseweak = qSharedPointerCast<Data>(ptr);
|
||||||
|
QWeakPointer<Data> baseweak2 = qSharedPointerCast<Data>(weak);
|
||||||
|
|
||||||
QVERIFY(ptr == baseptr);
|
QVERIFY(ptr == baseptr);
|
||||||
QVERIFY(baseptr == ptr);
|
QVERIFY(baseptr == ptr);
|
||||||
@ -808,11 +813,55 @@ void tst_QSharedPointer::downCast()
|
|||||||
QVERIFY(other != ptr);
|
QVERIFY(other != ptr);
|
||||||
QVERIFY(! (ptr == other));
|
QVERIFY(! (ptr == other));
|
||||||
QVERIFY(! (other == ptr));
|
QVERIFY(! (other == ptr));
|
||||||
|
|
||||||
|
// copy assignments
|
||||||
|
baseptr = qSharedPointerCast<Data>(ptr);
|
||||||
|
baseweak = qSharedPointerCast<Data>(ptr);
|
||||||
|
baseweak2 = baseweak;
|
||||||
|
|
||||||
|
// move assignments (these don't actually move)
|
||||||
|
baseptr = qSharedPointerCast<Data>(std::move(ptr));
|
||||||
|
ptr = copy;
|
||||||
|
baseweak = qSharedPointerCast<Data>(std::move(ptr));
|
||||||
|
ptr = copy;
|
||||||
|
baseweak2 = qSharedPointerCast<Data>(std::move(baseweak));
|
||||||
|
|
||||||
|
// move construction (these don't actually move)
|
||||||
|
ptr = copy;
|
||||||
|
QSharedPointer<Data> ptr3(qSharedPointerCast<Data>(std::move(ptr)));
|
||||||
|
ptr = copy;
|
||||||
|
QWeakPointer<Data> baseweak3(qSharedPointerCast<Data>(std::move(ptr)));
|
||||||
|
ptr = copy;
|
||||||
|
QWeakPointer<Data> baseweak4(qSharedPointerCast<Data>(std::move(weak)));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
// copy construction
|
||||||
QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData);
|
QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData);
|
||||||
|
QSharedPointer<DerivedData> copy = ptr;
|
||||||
QSharedPointer<Data> baseptr = ptr;
|
QSharedPointer<Data> baseptr = ptr;
|
||||||
|
QWeakPointer<DerivedData> weak = ptr;
|
||||||
|
QWeakPointer<Data> baseweak = ptr;
|
||||||
|
QWeakPointer<Data> 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<Data> baseweak3(std::move(ptr));
|
||||||
|
ptr = copy;
|
||||||
|
QWeakPointer<Data> baseweak4(std::move(weak));
|
||||||
|
ptr = copy;
|
||||||
|
QSharedPointer<Data> baseptr2(std::move(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
int destructorCount;
|
int destructorCount;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user