ProjectExplorer: Do not detect clang-cl executables more than once

This fixes soft asserts in ToolchainManager.

Change-Id: I629d57ae51fab90874b00685494c9aa1c49ef86d
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2024-10-21 15:18:58 +02:00
parent c00ce6341b
commit fbaff902b8

View File

@@ -1623,9 +1623,8 @@ static Toolchains detectClangClToolChainInPath(const FilePath &clangClPath,
.arg(QLatin1String(isDefault ? "Default " : "")) .arg(QLatin1String(isDefault ? "Default " : ""))
.arg(targetAbi.wordWidth()) .arg(targetAbi.wordWidth())
.arg(Abi::toString(targetAbi.osFlavor()).toUpper()); .arg(Abi::toString(targetAbi.osFlavor()).toUpper());
for (auto language : {Id(Constants::C_LANGUAGE_ID), Id(Constants::CXX_LANGUAGE_ID)}) { for (const Id language : {Id(Constants::C_LANGUAGE_ID), Id(Constants::CXX_LANGUAGE_ID)}) {
ClangClToolchain *tc = static_cast<ClangClToolchain *>( if (Utils::findOrDefault(alreadyKnown, [&](Toolchain *tc) {
Utils::findOrDefault(alreadyKnown, [&](Toolchain *tc) -> bool {
if (tc->typeId() != Constants::CLANG_CL_TOOLCHAIN_TYPEID) if (tc->typeId() != Constants::CLANG_CL_TOOLCHAIN_TYPEID)
return false; return false;
if (tc->targetAbi() != targetAbi) if (tc->targetAbi() != targetAbi)
@@ -1633,18 +1632,17 @@ static Toolchains detectClangClToolChainInPath(const FilePath &clangClPath,
if (tc->language() != language) if (tc->language() != language)
return false; return false;
return tc->compilerCommand().isSameExecutable(clangClPath); return tc->compilerCommand().isSameExecutable(clangClPath);
})); })) {
if (tc) { continue;
res << tc;
} else {
auto cltc = new ClangClToolchain;
cltc->setClangPath(clangClPath);
cltc->setDisplayName(name);
cltc->setDetection(Toolchain::AutoDetection);
cltc->setLanguage(language);
cltc->setupVarsBat(toolChain->targetAbi(), toolChain->varsBat(), toolChain->varsBatArg());
res << cltc;
} }
auto cltc = new ClangClToolchain;
cltc->setClangPath(clangClPath);
cltc->setDisplayName(name);
cltc->setDetection(Toolchain::AutoDetection);
cltc->setLanguage(language);
cltc->setupVarsBat(toolChain->targetAbi(), toolChain->varsBat(), toolChain->varsBatArg());
res << cltc;
} }
return res; return res;
} }