From 121b8a6ae42d9423250ab1121c15c49ab064307a Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Fri, 24 Apr 2020 15:55:23 +0200 Subject: qqmltypecompiler: Be more careful when resolving enums Task-number: QTBUG-83703 Pick-to: 5.15 Change-Id: I60c0811e47e0cd3b63b3ddfebb9bb6e9ab7f4f40 Reviewed-by: Ulf Hermann --- tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 57 ++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp') diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 77e545722a..411ff7df56 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -228,6 +228,7 @@ private slots: void scopedEnum(); void scopedEnumsWithNameClash(); void scopedEnumsWithResolvedNameClash(); + void enumNoScopeLeak(); void qmlEnums(); void literals_data(); void literals(); @@ -4155,6 +4156,62 @@ void tst_qqmllanguage::scopedEnumsWithResolvedNameClash() QVERIFY(obj->property("success").toBool()); } +class ObjectA : public QObject +{ + Q_OBJECT + +public: + + enum TestEnum { + Default = 42, + TestValue1, + TestValue2 + }; + Q_ENUM(TestEnum) + + ObjectA() = default; +}; + +class ObjectB : public QObject +{ + Q_OBJECT + Q_PROPERTY(ObjectA::TestEnum testEnum READ testEnum WRITE setTestEnum NOTIFY testEnumChanged) + +public: + ObjectB() = default; + ObjectA::TestEnum testEnum() const {return m_testEnum;} + +public slots: + void setTestEnum(ObjectA::TestEnum testEnum) {auto old = m_testEnum; m_testEnum = testEnum; if (old != m_testEnum) testEnumChanged(m_testEnum);} +signals: + void testEnumChanged(ObjectA::TestEnum testEnum); +private: + ObjectA::TestEnum m_testEnum = ObjectA::Default; +}; + +class ObjectC : public ObjectB +{ + Q_OBJECT + +public: + ObjectC() = default; +}; + +void tst_qqmllanguage::enumNoScopeLeak() +{ + qmlRegisterType("test", 1, 0, "ObjectA"); + qmlRegisterType("test", 1, 0, "ObjectB"); + qmlRegisterType("test", 1, 0, "ObjectC"); + QQmlEngine engine; + auto url = testFileUrl("enumScopeLeak.qml"); + QQmlComponent component(&engine, url); + const auto msg = url.toString() + ":5:5: Unable to assign [undefined] to ObjectA::TestEnum"; + QTest::ignoreMessage(QtMsgType::QtWarningMsg, msg.toUtf8().constData()); + QScopedPointer root(component.create()); + QVERIFY(root); + QCOMPARE(root->property("testEnum").toInt(), ObjectA::Default); +} + void tst_qqmllanguage::qmlEnums() { QQmlEngine engine; -- cgit v1.2.3