diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 005d2b9f7a..a7b2e78124 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -752,13 +752,42 @@ Q_DECLARE_METATYPE_TEMPLATE_1ARG(QVector) Q_DECLARE_METATYPE_TEMPLATE_1ARG(QQueue) Q_DECLARE_METATYPE_TEMPLATE_1ARG(QStack) Q_DECLARE_METATYPE_TEMPLATE_1ARG(QSet) -Q_DECLARE_METATYPE_TEMPLATE_1ARG(QSharedPointer) Q_DECLARE_METATYPE_TEMPLATE_1ARG(QLinkedList) Q_DECLARE_METATYPE_TEMPLATE_2ARG(QHash) Q_DECLARE_METATYPE_TEMPLATE_2ARG(QMap) Q_DECLARE_METATYPE_TEMPLATE_2ARG(QPair) +template ::Value> +struct QMetaTypeIdSharedPointerQObjectStar +{ + enum { + Defined = 0 + }; +}; + +template +struct QMetaTypeIdSharedPointerQObjectStar +{ + enum { + Defined = 1 + }; + static int qt_metatype_id() + { + static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); + if (!metatype_id.load()) { + metatype_id.storeRelease(qRegisterNormalizedMetaType< QSharedPointer >( QByteArray("QSharedPointer<") + T::staticMetaObject.className() + ">", + reinterpret_cast< QSharedPointer *>(quintptr(-1)))); + } + return metatype_id.loadAcquire(); + } +}; + +template +struct QMetaTypeId< QSharedPointer > : public QMetaTypeIdSharedPointerQObjectStar +{ +}; + inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info, Creator creator, Deleter deleter, diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index da8c182f32..e1b58e6c4b 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -1171,8 +1171,6 @@ void tst_QMetaType::registerStreamBuiltin() qRegisterMetaTypeStreamOperators("QVariant"); } -Q_DECLARE_METATYPE(QSharedPointer) - typedef QHash IntUIntHash; Q_DECLARE_METATYPE(IntUIntHash) typedef QMap IntUIntMap; @@ -1228,6 +1226,18 @@ private: int m_int; }; +class MyObject : public QObject +{ + Q_OBJECT +public: + MyObject(QObject *parent = 0) + : QObject(parent) + { + } +}; +typedef MyObject* MyObjectPtr; +Q_DECLARE_METATYPE(MyObjectPtr) + void tst_QMetaType::automaticTemplateRegistration() { { @@ -1418,8 +1428,7 @@ void tst_QMetaType::automaticTemplateRegistration() F(QVector, TYPE) \ F(QQueue, TYPE) \ F(QStack, TYPE) \ - F(QSet, TYPE) \ - F(QSharedPointer, TYPE) + F(QSet, TYPE) #define PRINT_1ARG_TEMPLATE(RealName, ...) \ FOR_EACH_1ARG_TEMPLATE_TYPE(CREATE_AND_VERIFY_CONTAINER, RealName) @@ -1453,6 +1462,20 @@ void tst_QMetaType::automaticTemplateRegistration() #endif // Q_COMPILER_VARIADIC_MACROS +#define TEST_QSHAREDPOINTER(FULLTYPE) \ + { \ + FULLTYPE sp = FULLTYPE::create(); \ + QVariant v = QVariant::fromValue(sp); \ + QCOMPARE(v.typeName(), #FULLTYPE); \ + } + + TEST_QSHAREDPOINTER(QSharedPointer) + TEST_QSHAREDPOINTER(QSharedPointer) + TEST_QSHAREDPOINTER(QSharedPointer) + TEST_QSHAREDPOINTER(QSharedPointer) + +#undef TEST_QSHAREDPOINTER + } template