diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-03-31 08:48:56 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-06-02 22:42:15 +0200 |
commit | 47c6466d0acc6d8d733b4fdbaf980a60bbfc93ef (patch) | |
tree | 31aad5a433def4b15fbfca44d5be1e0f94f3fcfd | |
parent | 649d834443326bfef6ad296cd53819121b8d1a17 (diff) |
QMetaType: create metatype for void
Create a QMetaTypeInterface for void. This allows us differentiate
QMetaType::Unknown from QMetaType::Void. In addition, this will enable
the usage of QMetaMethod::metaReturnType in QMetaMethod::returnType,
and will facilitate using metaReturnType in declarative, which needs to
distinguish between Unknown and Void.
Change-Id: I83296b49587f3deb7ec73e25a33f0d8c98cf8da0
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 30 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype_p.h | 4 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp | 13 |
3 files changed, 34 insertions, 13 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 60192e4131..3c7781c850 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -2758,7 +2758,6 @@ QMetaTypeInterface QMetaTypeForType<T>::metaType = { } }) }; -#undef QT_METATYPE_CONSTEXPRLAMDA template<typename T> constexpr const decltype(typenameHelper<T>()) QMetaTypeForType<T>::name = typenameHelper<T>(); @@ -2766,7 +2765,28 @@ constexpr const decltype(typenameHelper<T>()) QMetaTypeForType<T>::name = typena template<> class QMetaTypeForType<void> { + static const decltype(typenameHelper<void>()) name; + +public: + static inline QMetaTypeInterface metaType = + { + /*.revision=*/ 0, + /*.size=*/ 0, + /*.alignment=*/ 0, + /*.flags=*/ 0, + /*.metaObject=*/ nullptr, + /*.name=*/ "void", + /*.typeId=*/ BuiltinMetaType<void>::value, + /*.ref=*/ Q_REFCOUNT_INITIALIZE_STATIC, + /*.deleteSelf=*/ nullptr, + /*.defaultCtr=*/ nullptr, + /*.copyCtr=*/ nullptr, + /*.moveCtr=*/ nullptr, + /*.dtor=*/ nullptr, + /*.legacyRegisterOp=*/ nullptr + }; }; +#undef QT_METATYPE_CONSTEXPRLAMDA #ifndef QT_BOOTSTRAPPED #define QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER(TypeName, Id, Name) \ @@ -2789,11 +2809,7 @@ template<typename T> constexpr QMetaTypeInterface *qMetaTypeInterfaceForType() { using Ty = std::remove_cv_t<std::remove_reference_t<T>>; - if constexpr (std::is_same_v<Ty, void>) { - return nullptr; - } else { - return &QMetaTypeForType<Ty>::metaType; - } + return &QMetaTypeForType<Ty>::metaType; } namespace detail { @@ -2818,8 +2834,6 @@ constexpr QMetaTypeInterface *qTryMetaTypeInterfaceForType() using Tz = std::remove_pointer_t<Ty>; if constexpr (!is_complete<Tz, Unique>::value) { return nullptr; - } else if constexpr (std::is_same_v<Ty, void>) { - return nullptr; } else { return &QMetaTypeForType<Ty>::metaType; } diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h index 8e08d84ffd..2f4d69488f 100644 --- a/src/corelib/kernel/qmetatype_p.h +++ b/src/corelib/kernel/qmetatype_p.h @@ -192,9 +192,7 @@ template<> struct TypeDefinition<QIcon> { static const bool IsAvailable = false; template<typename T> static QT_PREPEND_NAMESPACE(QtPrivate::QMetaTypeInterface) *getInterfaceFromType() { - if constexpr (std::is_same_v<T, void>) { - return nullptr; - } else if constexpr (QtMetaTypePrivate::TypeDefinition<T>::IsAvailable) { + if constexpr (QtMetaTypePrivate::TypeDefinition<T>::IsAvailable) { return &QT_PREPEND_NAMESPACE(QtPrivate::QMetaTypeForType)<T>::metaType; } return nullptr; diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index f144aad7e4..d036be55c6 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -127,6 +127,7 @@ private slots: void operatorEq_data(); void operatorEq(); void typesWithInaccessibleDTors(); + void voidIsNotUnknown(); }; struct BaseGenericType @@ -1339,7 +1340,7 @@ void tst_QMetaType::isRegistered_data() QTest::addColumn<bool>("registered"); // predefined/custom types - QTest::newRow("QMetaType::Void") << int(QMetaType::Void) << false; + QTest::newRow("QMetaType::Void") << int(QMetaType::Void) << true; QTest::newRow("QMetaType::Int") << int(QMetaType::Int) << true; int dummyTypeId = qRegisterMetaType<IsRegisteredDummyType>("IsRegisteredDummyType"); @@ -2548,7 +2549,7 @@ void tst_QMetaType::operatorEq_data() QTest::newRow("String") << QMetaType(QMetaType::QString) << QMetaType::fromType<const QString &>() << true; QTest::newRow("void1") << QMetaType(QMetaType::UnknownType) << QMetaType::fromType<void>() - << true; + << false; QTest::newRow("void2") << QMetaType::fromType<const void>() << QMetaType::fromType<void>() << true; QTest::newRow("vec1") << QMetaType::fromType<QVector<const int *>>() @@ -2590,6 +2591,14 @@ void tst_QMetaType::typesWithInaccessibleDTors() Q_UNUSED(QMetaType::fromType<WithDeletedDtor>()); } +void tst_QMetaType::voidIsNotUnknown() +{ + QMetaType voidType = QMetaType::fromType<void>(); + QMetaType voidType2 = QMetaType(QMetaType::Void); + QCOMPARE(voidType, voidType2); + QVERIFY(voidType != QMetaType(QMetaType::UnknownType)); +} + // Compile-time test, it should be possible to register function pointer types class Undefined; |