From 817d72df7ffbf24b9101d3a86609ead27cbfc7c6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 4 Sep 2023 13:14:34 +0200 Subject: [PATCH] ClangTools: Always print stderr output E.g. clang-tidy prints error messages for invalid config files, but then continues to run and finishes with exit code zero. Fixes: QTCREATORBUG-29298 Change-Id: Idbfb7998994ac8197cd863f4bbb2c64ac1bd5525 Reviewed-by: David Schulz --- src/plugins/clangtools/clangtool.cpp | 3 +++ src/plugins/clangtools/clangtoolrunner.cpp | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 6fc8d3f06fb..652b24b90fa 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -774,6 +774,9 @@ Group ClangTool::runRecipe(const RunSettings &runSettings, // TODO: postMessage() instead m_runControl->postMessage(message, StdErrFormat); m_runControl->postMessage(output.errorDetails, StdErrFormat); + } else if (!output.errorMessage.isEmpty()) { + m_runControl->postMessage(output.errorMessage, ErrorMessageFormat); + m_runControl->postMessage(output.errorDetails, StdErrFormat); } else { qCDebug(LOG) << "Clang tool task finished with success:" << output.outputFilePath; diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index 20331566410..e83037aa536 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -165,6 +165,18 @@ GroupItem clangToolTask(const AnalyzeInputData &input, }; const auto onProcessDone = [=](const Process &process) { qCDebug(LOG).noquote() << "Output:\n" << process.cleanedStdOut(); + + // Here we handle only the case of process success with stderr output. + if (!outputHandler) + return; + if (process.result() != ProcessResult::FinishedWithSuccess) + return; + const QString stdErr = process.cleanedStdErr(); + if (stdErr.isEmpty()) + return; + outputHandler( + {true, input.unit.file, {}, {}, input.tool, Tr::tr("%1 produced stderr output:") + .arg(storage->name), stdErr}); }; const auto onProcessError = [=](const Process &process) { if (!outputHandler)