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() {