diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-07-15 19:01:00 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2022-09-01 21:29:04 -0300 |
commit | 0380dd50519e4e1eb5ba5e8f54e858e1d84a1d2f (patch) | |
tree | 3b167ececc698382fc3e673fbf5bcd2358cc09b6 /tests/auto/corelib | |
parent | ba8c4b4ac6df8c4318e3dd8c886aa0135628d33c (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')
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" |