summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2022-07-15 19:01:00 -0700
committerThiago Macieira <thiago.macieira@intel.com>2022-09-01 21:29:04 -0300
commit0380dd50519e4e1eb5ba5e8f54e858e1d84a1d2f (patch)
tree3b167ececc698382fc3e673fbf5bcd2358cc09b6 /tests/auto/corelib
parentba8c4b4ac6df8c4318e3dd8c886aa0135628d33c (diff)
QMetaObject: pass the QMetaTypes in variadic invoke/newInstance
[ChangeLog][QtCore][Meta Object] QMetaMethod::invoke(), QMetaObject::invokeMethod(), and QMetaObject::newInstance() are no longer limited to 10 arguments. [ChangeLog][QtCore][Meta Object] The use of the Q_ARG macro is no longer necessary when using QMetaMethod::invoke(), QMetaObject::invokeMethod(), and QMetaObject::newInstance(). Types may now be passed directly. Similarly, Q_RETURN_ARG can be replaced by the free function qReturnArg(). [ChangeLog][Potentially Source-Incompatible Changes] QMetaMethod::invoke(), QMetaObject::invokeMethod(), and QMetaObject::newInstance() no longer support passing forward-declared types in the argument list (it was possible to pass them by const-ref). From Qt 6.5 onwards, all types in the argument list must be fully defined. [ChangeLog][Potentially Source-Incompatible Changes] Attempting to use the internal types QArgument, QReturnArgument, QGenericArgument, or QGenericReturnArgument directly with QMetaMethod::invoke(), QMetaObject::invokeMethod() or QMetaObject::newInstance() may fail to compile. Those are internal types that were never meant to be used directly and will be removed in Qt 7. If really necessary, ensure all arguments passed to those functions are directly using those classes and not mixed with Q_ARG and Q_RETURN_ARG. Implementations of bindings to other languages should contact the Qt development mailing list to discuss options. Change-Id: I36b24183fbd041179f2ffffd1701e3e8e47e0fba Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests/auto/corelib')
-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.cpp73
3 files changed, 21 insertions, 77 deletions
diff --git a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp
index d2477f86f0..8772bc4e61 100644
--- a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp
+++ b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp
@@ -2,7 +2,6 @@
// 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;
@@ -16,18 +15,3 @@ 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 83fdb0f819..89fb0839c1 100644
--- a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h
+++ b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h
@@ -4,18 +4,9 @@
#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 26945b727e..2efecc01cb 100644
--- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
+++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
@@ -31,14 +31,6 @@ Q_DECLARE_METATYPE(const QMetaObject *)
# define Q_NO_ARG
#endif
-#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;
@@ -519,7 +511,6 @@ public slots:
qint64 sl14();
qlonglong *sl15(qlonglong *);
MyForwardDeclaredType *sl16(MyForwardDeclaredType *);
- void sl17(const QEasingCurve &curve);
void overloadedSlot();
void overloadedSlot(int, int);
@@ -636,8 +627,6 @@ MyForwardDeclaredType *QtTestObject::sl16(MyForwardDeclaredType *ptr)
slotResult += "null";
return getForwardDeclaredPointer();
}
-void QtTestObject::sl17(const QEasingCurve &)
-{ slotResult = "sl17"; }
void QtTestObject::overloadedSlot()
{ slotResult = "overloadedSlot"; }
@@ -819,11 +808,8 @@ 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");
-
+#ifndef QT_NO_DATA_RELOCATION // this doesn't work with the new API on Windows
+#endif
// test overloads
QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot" Q_NO_ARG));
QCOMPARE(obj.slotResult, QString("overloadedSlot"));
@@ -990,11 +976,6 @@ void tst_QMetaObject::invokeMetaMemberNoMacros()
QCOMPARE(forwardPtr, getForwardDeclaredPointer());
QCOMPARE(obj.slotResult, QString("sl16:null"));
- // forward-declared builtin
- obj.slotResult.clear();
- QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", getEasingCurve()));
- QCOMPARE(obj.slotResult, "sl17");
-
// test overloads
QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot"));
QCOMPARE(obj.slotResult, QString("overloadedSlot"));
@@ -1131,12 +1112,14 @@ void tst_QMetaObject::invokeQueuedMetaMember()
qApp->processEvents(QEventLoop::AllEvents);
QCOMPARE(obj.slotResult, QString("sl15"));
- // forward-declared builtin
+ // since Qt 6.5, this works even for pointers to forward-declared types
obj.slotResult.clear();
- QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", Qt::QueuedConnection, Q_ARG(QEasingCurve, getEasingCurve())));
+ QVERIFY(QMetaObject::invokeMethod(&obj, "sl16", Qt::QueuedConnection, Q_ARG(MyForwardDeclaredType*, getForwardDeclaredPointer())));
qApp->processEvents(QEventLoop::AllEvents);
- QCOMPARE(obj.slotResult, "sl17");
+ QCOMPARE(obj.slotResult, QString("sl16:notnull"));
+#ifndef QT_NO_DATA_RELOCATION // this doesn't work with the new API on Windows
+#endif
// test overloads
QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot", Qt::QueuedConnection Q_NO_ARG));
qApp->processEvents(QEventLoop::AllEvents);
@@ -1184,6 +1167,7 @@ void tst_QMetaObject::invokeQueuedMetaMember()
QVERIFY(!QMetaObject::invokeMethod(&obj, "testReference", Qt::QueuedConnection, Q_ARG(QString&, refStr)));
QCOMPARE(refStr, "whatever");
+#ifdef USE_COMPAT_Q_ARG // this doesn't compile with the new API
obj.slotResult.clear();
{
const MyForwardDeclaredType &t = getForwardDeclaredType();
@@ -1201,12 +1185,7 @@ void tst_QMetaObject::invokeQueuedMetaMember()
Q_ARG(QString, a1), Q_ARG(MyForwardDeclaredType, t)));
QVERIFY(obj.slotResult.isEmpty());
}
-
- obj.slotResult.clear();
- QTest::ignoreMessage(QtWarningMsg, "QMetaMethod::invoke: Unable to handle unregistered datatype 'MyForwardDeclaredType*'");
- QVERIFY(!QMetaObject::invokeMethod(&obj, "sl16", Qt::QueuedConnection, Q_ARG(MyForwardDeclaredType*, getForwardDeclaredPointer())));
- qApp->processEvents(QEventLoop::AllEvents);
- QVERIFY(obj.slotResult.isEmpty());
+#endif
}
// this is a copy-paste-adapt of the above
@@ -1241,11 +1220,10 @@ void tst_QMetaObject::invokeQueuedMetaMemberNoMacro()
qApp->processEvents(QEventLoop::AllEvents);
QCOMPARE(obj.slotResult, QString("sl15"));
- // forward-declared builtin
obj.slotResult.clear();
- QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", Qt::QueuedConnection, getEasingCurve()));
+ QVERIFY(QMetaObject::invokeMethod(&obj, "sl16", Qt::QueuedConnection, getForwardDeclaredPointer()));
qApp->processEvents(QEventLoop::AllEvents);
- QCOMPARE(obj.slotResult, "sl17");
+ QCOMPARE(obj.slotResult, QString("sl16:notnull"));
// test overloads
QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot", Qt::QueuedConnection));
@@ -1297,6 +1275,7 @@ void tst_QMetaObject::invokeQueuedMetaMemberNoMacro()
// QVERIFY(!QMetaObject::invokeMethod(&obj, "testReference", Qt::QueuedConnection, Q_ARG(QString&, refStr)));
// QCOMPARE(refStr, "whatever");
+#if 0 // this won't even compile any more
obj.slotResult.clear();
{
const MyForwardDeclaredType &t = getForwardDeclaredType();
@@ -1314,12 +1293,7 @@ void tst_QMetaObject::invokeQueuedMetaMemberNoMacro()
a1, t));
QVERIFY(obj.slotResult.isEmpty());
}
-
- obj.slotResult.clear();
- QTest::ignoreMessage(QtWarningMsg, "QMetaMethod::invoke: Unable to handle unregistered datatype 'MyForwardDeclaredType*'");
- QVERIFY(!QMetaObject::invokeMethod(&obj, "sl16", Qt::QueuedConnection, getForwardDeclaredPointer()));
- qApp->processEvents(QEventLoop::AllEvents);
- QVERIFY(obj.slotResult.isEmpty());
+#endif
}
void tst_QMetaObject::invokeQueuedPointer()
@@ -1505,11 +1479,8 @@ 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");
-
+#ifndef QT_NO_DATA_RELOCATION // this doesn't work with the new API on Windows
+#endif
// test overloads
QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot", Qt::BlockingQueuedConnection Q_NO_ARG));
QCOMPARE(obj.slotResult, QString("overloadedSlot"));
@@ -1681,11 +1652,6 @@ void tst_QMetaObject::invokeBlockingQueuedMetaMemberNoMacros()
QCOMPARE(forwardPtr, getForwardDeclaredPointer());
QCOMPARE(obj.slotResult, QString("sl16:null"));
- // forward-declared builtin
- obj.slotResult.clear();
- QVERIFY(QMetaObject::invokeMethod(&obj, "sl17", Qt::BlockingQueuedConnection, getEasingCurve()));
- QCOMPARE(obj.slotResult, "sl17");
-
// test overloads
QVERIFY(QMetaObject::invokeMethod(&obj, "overloadedSlot", Qt::BlockingQueuedConnection));
QCOMPARE(obj.slotResult, QString("overloadedSlot"));
@@ -1968,6 +1934,12 @@ void tst_QMetaObject::invokeTypedefTypes()
QCOMPARE(spy.count(), 1);
QCOMPARE(spy.at(0).count(), 1);
QCOMPARE(spy.at(0).at(0), QVariant(arg));
+
+ spy.clear();
+ QVERIFY(QMetaObject::invokeMethod(&obj, "sig_custom", arg));
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(spy.at(0).count(), 1);
+ QCOMPARE(spy.at(0).at(0), QVariant(arg));
}
void tst_QMetaObject::invokeException()
@@ -2809,7 +2781,4 @@ 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"