aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/language/moduleloader.cpp18
-rw-r--r--tests/auto/api/tst_api.cpp4
-rw-r--r--tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs8
-rw-r--r--tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs8
-rw-r--r--tests/auto/language/tst_language.cpp5
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'";
}