summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2022-08-22 10:33:05 -0300
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2022-08-26 19:50:48 +0200
commit7deb49d886a317ed993d82485cdb2723d367dce6 (patch)
tree6bb393330f134034a46e1bc55ec3097fc92b9268 /tests/auto/corelib/kernel
parente1cf523354bffcdf3dd013bf49e61d0b325baf39 (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')
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp16
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h9
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp30
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"