diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index 9d3d3266b2a..96b25bd3722 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -1253,8 +1253,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, // Output the methods in the class. Q_ASSERT(!buf || dataIndex == pmeta->methodData); - // + 1 for metatype of this metaobject - int parameterMetaTypesIndex = int(d->properties.size()) + 1; + // property count + enum count + 1 for metatype of this metaobject + int parameterMetaTypesIndex = int(d->properties.size()) + int(d->enumerators.size()) + 1; for (const auto &method : d->methods) { [[maybe_unused]] int name = strings.enter(method.name()); int argc = method.parameterCount(); @@ -1418,12 +1418,19 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, } ALIGN(size, QtPrivate::QMetaTypeInterface *); - auto types = reinterpret_cast(buf + size); + auto types = reinterpret_cast(buf + size); if constexpr (mode == Construct) { meta->d.metaTypes = types; for (const auto &prop : d->properties) { QMetaType mt = prop.metaType; - *types = reinterpret_cast(mt); + *types = mt.iface(); + types++; + } + // add metatypes for enumerators + for (const auto &enumerator: d->enumerators) { + QMetaType mt = enumerator.metaType; + mt.registerType(); + *types = mt.iface(); types++; } // add metatype interface for this metaobject - must be null @@ -1436,14 +1443,14 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, types++; for (const auto ¶meterType: method.parameterTypes()) { QMetaType mt = QMetaType::fromName(parameterType); - *types = reinterpret_cast(mt); + *types = mt.iface(); types++; } } for (const auto &constructor : d->constructors) { for (const auto ¶meterType : constructor.parameterTypes()) { QMetaType mt = QMetaType::fromName(parameterType); - *types = reinterpret_cast(mt); + *types = mt.iface(); types++; } } diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index fa927536b77..0f26e67fb27 100644 --- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -39,6 +39,7 @@ private slots: void classNameFirstInStringData(); void propertyMetaType(); + void enumCloning(); void cleanupTestCase(); @@ -1713,6 +1714,26 @@ void tst_QMetaObjectBuilder::propertyMetaType() free(mo); } +void tst_QMetaObjectBuilder::enumCloning() +{ + QMetaObjectBuilder builder(&SomethingOfEverything::staticMetaObject); + auto smo = SomethingOfEverything::staticMetaObject; + auto mo = builder.toMetaObject(); + auto cleanup = qScopeGuard([&]() { free(mo); }); + QCOMPARE_EQ(mo->enumeratorCount(), smo.enumeratorCount()); + for (int enumIndex = 0; enumIndex < smo.enumeratorCount(); ++enumIndex) { + QMetaEnum metaEnumFromBuilder = mo->enumerator(enumIndex); + QMetaEnum originalMetaEnum = smo.enumerator(enumIndex); + QCOMPARE_EQ(metaEnumFromBuilder.metaType(), originalMetaEnum.metaType()); + QCOMPARE_EQ(metaEnumFromBuilder.keyCount(), originalMetaEnum.keyCount()); + for (int k = 0; k < originalMetaEnum.keyCount(); ++k) { + QCOMPARE_EQ(QByteArrayView(metaEnumFromBuilder.key(k)), QByteArrayView(originalMetaEnum.key(k))); + QCOMPARE_EQ(metaEnumFromBuilder.value(k), originalMetaEnum.value(k)); + QCOMPARE_EQ(metaEnumFromBuilder.value64(k), originalMetaEnum.value64(k)); + } + } +} + void tst_QMetaObjectBuilder::ownMetaTypeNoProperties() { QMetaObjectBuilder builder;