diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-08-22 10:33:05 -0300 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2022-08-26 19:50:48 +0200 |
commit | 7deb49d886a317ed993d82485cdb2723d367dce6 (patch) | |
tree | 6bb393330f134034a46e1bc55ec3097fc92b9268 /tests/auto/corelib/kernel | |
parent | e1cf523354bffcdf3dd013bf49e61d0b325baf39 (diff) |
QMetaObject: fix the consistency check for forward-declared builtins
For those, moc does know their type ID, and yet they may be still
forward-declared in the C++ side, so the meta object may have recorded a
null pointer in the metatype array.
Fixes: QTBUG-105832
Change-Id: Ic6547f8247454b47baa8fffd170dae07c0813dc7
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'tests/auto/corelib/kernel')
3 files changed, 55 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp index 8772bc4e61..d2477f86f0 100644 --- a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "forwarddeclared.h" +#include "qeasingcurve.h" struct MyForwardDeclaredType { }; static MyForwardDeclaredType t; @@ -15,3 +16,18 @@ MyForwardDeclaredType *getForwardDeclaredPointer() noexcept { return &t; } + +QT_BEGIN_NAMESPACE + +const QEasingCurve &getEasingCurve() noexcept +{ + return *getEasingCurvePointer(); +} + +QEasingCurve *getEasingCurvePointer() noexcept +{ + static QEasingCurve curve; + return &curve; +} + +QT_END_NAMESPACE diff --git a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h index 89fb0839c1..83fdb0f819 100644 --- a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h +++ b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h @@ -4,9 +4,18 @@ #ifndef FORWARDDECLARED_H #define FORWARDDECLARED_H +#include <qglobal.h> + struct MyForwardDeclaredType; // and ONLY forward-declared const MyForwardDeclaredType &getForwardDeclaredType() noexcept; MyForwardDeclaredType *getForwardDeclaredPointer() noexcept; +QT_BEGIN_NAMESPACE +class QEasingCurve; + +const QEasingCurve &getEasingCurve() noexcept; +QEasingCurve *getEasingCurvePointer() noexcept; +QT_END_NAMESPACE + #endif // FORWARDDECLARED_H diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index 01f9617be1..005b58fcb8 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -14,6 +14,14 @@ Q_DECLARE_METATYPE(const QMetaObject *) #include "forwarddeclared.h" +#ifdef QEASINGCURVE_H +# error "Please make sure qeasingcurve.h is not #include'd here! " \ + "We need QEasingCurve to be only forward-declared." +#endif +QT_BEGIN_NAMESPACE +class QEasingCurve; +QT_END_NAMESPACE + struct MyStruct { int i; @@ -489,6 +497,7 @@ public slots: qint64 sl14(); qlonglong *sl15(qlonglong *); MyForwardDeclaredType *sl16(MyForwardDeclaredType *); + void sl17(const QEasingCurve &curve); void overloadedSlot(); void overloadedSlot(int, int); @@ -605,6 +614,8 @@ MyForwardDeclaredType *QtTestObject::sl16(MyForwardDeclaredType *ptr) slotResult += "null"; return getForwardDeclaredPointer(); } +void QtTestObject::sl17(const QEasingCurve &) +{ slotResult = "sl17"; } void QtTestObject::overloadedSlot() { slotResult = "overloadedSlot"; } @@ -783,6 +794,11 @@ void tst_QMetaObject::invokeMetaMember() QCOMPARE(forwardPtr, getForwardDeclaredPointer()); QCOMPARE(obj.slotResult, QString("sl16:null")); + // forward-declared builtin + obj.slotResult.clear(); + QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", Q_ARG(QEasingCurve, getEasingCurve()))); + QCOMPARE(obj.slotResult, "sl17"); + // test overloads QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot")); QCOMPARE(obj.slotResult, QString("overloadedSlot")); @@ -919,6 +935,12 @@ void tst_QMetaObject::invokeQueuedMetaMember() qApp->processEvents(QEventLoop::AllEvents); QCOMPARE(obj.slotResult, QString("sl15")); + // forward-declared builtin + obj.slotResult.clear(); + QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", Qt::QueuedConnection, Q_ARG(QEasingCurve, getEasingCurve()))); + qApp->processEvents(QEventLoop::AllEvents); + QCOMPARE(obj.slotResult, "sl17"); + // test overloads QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot", Qt::QueuedConnection)); qApp->processEvents(QEventLoop::AllEvents); @@ -1172,6 +1194,11 @@ void tst_QMetaObject::invokeBlockingQueuedMetaMember() QCOMPARE(forwardPtr, getForwardDeclaredPointer()); QCOMPARE(obj.slotResult, QString("sl16:null")); + // forward-declared builtin + obj.slotResult.clear(); + QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", Qt::BlockingQueuedConnection, Q_ARG(QEasingCurve, getEasingCurve()))); + QCOMPARE(obj.slotResult, "sl17"); + // test overloads QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot", Qt::BlockingQueuedConnection)); QCOMPARE(obj.slotResult, QString("overloadedSlot")); @@ -2183,4 +2210,7 @@ void tst_QMetaObject::notifySignalsInParentClass() } QTEST_MAIN(tst_QMetaObject) + +static_assert(!QtPrivate::is_complete<QEasingCurve, void>::value, + "QEasingCurve must only be forward-declared at this point"); #include "tst_qmetaobject.moc" |