diff options
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 18 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 4 | ||||
-rw-r--r-- | tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs | 8 | ||||
-rw-r--r-- | tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs | 8 | ||||
-rw-r--r-- | tests/auto/language/tst_language.cpp | 5 |
5 files changed, 39 insertions, 4 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index df47e36ea..41781cb7d 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -789,11 +789,18 @@ ModuleLoader::MultiplexInfo ModuleLoader::extractMultiplexInfo(Item *productItem if (!multiplexedType.isEmpty()) multiplexInfo.multiplexedType = VariantValue::create(multiplexedType); + Set<QString> uniqueMultiplexByQbsProperties; for (const QString &key : multiplexByQbsProperties) { const QString mappedKey = multiplexMap.property(key).toString(); if (mappedKey.isEmpty()) throw ErrorInfo(Tr::tr("There is no entry for '%1' in 'qbs.multiplexMap'.").arg(key)); + if (!uniqueMultiplexByQbsProperties.insert(mappedKey).second) { + throw ErrorInfo(Tr::tr("Duplicate entry '%1' in Product.%2.") + .arg(mappedKey, StringConstants::multiplexByQbsPropertiesProperty()), + productItem->location()); + } + const QScriptValue arr = m_evaluator->value(qbsModuleItem, key); if (arr.isUndefined()) continue; @@ -806,8 +813,15 @@ ModuleLoader::MultiplexInfo ModuleLoader::extractMultiplexInfo(Item *productItem MultiplexRow mprow; mprow.resize(arrlen); - for (quint32 i = 0; i < arrlen; ++i) - mprow[i] = VariantValue::create(arr.property(i).toVariant()); + Set<QVariant> entriesForKey; + for (quint32 i = 0; i < arrlen; ++i) { + const QVariant value = arr.property(i).toVariant(); + if (!entriesForKey.insert(value).second) { + throw ErrorInfo(Tr::tr("Duplicate entry '%1' in qbs.%2.") + .arg(value.toString(), key), productItem->location()); + } + mprow[i] = VariantValue::create(value); + } multiplexInfo.table = combine(multiplexInfo.table, mprow); multiplexInfo.properties.push_back(mappedKey); } diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 83a5ccbda..7af87fc32 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -1822,7 +1822,7 @@ void TestApi::multiArch() setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.get()); QVERIFY(setupJob->error().hasError()); - QVERIFY2(setupJob->error().toString().contains("Duplicate product name 'p1'"), + QVERIFY2(setupJob->error().toString().contains("Duplicate entry 'host' in qbs.profiles."), qPrintable(setupJob->error().toString())); // Error check: Try to build for the same profile twice, this time attaching @@ -1834,7 +1834,7 @@ void TestApi::multiArch() setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.get()); QVERIFY(setupJob->error().hasError()); - QVERIFY2(setupJob->error().toString().contains("Duplicate product name 'p1'"), + QVERIFY2(setupJob->error().toString().contains("Duplicate entry 'target' in qbs.profiles."), qPrintable(setupJob->error().toString())); } diff --git a/tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs new file mode 100644 index 000000000..56da41af1 --- /dev/null +++ b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs @@ -0,0 +1,8 @@ +import qbs + +Product { + name: "p" + multiplexByQbsProperties: "architectures" + aggregate: false + qbs.architectures: ["x86", "arm", "x86"] +} diff --git a/tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs new file mode 100644 index 000000000..e412e5210 --- /dev/null +++ b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs @@ -0,0 +1,8 @@ +import qbs + +Product { + name: "p" + multiplexByQbsProperties: ["architectures", "buildVariants", "architectures"] + aggregate: false + qbs.architectures: ["x86", "arm"] +} diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index f52c6ec9c..961808f3d 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -834,6 +834,11 @@ void TestLanguage::erroneousFiles_data() << "mismatching-multiplex-dependency.qbs:9:5.*Dependency from product " "'b \\{\"architecture\":\"mips\"\\}' to product 'a \\{\"architecture\":\"mips\"\\}'" " not fulfilled."; + QTest::newRow("duplicate-multiplex-value") + << "duplicate-multiplex-value.qbs:3:1.*Duplicate entry 'x86' in qbs.architectures."; + QTest::newRow("duplicate-multiplex-value2") + << "duplicate-multiplex-value2.qbs:3:1.*Duplicate entry 'architecture' in " + "Product.multiplexByQbsProperties."; QTest::newRow("invalid-references") << "invalid-references.qbs:4:17.*Cannot open '.*nosuchproject.qbs'"; } |