From 44a94e03dd99f4d74845e72895583acd567cd76f Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 3 May 2023 14:55:10 +0200 Subject: [PATCH] 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 (cherry picked from commit 0e40a3f6645a684458cbb09bef1353df2eec5e0b) Reviewed-by: Qt Cherry-pick Bot --- .../qsharedpointer/tst_qsharedpointer.cpp | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp index f42637a3fe1..772b3f827fc 100644 --- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp +++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp @@ -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 d(new Derived); + QSharedPointer cb = d; + QCOMPARE(cb, d); + QCOMPARE(cb.get(), d.get()); + } + safetyCheck(); + + { + QSharedPointer d(new Derived); + QWeakPointer wcb = d; + QCOMPARE(wcb, d); + QCOMPARE(wcb.lock().get(), d.get()); + } + safetyCheck(); + + { + QSharedPointer d(new Derived); + QWeakPointer wd = d; + QCOMPARE(wd, d); + QCOMPARE(wd.lock().get(), d.get()); + QWeakPointer wcb = wd; + QCOMPARE(wcb, wd); + QCOMPARE(wcb.lock().get(), d.get()); + } + safetyCheck(); + + { + auto raw = new Derived; + QSharedPointer d(raw); + QSharedPointer cb = std::move(d); + QCOMPARE(d, nullptr); + QCOMPARE(cb.get(), raw); + } + safetyCheck(); + + { + QSharedPointer d(new Derived); + QWeakPointer wcb = std::move(d); + QCOMPARE(wcb, d); + QCOMPARE(wcb.lock().get(), d.get()); + } + safetyCheck(); + + { + QSharedPointer d(new Derived); + QWeakPointer wd = std::move(d); + QCOMPARE(wd, d); + QCOMPARE(wd.lock().get(), d.get()); + QWeakPointer wcb = std::move(wd); + QCOMPARE(wd, nullptr); + QCOMPARE(wcb.lock().get(), d.get()); + } + safetyCheck(); +} + #ifndef QTEST_NO_RTTI void tst_QSharedPointer::dynamicCast() {