diff -r 5dc02b23752f -r 3e2da88830cd tests/auto/qsharedpointer/tst_qsharedpointer.cpp --- a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp Tue Jul 06 15:10:48 2010 +0300 +++ b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp Wed Aug 18 10:37:55 2010 +0300 @@ -95,6 +95,8 @@ void creating(); void creatingQObject(); void mixTrackingPointerCode(); + void reentrancyWhileDestructing(); + void threadStressTest_data(); void threadStressTest(); void map(); @@ -1870,6 +1872,60 @@ } } +namespace QTBUG11730 { + struct IB + { + virtual ~IB() {} + }; + + struct IA + { + virtual QSharedPointer getB() = 0; + }; + + struct B: public IB + { + IA *m_a; + B(IA *a_a) :m_a(a_a) + { } + ~B() + { + QSharedPointer b = m_a->getB(); + } + }; + + struct A: public IA + { + QSharedPointer b; + + virtual QSharedPointer getB() + { + return b; + } + + A() + { + b = QSharedPointer(new B(this)); + } + + ~A() + { + b.clear(); + } + }; +} + +void tst_QSharedPointer::reentrancyWhileDestructing() +{ + // this bug is about recursing back into QSharedPointer::clear() + // from inside it + // that is, the destructor of the object being deleted recurses + // into the same QSharedPointer object. + // First reported as QTBUG-11730 + QTBUG11730::A obj; +} + + QTEST_MAIN(tst_QSharedPointer) #include "tst_qsharedpointer.moc"