Fix moc generating invalid code for slots with reference types as argument.

We can't have T& declared/registered as a metatype (wont compile), but
using it as type for a slot argument is possible. With the recent
introduction of metatype auto-registration we have to make sure that moc
doesn't attempt to auto-register those. Simple types are handled correctly
already, this fixes containers and smart pointers.

Change-Id: Id96857c57d6ebf158a67e9d527c89dc195473b1b
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
bb10
Volker Krause 2012-09-02 16:30:47 +02:00 committed by Qt by Nokia
parent 9d4814e18b
commit 8c1cb66712
2 changed files with 8 additions and 2 deletions

View File

@ -162,7 +162,7 @@ bool Generator::registerableMetaType(const QByteArray &propertyType)
;
foreach (const QByteArray &smartPointer, smartPointers)
if (propertyType.startsWith(smartPointer + "<"))
if (propertyType.startsWith(smartPointer + "<") && !propertyType.endsWith("&"))
return knownQObjectClasses.contains(propertyType.mid(smartPointer.size() + 1, propertyType.size() - smartPointer.size() - 1 - 1));
static const QVector<QByteArray> oneArgTemplates = QVector<QByteArray>()
@ -171,7 +171,7 @@ bool Generator::registerableMetaType(const QByteArray &propertyType)
#undef STREAM_1ARG_TEMPLATE
;
foreach (const QByteArray &oneArgTemplateType, oneArgTemplates)
if (propertyType.startsWith(oneArgTemplateType + "<")) {
if (propertyType.startsWith(oneArgTemplateType + "<") && !propertyType.endsWith("&")) {
const int argumentSize = propertyType.size() - oneArgTemplateType.size() - 1
// The closing '>'
- 1

View File

@ -2510,6 +2510,12 @@ public slots:
void bu4(CustomObject7, int, CustomObject8) {}
void bu5(int, CustomObject9, CustomObject10) {}
void bu6(int, CustomObject11, int) {}
// these can't be registered, but they should at least compile
void ref1(int&) {}
void ref2(QList<int>&) {}
void ref3(CustomQObject2&) {}
void ref4(QSharedPointer<CustomQObject2>&) {}
};
void tst_Moc::autoPropertyMetaTypeRegistration()