From 06c3de5ee3a110fc8c2526b7a13d2a6b75b36a8f Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 15 Jul 2022 12:40:39 -0700 Subject: [PATCH] tst_QMetaObject: change tests to forward-declared-only The type MyUnregisteredType needs to be only forward-declared for the trick to work. The issue is not about registration, because since commit fa987d44417528856d5e80ed7b48ba99e19fa307 ("MetaObject: Store the QMetaType of the methods"), we will record the meta type of the type anyway, which will eventually allow the meta object to actually find this type. Instead, the tests are valid for a type that is only forward-declared. Change-Id: I36b24183fbd041179f2ffffd1702182746f7c1b2 Reviewed-by: Fabian Kosmale --- .../corelib/kernel/qmetaobject/CMakeLists.txt | 14 +++++----- .../kernel/qmetaobject/forwarddeclared.cpp | 12 +++++++++ .../kernel/qmetaobject/forwarddeclared.h | 11 ++++++++ .../kernel/qmetaobject/tst_qmetaobject.cpp | 27 +++++++++---------- 4 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp create mode 100644 tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h diff --git a/tests/auto/corelib/kernel/qmetaobject/CMakeLists.txt b/tests/auto/corelib/kernel/qmetaobject/CMakeLists.txt index d0736f418d..6076f9c72c 100644 --- a/tests/auto/corelib/kernel/qmetaobject/CMakeLists.txt +++ b/tests/auto/corelib/kernel/qmetaobject/CMakeLists.txt @@ -1,15 +1,13 @@ -# Generated from qmetaobject.pro. - -##################################################################### -## tst_qmetaobject Test: -##################################################################### +set(tst_qmetaobject_SOURCES + tst_qmetaobject.cpp + forwarddeclared.h + forwarddeclared.cpp +) qt_internal_add_test(tst_qmetaobject SOURCES - tst_qmetaobject.cpp + ${tst_qmetaobject_SOURCES} PUBLIC_LIBRARIES Qt::CorePrivate ) -## Scopes: -##################################################################### diff --git a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp new file mode 100644 index 0000000000..1f81bb09f2 --- /dev/null +++ b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.cpp @@ -0,0 +1,12 @@ +// Copyright (C) 2022 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "forwarddeclared.h" + +struct MyForwardDeclaredType { }; +static const MyForwardDeclaredType t; + +const MyForwardDeclaredType &getForwardDeclaredType() noexcept +{ + return t; +} diff --git a/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h new file mode 100644 index 0000000000..79db65676f --- /dev/null +++ b/tests/auto/corelib/kernel/qmetaobject/forwarddeclared.h @@ -0,0 +1,11 @@ +// Copyright (C) 2022 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef FORWARDDECLARED_H +#define FORWARDDECLARED_H + +struct MyForwardDeclaredType; // and ONLY forward-declared + +const MyForwardDeclaredType &getForwardDeclaredType() noexcept; + +#endif // FORWARDDECLARED_H diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index 3b2066ba5d..23c75e4422 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -12,6 +12,8 @@ Q_DECLARE_METATYPE(const QMetaObject *) +#include "forwarddeclared.h" + struct MyStruct { int i; @@ -215,8 +217,7 @@ namespace MyNamespace { int m_value2 = 0; int m_value3 = 0; }; -} - +} // namespace MyNamespace class tst_QMetaObject : public QObject { @@ -435,8 +436,6 @@ void tst_QMetaObject::connectSlotsByName() QCOMPARE(obj2.invokeCount2, 1); } -struct MyUnregisteredType { }; - static int countedStructObjectsCount = 0; struct CountedStruct { @@ -488,8 +487,8 @@ public slots: void moveToThread(QThread *t) { QObject::moveToThread(t); } - void slotWithUnregisteredParameterType(MyUnregisteredType); - void slotWithOneUnregisteredParameterType(QString a1, MyUnregisteredType a2); + void slotWithUnregisteredParameterType(const MyForwardDeclaredType &); + void slotWithOneUnregisteredParameterType(QString a1, const MyForwardDeclaredType &a2); CountedStruct throwingSlot(const CountedStruct &, CountedStruct s2) { #ifndef QT_NO_EXCEPTIONS @@ -584,10 +583,10 @@ void QtTestObject::testSender() slotResult = QString::asprintf("%p", sender()); } -void QtTestObject::slotWithUnregisteredParameterType(MyUnregisteredType) +void QtTestObject::slotWithUnregisteredParameterType(const MyForwardDeclaredType &) { slotResult = "slotWithUnregisteredReturnType"; } -void QtTestObject::slotWithOneUnregisteredParameterType(QString a1, MyUnregisteredType) +void QtTestObject::slotWithOneUnregisteredParameterType(QString a1, const MyForwardDeclaredType &) { slotResult = "slotWithUnregisteredReturnType-" + a1; } void QtTestObject::staticFunction0() @@ -864,19 +863,19 @@ void tst_QMetaObject::invokeQueuedMetaMember() obj.slotResult.clear(); { - MyUnregisteredType t; - QTest::ignoreMessage(QtWarningMsg, "QMetaMethod::invoke: Unable to handle unregistered datatype 'MyUnregisteredType'"); - QVERIFY(!QMetaObject::invokeMethod(&obj, "slotWithUnregisteredParameterType", Qt::QueuedConnection, Q_ARG(MyUnregisteredType, t))); + const MyForwardDeclaredType &t = getForwardDeclaredType(); + QTest::ignoreMessage(QtWarningMsg, "QMetaMethod::invoke: Unable to handle unregistered datatype 'MyForwardDeclaredType'"); + QVERIFY(!QMetaObject::invokeMethod(&obj, "slotWithUnregisteredParameterType", Qt::QueuedConnection, Q_ARG(MyForwardDeclaredType, t))); QVERIFY(obj.slotResult.isEmpty()); } obj.slotResult.clear(); { QString a1("Cannot happen"); - MyUnregisteredType t; - QTest::ignoreMessage(QtWarningMsg, "QMetaMethod::invoke: Unable to handle unregistered datatype 'MyUnregisteredType'"); + const MyForwardDeclaredType &t = getForwardDeclaredType(); + QTest::ignoreMessage(QtWarningMsg, "QMetaMethod::invoke: Unable to handle unregistered datatype 'MyForwardDeclaredType'"); QVERIFY(!QMetaObject::invokeMethod(&obj, "slotWithOneUnregisteredParameterType", Qt::QueuedConnection, - Q_ARG(QString, a1), Q_ARG(MyUnregisteredType, t))); + Q_ARG(QString, a1), Q_ARG(MyForwardDeclaredType, t))); QVERIFY(obj.slotResult.isEmpty()); } }