From 03b25125986f083a260b421abeed1f1d088d27b3 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 5 Feb 2013 14:35:10 +0100 Subject: [PATCH] Fix QMetaType of const references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes QMetaType detection of const reference arguments in signals while connecting using the new syntax and Qt::QueuedConnection const references should have the same QMetaType as non references. That means we need to remove the const reference while getting the QMetaType. Change-Id: I9b2688da7fb9ae985aec0d8fa62a1165357ffe71 Reviewed-by: Thiago Macieira Reviewed-by: Stephen Kelly Reviewed-by: Jędrzej Nowacki --- src/corelib/kernel/qmetatype.h | 3 +++ .../kernel/qmetatype/tst_qmetatype.cpp | 12 +++++++++++ .../corelib/kernel/qobject/tst_qobject.cpp | 20 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index e4f10526732..16ea1042a29 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -532,6 +532,9 @@ struct QMetaTypeId2 static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId::qt_metatype_id(); } }; +template +struct QMetaTypeId2 : QMetaTypeId2 {}; + namespace QtPrivate { template ::Defined> struct QMetaTypeIdHelper { diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 7f7486ef4b8..9a75bad5494 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -110,6 +110,7 @@ private slots: void saveAndLoadCustom(); void metaObject(); void constexprMetaTypeIds(); + void constRefs(); }; struct Foo { int i; }; @@ -1762,6 +1763,17 @@ void tst_QMetaType::constexprMetaTypeIds() #endif } +void tst_QMetaType::constRefs() +{ + QCOMPARE(::qMetaTypeId(), ::qMetaTypeId()); + QCOMPARE(::qMetaTypeId(), ::qMetaTypeId()); + QCOMPARE(::qMetaTypeId(), ::qMetaTypeId()); + QCOMPARE(::qMetaTypeId &>(), ::qMetaTypeId >()); +#if defined(Q_COMPILER_CONSTEXPR) + Q_STATIC_ASSERT(::qMetaTypeId() == ::qMetaTypeId()); +#endif +} + // Compile-time test, it should be possible to register function pointer types class Undefined; diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index a6d1d9f14d5..c3ecf419e00 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Olivier Goffart ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. @@ -1446,9 +1447,11 @@ public: public slots: void slot1(CustomType ct); + void slot2(const QList &ct); signals: void signal1(CustomType ct); + void signal2(const QList &ct); public: CustomType received; @@ -1457,6 +1460,8 @@ public: void QCustomTypeChecker::slot1(CustomType ct) { received = ct; } +void QCustomTypeChecker::slot2(const QList< CustomType >& ct) +{ received = ct[0]; } void tst_QObject::customTypes() { @@ -4667,6 +4672,21 @@ void tst_QObject::customTypesPointer() QCOMPARE(qRegisterMetaType("CustomType"), idx); QCOMPARE(QMetaType::type("CustomType"), idx); QVERIFY(QMetaType::isRegistered(idx)); + + // Test auto registered type (QList) + QList list; + QCOMPARE(instanceCount, 4); + list.append(t1); + QCOMPARE(instanceCount, 5); + QVERIFY(connect(&checker, &QCustomTypeChecker::signal2, + &checker, &QCustomTypeChecker::slot2, Qt::QueuedConnection)); + emit checker.signal2(list); + QCOMPARE(instanceCount, 5); //because the list is implicitly shared. + list.clear(); + QCOMPARE(instanceCount, 5); + QCoreApplication::processEvents(); + QCOMPARE(checker.received.value(), t1.value()); + QCOMPARE(instanceCount, 4); } QCOMPARE(instanceCount, 3); }