If setQObjectShared crashes because a QObject is tracked by two
different QSharedPointers, we lose the debug feature offered by #defining
QT_SHAREDPOINTER_TRACK_POINTERS, as the check done by this define
happens after the setQObjectShared call.
Therefore, move setQObjectShared after the internalSafetyCheckAdd call.
This is actually a noop change in 5.0, as setQObjectShared does nothing.
However it prevents a bug in case the Qt 4 behaviour is brought back
in some later version.
Change-Id: I71340d0f878828354537762d01c46d441efc918c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
// now initialize the data
new (result.data()) T();
- result.d->setQObjectShared(result.value, true);
# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
internalSafetyCheckAdd(result.d, result.value);
# endif
+ result.d->setQObjectShared(result.value, true);
return result;
}
# endif
d = Private::create(ptr, deleter, actualDeleter);
- d->setQObjectShared(ptr, true);
#ifdef QT_SHAREDPOINTER_TRACK_POINTERS
internalSafetyCheckAdd(d, ptr);
#endif
+ d->setQObjectShared(ptr, true);
}
template <class X>
"QSharedPointer<Data> ptr1 = QSharedPointer<Data>(aData);\n"
"QSharedPointer<Data> ptr2 = QSharedPointer<Data>(aData);\n";
+ // two QObjects with the same pointer
+ QTest::newRow("same-pointer-to-qobject")
+ << &QTest::QExternalTest::tryRunFail
+ << "QObject *anObj = new QObject;\n"
+ "QSharedPointer<QObject> ptr1 = QSharedPointer<QObject>(anObj);\n"
+ "QSharedPointer<QObject> ptr2 = QSharedPointer<QObject>(anObj);\n";
+
// re-creation:
QTest::newRow("re-creation")
<< &QTest::QExternalTest::tryRunFail