diff options
-rw-r--r-- | src/tools/moc/generator.cpp | 15 | ||||
-rw-r--r-- | tests/auto/tools/moc/tst_moc.cpp | 38 |
2 files changed, 53 insertions, 0 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index bf9c451d2c..81508d1a09 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -313,6 +313,21 @@ void Generator::generateCode() } } } + + // QTBUG-20639 - Accept non-local enums for QML signal/slot parameters. + // Look for any scoped enum declarations, and add those to the list + // of extra/related metaobjects for this object. + QList<QByteArray> enumKeys = cdef->enumDeclarations.keys(); + for (int i = 0; i < enumKeys.count(); ++i) { + const QByteArray &enumKey = enumKeys[i]; + int s = enumKey.lastIndexOf("::"); + if (s > 0) { + QByteArray scope = enumKey.left(s); + if (scope != "Qt" && scope != cdef->classname && !extraList.contains(scope)) + extraList += scope; + } + } + if (!extraList.isEmpty()) { fprintf(out, "#ifdef Q_NO_DATA_RELOCATION\n"); fprintf(out, "static const QMetaObjectAccessor qt_meta_extradata_%s[] = {\n ", qualifiedClassNameIdentifier.constData()); diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index cfe516d999..6d3ee2611e 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -410,6 +410,24 @@ public: inline PropertyTestClass::TestEnum foo() const { return PropertyTestClass::One; } }; +class EnumSourceClass : public QObject +{ + Q_OBJECT + +public: + enum TestEnum { Value = 37 }; + + Q_ENUMS(TestEnum) +}; + +class EnumUserClass : public QObject +{ + Q_OBJECT + +public: + Q_ENUMS(EnumSourceClass::TestEnum) +}; + #if defined(Q_MOC_RUN) // Task #119503 #define _TASK_119503 @@ -483,6 +501,7 @@ private slots: void blackslashNewlines(); void slotWithSillyConst(); void testExtraData(); + void testExtraDataForEnum(); void namespaceTypeProperty(); void slotsWithVoidTemplate(); void structQObject(); @@ -810,6 +829,25 @@ void tst_Moc::testExtraData() QCOMPARE(QByteArray(en.name()), QByteArray("TestEnum")); } +// QTBUG-20639 - Accept non-local enums for QML signal/slot parameters. +void tst_Moc::testExtraDataForEnum() +{ + const QMetaObject *mobjSource = &EnumSourceClass::staticMetaObject; + QCOMPARE(mobjSource->enumeratorCount(), 1); + QCOMPARE(QByteArray(mobjSource->enumerator(0).name()), QByteArray("TestEnum")); + + const QMetaObject *mobjUser = &EnumUserClass::staticMetaObject; + QCOMPARE(mobjUser->enumeratorCount(), 0); + + const QMetaObjectExtraData *extra = reinterpret_cast<const QMetaObjectExtraData *>(mobjUser->d.extradata); + QVERIFY(extra); + + const QMetaObject **objects = extra->objects; + QVERIFY(objects); + QVERIFY(objects[0] == mobjSource); + QVERIFY(objects[1] == 0); +} + void tst_Moc::namespaceTypeProperty() { qRegisterMetaType<myNS::Points>("myNS::Points"); |