diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-04-24 15:55:23 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-06-22 09:14:36 +0200 |
commit | 121b8a6ae42d9423250ab1121c15c49ab064307a (patch) | |
tree | b092dd6514e88ac4d5aff5eed1399142a57384db /tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | |
parent | 8a3f8595569a920cf2fa811704dec97ae31be15d (diff) |
qqmltypecompiler: Be more careful when resolving enums
Task-number: QTBUG-83703
Pick-to: 5.15
Change-Id: I60c0811e47e0cd3b63b3ddfebb9bb6e9ab7f4f40
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp')
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
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<ObjectA>("test", 1, 0, "ObjectA"); + qmlRegisterType<ObjectB>("test", 1, 0, "ObjectB"); + qmlRegisterType<ObjectC>("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<QObject> root(component.create()); + QVERIFY(root); + QCOMPARE(root->property("testEnum").toInt(), ObjectA::Default); +} + void tst_qqmllanguage::qmlEnums() { QQmlEngine engine; |