Fix QMetaObject::normalizedType() for "void" argument

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 <jedrzej.nowacki@nokia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
This commit is contained in:
Kent Hansen 2012-03-21 14:06:43 +01:00 committed by Qt by Nokia
parent e2502e1a06
commit b8d71ed60b
4 changed files with 30 additions and 1 deletions

View File

@ -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;

View File

@ -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<int>()
<< QList<QByteArray>()
<< QList<QByteArray>()
<< QMetaMethod::Protected
<< QMetaMethod::Signal;
QTest::newRow("voidSignalInt")
<< QByteArray("voidSignalInt(int)")
<< int(QMetaType::Void) << QByteArray("")

View File

@ -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<a, a>, QList<b>) "
<< "void foo(QMap<a,a>,QList<b>)";
QTest::newRow("void template args") << " void foo( Foo<void>, Bar<void> ) "
<< "void foo(Foo<void>,Bar<void>)";
QTest::newRow("void* template args") << " void foo( Foo<void*>, Bar<void *> ) "
<< "void foo(Foo<void*>,Bar<void*>)";
QTest::newRow("rettype") << "QList<int, int> foo()" << "QList<int,int>foo()";
QTest::newRow("rettype void template") << "Foo<void> foo()" << "Foo<void>foo()";
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()

View File

@ -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()