diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index a42333fbf8..79514c8116 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -536,17 +536,17 @@ template struct QMetaTypeId2 { enum { Defined = QMetaTypeId::Defined }; - static inline int qt_metatype_id() { return QMetaTypeId::qt_metatype_id(); } + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId::qt_metatype_id(); } }; namespace QtPrivate { template ::Defined> struct QMetaTypeIdHelper { - static inline int qt_metatype_id() + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId2::qt_metatype_id(); } }; template struct QMetaTypeIdHelper { - static inline int qt_metatype_id() + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return -1; } }; @@ -624,7 +624,7 @@ void qRegisterMetaTypeStreamOperators(const char *typeName #endif // QT_NO_DATASTREAM template -inline int qMetaTypeId( +inline Q_DECL_CONSTEXPR int qMetaTypeId( #ifndef qdoc T * /* dummy */ = 0 #endif @@ -713,7 +713,7 @@ inline int qRegisterMetaTypeStreamOperators() template<> struct QMetaTypeId2 \ { \ enum { Defined = 1, MetaType = QMetaType::NAME }; \ - static inline int qt_metatype_id() { return QMetaType::NAME; } \ + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaType::NAME; } \ }; \ QT_END_NAMESPACE diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index b61625714b..c73c26a9ef 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -107,6 +107,7 @@ private slots: void saveAndLoadBuiltin(); void saveAndLoadCustom(); void metaObject(); + void constexprMetaTypeIds(); }; struct Foo { int i; }; @@ -1632,6 +1633,46 @@ void tst_QMetaType::metaObject() QCOMPARE(QMetaType(QMetaType::Int).metaObject(), static_cast(0)); } +#define METATYPE_ID_FUNCTION(Type, MetaTypeId, Name) \ + case ::qMetaTypeId< Name >(): metaType = MetaTypeIdStruct::Value; + +template +struct MetaTypeIdStruct +{ +}; + +#define METATYPE_ID_STRUCT(Type, MetaTypeId, Name) \ +template<> \ +struct MetaTypeIdStruct< ::qMetaTypeId< Name >()> \ +{ \ + enum { Value = ::qMetaTypeId< Name >() }; \ +}; + +#if defined(Q_COMPILER_CONSTEXPR) +QT_FOR_EACH_STATIC_TYPE(METATYPE_ID_STRUCT) + +template()> +struct MetaTypeIdStructDefaultTemplateValue +{ + enum { Value }; +}; +#endif + +void tst_QMetaType::constexprMetaTypeIds() +{ + int id = 0; + int metaType; + + switch(id) { +#if defined(Q_COMPILER_CONSTEXPR) + QT_FOR_EACH_STATIC_TYPE(METATYPE_ID_FUNCTION) + metaType = MetaTypeIdStructDefaultTemplateValue<>::Value; +#endif + default:; + } + Q_UNUSED(metaType); +} + // Compile-time test, it should be possible to register function pointer types class Undefined;