tst_QSharedPointer: check QWeakPointer vs. virtual bases

This fell out of my tracking of a failure of the new QPointer
conversion feature, and it would be a waste to throw it away unused.

Pick-to: 6.7 6.5 6.2 5.15
Change-Id: Ie255b4a6432b4763071e5712d92e9ccd57927052
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
(cherry picked from commit 0e40a3f6645a684458cbb09bef1353df2eec5e0b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Marc Mutz 2023-05-03 14:55:10 +02:00 committed by Qt Cherry-pick Bot
parent 3b1d3db793
commit 44a94e03dd

View File

@ -59,6 +59,7 @@ private slots:
void objectCastStdSharedPtr();
void differentPointers();
void virtualBaseDifferentPointers();
void virtualBaseWeakPointerConversions();
#ifndef QTEST_NO_RTTI
void dynamicCast();
void dynamicCastDifferentPointers();
@ -1294,6 +1295,67 @@ void tst_QSharedPointer::virtualBaseDifferentPointers()
safetyCheck();
}
void tst_QSharedPointer::virtualBaseWeakPointerConversions()
{
struct Base { virtual ~Base() = default; };
struct Derived : virtual Base {};
{
QSharedPointer<Derived> d(new Derived);
QSharedPointer<const Base> cb = d;
QCOMPARE(cb, d);
QCOMPARE(cb.get(), d.get());
}
safetyCheck();
{
QSharedPointer<Derived> d(new Derived);
QWeakPointer<const Base> wcb = d;
QCOMPARE(wcb, d);
QCOMPARE(wcb.lock().get(), d.get());
}
safetyCheck();
{
QSharedPointer<Derived> d(new Derived);
QWeakPointer<Derived> wd = d;
QCOMPARE(wd, d);
QCOMPARE(wd.lock().get(), d.get());
QWeakPointer<const Base> wcb = wd;
QCOMPARE(wcb, wd);
QCOMPARE(wcb.lock().get(), d.get());
}
safetyCheck();
{
auto raw = new Derived;
QSharedPointer<Derived> d(raw);
QSharedPointer<const Base> cb = std::move(d);
QCOMPARE(d, nullptr);
QCOMPARE(cb.get(), raw);
}
safetyCheck();
{
QSharedPointer<Derived> d(new Derived);
QWeakPointer<const Base> wcb = std::move(d);
QCOMPARE(wcb, d);
QCOMPARE(wcb.lock().get(), d.get());
}
safetyCheck();
{
QSharedPointer<Derived> d(new Derived);
QWeakPointer<Derived> wd = std::move(d);
QCOMPARE(wd, d);
QCOMPARE(wd.lock().get(), d.get());
QWeakPointer<const Base> wcb = std::move(wd);
QCOMPARE(wd, nullptr);
QCOMPARE(wcb.lock().get(), d.get());
}
safetyCheck();
}
#ifndef QTEST_NO_RTTI
void tst_QSharedPointer::dynamicCast()
{