summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qobjectdefs_impl.h4
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp14
2 files changed, 16 insertions, 2 deletions
diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h
index fb6601f21b..de6f65ab7d 100644
--- a/src/corelib/kernel/qobjectdefs_impl.h
+++ b/src/corelib/kernel/qobjectdefs_impl.h
@@ -567,9 +567,9 @@ namespace QtPrivate {
Q_STATIC_ASSERT(CheckCompatibleArguments<FunctionPointer<Signal>::Arguments, FunctionPointer<Slot>::Arguments>::value)
*/
template<typename A1, typename A2> struct AreArgumentsCompatible {
- static int test(A2);
+ static int test(const typename RemoveRef<A2>::Type&);
static char test(...);
- static A1 dummy();
+ static const typename RemoveRef<A1>::Type &dummy();
enum { value = sizeof(test(dummy())) == sizeof(int) };
};
template<typename A1, typename A2> struct AreArgumentsCompatible<A1, A2&> { enum { value = false }; };
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 8875998433..b6be7f0f3e 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -4759,6 +4759,9 @@ class LotsOfSignalsAndSlots: public QObject
#endif*/
static void static_slot_vPFvvE(fptr) {}
+ void slot_vcRQObject(const QObject &) {}
+ void slot_vRQObject(QObject &) {}
+
signals:
void signal_v();
void signal_vi(int);
@@ -4776,6 +4779,9 @@ class LotsOfSignalsAndSlots: public QObject
void const_signal_v() const;
void const_signal_vi(int) const;
+ void signal_vcRQObject(const QObject &);
+ void signal_vRQObject(QObject &);
+
void signal(short&, short, long long, short);
void otherSignal(const char *);
};
@@ -4893,6 +4899,14 @@ void tst_QObject::connectCxx0xTypeMatching()
QVERIFY(QObject::connect(&obj, &Foo::const_signal_vi, &obj, &Foo::slot_vi));
QVERIFY(QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::const_slot_vi));
QVERIFY(QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::const_slot_v));
+
+ QVERIFY(QObject::connect(&obj, &Foo::signal_vcRQObject, &obj, &Foo::slot_vcRQObject));
+ QVERIFY(QObject::connect(&obj, &Foo::signal_vRQObject, &obj, &Foo::slot_vRQObject));
+ QVERIFY(QObject::connect(&obj, &Foo::signal_vRQObject, &obj, &Foo::slot_vcRQObject));
+ // QVERIFY(QObject::connect(&obj, &Foo::signal_vcRQObject, &obj, &Foo::slot_vRQObject)); // Should be an error (const& -> &)
+
+ QVERIFY(QObject::connect(&obj, &Foo::signal_vRi, &obj, &Foo::slot_vs));
+
}
class StringVariant : public QObject