diff options
author | Jędrzej Nowacki <jedrzej.nowacki@digia.com> | 2014-03-06 14:54:19 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-23 21:40:36 +0200 |
commit | 33fae8b147eccec9b97629fe84a0b0753d446cf3 (patch) | |
tree | 4fa781f4f3510d41f8eea6a23cad13efa723b042 | |
parent | 969da85c2b6523432af1728cbb5ee311652decb0 (diff) |
Build fix for auto-registration of Container<void*>
IteratorOwner pointer specialization was failing for void* because of
an invalid function overload.
Change-Id: I80355ddd2b871c1fa2fa5bf5a4ed8bc7768fc3c9
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 11 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp | 8 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index ad853d5b03..3c9cc9ee28 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -821,7 +821,14 @@ struct IteratorOwner template<typename value_type> struct IteratorOwner<const value_type*> { - static void assign(void **ptr, const value_type *iterator ) +private: + // We need to disable typed overloads of assign() and getData() if the value_type + // is void* to avoid overloads conflicts. We do it by injecting unaccessible Dummy + // type as part of the overload signature. + struct Dummy {}; + typedef typename QtPrivate::if_<QtPrivate::is_same<value_type, void*>::value, Dummy, value_type>::type value_type_OR_Dummy; +public: + static void assign(void **ptr, const value_type_OR_Dummy *iterator ) { *ptr = const_cast<value_type*>(iterator); } @@ -846,7 +853,7 @@ struct IteratorOwner<const value_type*> return *iterator; } - static const void *getData(const value_type *it) + static const void *getData(const value_type_OR_Dummy *it) { return it; } diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 959c79ed60..b65bddbf65 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -1341,6 +1341,8 @@ static QByteArray createTypeName(const char *begin, const char *va) } #endif +Q_DECLARE_METATYPE(const void*) + void tst_QMetaType::automaticTemplateRegistration() { #define TEST_SEQUENTIAL_CONTAINER(CONTAINER, VALUE_TYPE) \ @@ -1577,6 +1579,12 @@ void tst_QMetaType::automaticTemplateRegistration() ) CREATE_AND_VERIFY_CONTAINER(QList, QList<QMap<int, QHash<char, QVariantList> > >) + CREATE_AND_VERIFY_CONTAINER(QVector, void*) + CREATE_AND_VERIFY_CONTAINER(QVector, const void*) + CREATE_AND_VERIFY_CONTAINER(QList, void*) + CREATE_AND_VERIFY_CONTAINER(QPair, void*, void*) + CREATE_AND_VERIFY_CONTAINER(QHash, void*, void*) + CREATE_AND_VERIFY_CONTAINER(QHash, const void*, const void*) #endif // Q_COMPILER_VARIADIC_MACROS |