diff options
Diffstat (limited to 'Source/cmcmd.cxx')
-rw-r--r-- | Source/cmcmd.cxx | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index 036ddc6a60..f4d17f84ec 100644 --- a/Source/cmcmd.cxx +++ b/Source/cmcmd.cxx @@ -3,6 +3,7 @@ #include "cmcmd.h" #include <functional> +#include <iterator> #include <cm/optional> #include <cmext/algorithm> @@ -346,7 +347,6 @@ int HandleIWYU(const std::string& runCmd, const std::string& /* sourceFile */, cmList iwyu_cmd{ runCmd, cmList::EmptyElements::Yes }; cm::append(iwyu_cmd, orig_cmd.begin() + 1, orig_cmd.end()); // Run the iwyu command line. Capture its stderr and hide its stdout. - // Ignore its return code because the tool always returns non-zero. std::string stdErr; int ret; if (!cmSystemTools::RunSingleCommand(iwyu_cmd, nullptr, &stdErr, &ret, @@ -360,8 +360,15 @@ int HandleIWYU(const std::string& runCmd, const std::string& /* sourceFile */, std::cerr << "Warning: include-what-you-use reported diagnostics:\n" << stdErr << "\n"; } - // always return 0 we don't want to break the compile - return 0; + // Older versions of iwyu always returned a non-zero exit code, + // so ignore it unless the user has enabled errors. + auto has_error_opt = std::find_if( + iwyu_cmd.cbegin(), iwyu_cmd.cend(), + [](std::string const& opt) { return cmHasLiteralPrefix(opt, "--error"); }); + bool errors_enabled = has_error_opt != iwyu_cmd.cend() && + has_error_opt != iwyu_cmd.cbegin() && + *std::prev(has_error_opt) == "-Xiwyu"; + return errors_enabled ? ret : 0; } int HandleTidy(const std::string& runCmd, const std::string& sourceFile, |