Allow function types to be registered without workarounds
Commit 4b8ceb41ae
added the requirement
that pointed-to types need to be registered when registering pointer
types. Unfortunately, the implementation also affects function pointer
types.
This change whitelists 0, 1, 2 and 3 argument functions as not deriving
from QObject, forgoing the need to workaround details of the type
registration implementation when registering those function pointer
types.
Change-Id: I4d855e9d70a8179a6e31b84623ad5bf063e0d6d8
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
parent
3855233dab
commit
2bf186a2e5
@ -208,12 +208,6 @@ typedef void (QTextStream::*QTSMFI)(int); // manipulator w/int argument
|
||||
typedef void (QTextStream::*QTSMFC)(QChar); // manipulator w/QChar argument
|
||||
|
||||
|
||||
namespace QtPrivate {
|
||||
template <> struct IsPointerToTypeDerivedFromQObject<QTextStreamFunction> {
|
||||
enum { Value = false };
|
||||
};
|
||||
}
|
||||
|
||||
class Q_CORE_EXPORT QTextStreamManipulator
|
||||
{
|
||||
public:
|
||||
|
@ -365,6 +365,12 @@ namespace QtPrivate {
|
||||
Q_STATIC_ASSERT_X(sizeof(T), "Type argument of Q_DECLARE_METATYPE(T*) must be fully defined");
|
||||
enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(yes_type) };
|
||||
};
|
||||
|
||||
// Function pointers don't derive from QObject
|
||||
template <class Result> struct IsPointerToTypeDerivedFromQObject<Result(*)()> { enum { Value = false }; };
|
||||
template <class Result, class Arg0> struct IsPointerToTypeDerivedFromQObject<Result(*)(Arg0)> { enum { Value = false }; };
|
||||
template <class Result, class Arg0, class Arg1> struct IsPointerToTypeDerivedFromQObject<Result(*)(Arg0, Arg1)> { enum { Value = false }; };
|
||||
template <class Result, class Arg0, class Arg1, class Arg2> struct IsPointerToTypeDerivedFromQObject<Result(*)(Arg0, Arg1, Arg2)> { enum { Value = false }; };
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -931,5 +931,18 @@ void tst_QMetaType::automaticTemplateRegistration()
|
||||
}
|
||||
}
|
||||
|
||||
// Compile-time test, it should be possible to register function pointer types
|
||||
class Undefined;
|
||||
|
||||
typedef Undefined (*UndefinedFunction0)();
|
||||
typedef Undefined (*UndefinedFunction1)(Undefined);
|
||||
typedef Undefined (*UndefinedFunction2)(Undefined, Undefined);
|
||||
typedef Undefined (*UndefinedFunction3)(Undefined, Undefined, Undefined);
|
||||
|
||||
Q_DECLARE_METATYPE(UndefinedFunction0);
|
||||
Q_DECLARE_METATYPE(UndefinedFunction1);
|
||||
Q_DECLARE_METATYPE(UndefinedFunction2);
|
||||
Q_DECLARE_METATYPE(UndefinedFunction3);
|
||||
|
||||
QTEST_MAIN(tst_QMetaType)
|
||||
#include "tst_qmetatype.moc"
|
||||
|
@ -99,11 +99,6 @@ struct AbstractTester
|
||||
Q_DECLARE_METATYPE(AbstractTester *)
|
||||
|
||||
typedef void (*TestFunction)(QObject*);
|
||||
QT_BEGIN_NAMESPACE namespace QtPrivate {
|
||||
template <> struct IsPointerToTypeDerivedFromQObject<TestFunction> {
|
||||
enum { Value = false };
|
||||
};
|
||||
} QT_END_NAMESPACE
|
||||
Q_DECLARE_METATYPE(TestFunction)
|
||||
|
||||
template <typename T>
|
||||
|
@ -1298,11 +1298,6 @@ static int ucstrncmp_ssse3_aligning2(const ushort *a, const ushort *b, int len)
|
||||
#endif
|
||||
|
||||
typedef int (* UcstrncmpFunction)(const ushort *, const ushort *, int);
|
||||
QT_BEGIN_NAMESPACE namespace QtPrivate {
|
||||
template <> struct IsPointerToTypeDerivedFromQObject<UcstrncmpFunction> {
|
||||
enum { Value = false };
|
||||
};
|
||||
} QT_END_NAMESPACE
|
||||
Q_DECLARE_METATYPE(UcstrncmpFunction)
|
||||
|
||||
void tst_QString::ucstrncmp_data() const
|
||||
@ -1462,11 +1457,6 @@ void tst_QString::fromLatin1() const
|
||||
}
|
||||
|
||||
typedef void (* FromLatin1Function)(ushort *, const char *, int);
|
||||
QT_BEGIN_NAMESPACE namespace QtPrivate {
|
||||
template <> struct IsPointerToTypeDerivedFromQObject<FromLatin1Function> {
|
||||
enum { Value = false };
|
||||
};
|
||||
} QT_END_NAMESPACE
|
||||
Q_DECLARE_METATYPE(FromLatin1Function)
|
||||
|
||||
void fromLatin1_regular(ushort *dst, const char *str, int size)
|
||||
@ -1917,11 +1907,6 @@ void tst_QString::fromLatin1Alternatives() const
|
||||
}
|
||||
|
||||
typedef int (* FromUtf8Function)(ushort *, const char *, int);
|
||||
QT_BEGIN_NAMESPACE namespace QtPrivate {
|
||||
template <> struct IsPointerToTypeDerivedFromQObject<FromUtf8Function> {
|
||||
enum { Value = false };
|
||||
};
|
||||
} QT_END_NAMESPACE
|
||||
Q_DECLARE_METATYPE(FromUtf8Function)
|
||||
|
||||
extern QTextCodec::ConverterState *state;
|
||||
|
Loading…
Reference in New Issue
Block a user