From b8d71ed60ba57142237555edb97d4cc7d3675b5c Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Wed, 21 Mar 2012 14:06:43 +0100 Subject: Fix QMetaObject::normalizedType() for "void" argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the introduction of QMetaType::UnknownType, void is a proper meta-type, and the normalized form of "void" should be "void", not an empty string. Add more tests to ensure that we do remove "void" in the one case where it actually should be removed (e.g. "foo(void)"). Change-Id: I72dc2d24da67cf52da00c678f50213cff1b92e25 Reviewed-by: Jędrzej Nowacki Reviewed-by: Olivier Goffart Reviewed-by: João Abecasis --- src/corelib/kernel/qmetaobject.cpp | 4 +++- tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp | 10 ++++++++++ tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp | 14 ++++++++++++++ tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 185314520b..6b3d13569b 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1326,7 +1326,9 @@ static char *qNormalizeType(char *d, int &templdepth, QByteArray &result) --templdepth; ++d; } - if (strncmp("void", t, d - t) != 0) + // "void" should only be removed if this is part of a signature that has + // an explicit void argument; e.g., "void foo(void)" --> "void foo()" + if (strncmp("void)", t, d - t + 1) != 0) result += normalizeTypeInternal(t, d); return d; diff --git a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp index f44a671180..0285dd0216 100644 --- a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp +++ b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp @@ -114,6 +114,7 @@ public slots: void voidSlotNoParameterNames(bool, int); signals: void voidSignal(); + void voidSignalVoid(void); void voidSignalInt(int voidSignalIntArg); void voidSignalQReal(qreal voidSignalQRealArg); void voidSignalQString(const QString &voidSignalQStringArg); @@ -230,6 +231,15 @@ void tst_QMetaMethod::method_data() << QMetaMethod::Public << QMetaMethod::Constructor; + QTest::newRow("voidSignalVoid") + << QByteArray("voidSignalVoid()") + << int(QMetaType::Void) << QByteArray("") + << QList() + << QList() + << QList() + << QMetaMethod::Protected + << QMetaMethod::Signal; + QTest::newRow("voidSignalInt") << QByteArray("voidSignalInt(int)") << int(QMetaType::Void) << QByteArray("") diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index b6b68338cd..5cf28b5141 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -816,9 +816,22 @@ void tst_QMetaObject::normalizedSignature_data() QTest::newRow("function") << "void foo()" << "void foo()"; QTest::newRow("spaces") << " void foo( ) " << "void foo()"; + QTest::newRow("void") << "void foo(void)" << "void foo()"; + QTest::newRow("void spaces") << "void foo( void )" << "void foo()"; + QTest::newRow("void*") << "void foo(void*)" << "void foo(void*)"; + QTest::newRow("void* spaces") << "void foo( void * )" << "void foo(void*)"; + QTest::newRow("function ptr") << "void foo(void(*)(void))" << "void foo(void(*)())"; + QTest::newRow("function ptr spaces") << "void foo( void ( * ) ( void ))" << "void foo(void(*)())"; + QTest::newRow("function ptr void*") << "void foo(void(*)(void*))" << "void foo(void(*)(void*))"; + QTest::newRow("function ptr void* spaces") << "void foo( void ( * ) ( void * ))" << "void foo(void(*)(void*))"; QTest::newRow("template args") << " void foo( QMap, QList) " << "void foo(QMap,QList)"; + QTest::newRow("void template args") << " void foo( Foo, Bar ) " + << "void foo(Foo,Bar)"; + QTest::newRow("void* template args") << " void foo( Foo, Bar ) " + << "void foo(Foo,Bar)"; QTest::newRow("rettype") << "QList foo()" << "QListfoo()"; + QTest::newRow("rettype void template") << "Foo foo()" << "Foofoo()"; QTest::newRow("const rettype") << "const QString *foo()" << "const QString*foo()"; QTest::newRow("const ref") << "const QString &foo()" << "const QString&foo()"; QTest::newRow("reference") << "QString &foo()" << "QString&foo()"; @@ -877,6 +890,7 @@ void tst_QMetaObject::normalizedType_data() QTest::newRow("struct") << "const struct foo*" << "const foo*"; QTest::newRow("struct2") << "struct foo const*" << "const foo*"; QTest::newRow("enum") << "enum foo" << "foo"; + QTest::newRow("void") << "void" << "void"; } void tst_QMetaObject::normalizedType() diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index c2ded70d80..fa6cf92460 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -165,6 +165,7 @@ signals: void signal3(); void signal4(); QT_MOC_COMPAT void signal5(); + void signal6(void); public slots: void aPublicSlot() { aPublicSlotCalled++; } @@ -824,6 +825,8 @@ void tst_QObject::connectDisconnectNotify_data() QTest::newRow("combo2") << SIGNAL( signal2(void) ) << SLOT( slot2( ) ); QTest::newRow("combo3") << SIGNAL( signal3( ) ) << SLOT( slot3(void) ); QTest::newRow("combo4") << SIGNAL( signal4( void ) )<< SLOT( slot4( void ) ); + QTest::newRow("combo5") << SIGNAL( signal6( void ) ) << SLOT( slot4() ); + QTest::newRow("combo6") << SIGNAL( signal6() ) << SLOT( slot4() ); } void tst_QObject::connectDisconnectNotify() -- cgit v1.2.3