From c87299f5d0c406b1ee804760c4336f7963ecd344 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 21 Jun 2018 10:53:39 +0200 Subject: Do not crash on invalid property assignment in Export item The crash would happen when creating the export information for a product whose Export item contained an assignment of the form "x.y: original", where x is not a module and the assignment was inside a Properties item. Task-number: QBS-1362 Change-Id: I900857fcd97852360ec2b75de1b7a791fd948dc4 Reviewed-by: Joerg Bornemann --- src/lib/corelib/language/evaluatorscriptclass.cpp | 12 ++++++++++++ .../testdata/erroneous/original-in-export-item3.qbs | 17 +++++++++++++++++ tests/auto/language/tst_language.cpp | 4 ++++ 3 files changed, 33 insertions(+) create mode 100644 tests/auto/language/testdata/erroneous/original-in-export-item3.qbs diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp index 18d7fd83f..6db308a7f 100644 --- a/src/lib/corelib/language/evaluatorscriptclass.cpp +++ b/src/lib/corelib/language/evaluatorscriptclass.cpp @@ -184,6 +184,18 @@ private: result.second = false; return result; } + + // TODO: Provide a dedicated item type for not-yet-instantiated things that + // look like module instances in the AST visitor. + if (item->type() == ItemType::ModuleInstance + && !item->hasProperty(StringConstants::presentProperty())) { + const QString errorMessage = Tr::tr("Trying to assign property '%1' " + "on something that is not a module.").arg(propertyName->toString()); + extraScope = engine->currentContext()->throwError(errorMessage); + result.second = false; + return result; + } + while (item->type() == ItemType::ModuleInstance) item = item->prototype(); if (item->type() != ItemType::Module && item->type() != ItemType::Export) { diff --git a/tests/auto/language/testdata/erroneous/original-in-export-item3.qbs b/tests/auto/language/testdata/erroneous/original-in-export-item3.qbs new file mode 100644 index 000000000..d7bcb322e --- /dev/null +++ b/tests/auto/language/testdata/erroneous/original-in-export-item3.qbs @@ -0,0 +1,17 @@ +import qbs + +Project { + Product { + name: "a" + Export { + Properties { + condition: true + x.y.z: original + } + } + } + Product { + name: "b" + Depends { name: "a" } + } +} diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index a82646e4e..9aa92229e 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -883,6 +883,9 @@ void TestLanguage::erroneousFiles_data() QTest::newRow("original-in-export-item2") << "original-in-export-item2.qbs:6:9.*Item 'x.y' is not declared. Did you forget " "to add a Depends item"; + QTest::newRow("original-in-export-item3") + << "original-in-export-item3.qbs:6:9.*Item 'x.y' is not declared. Did you forget " + "to add a Depends item"; QTest::newRow("mismatching-multiplex-dependency") << "mismatching-multiplex-dependency.qbs:9:5.*Dependency from product " "'b \\{\"architecture\":\"mips\"\\}' to product 'a \\{\"architecture\":\"mips\"\\}'" @@ -912,6 +915,7 @@ void TestLanguage::erroneousFiles() return; } QEXPECT_FAIL("undeclared_property_in_Properties_item", "Too expensive to check", Continue); + QEXPECT_FAIL("original-in-export-item3", "Too expensive to check", Continue); QVERIFY(!"No error thrown on invalid input."); } -- cgit v1.2.3