Browse Source

Merge topic 'iwyu_errors'

fcacc319d9 IWYU: Return error code if user enables error reporting

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !8406
Brad King 2 năm trước cách đây
mục cha
commit
663cc941bd

+ 10 - 3
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,

+ 1 - 0
Tests/RunCMake/IncludeWhatYouUse/C-error-Build-result.txt

@@ -0,0 +1 @@
+[^0]

+ 4 - 0
Tests/RunCMake/IncludeWhatYouUse/C-error-Build-stdout.txt

@@ -0,0 +1,4 @@
+Warning: include-what-you-use reported diagnostics:
+should add these lines:
+*
+#include <\.\.\.>

+ 3 - 0
Tests/RunCMake/IncludeWhatYouUse/C-error.cmake

@@ -0,0 +1,3 @@
+enable_language(C)
+set(CMAKE_C_INCLUDE_WHAT_YOU_USE "${PSEUDO_IWYU}" -Xiwyu --error)
+add_executable(main main.c)

+ 1 - 0
Tests/RunCMake/IncludeWhatYouUse/CXX-error-Build-result.txt

@@ -0,0 +1 @@
+[^0]

+ 4 - 0
Tests/RunCMake/IncludeWhatYouUse/CXX-error-Build-stdout.txt

@@ -0,0 +1,4 @@
+Warning: include-what-you-use reported diagnostics:
+should add these lines:
+*
+#include <\.\.\.>

+ 3 - 0
Tests/RunCMake/IncludeWhatYouUse/CXX-error.cmake

@@ -0,0 +1,3 @@
+enable_language(CXX)
+set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "$<1:${PSEUDO_IWYU}>" -Xiwyu --error)
+add_executable(main main.cxx)

+ 2 - 0
Tests/RunCMake/IncludeWhatYouUse/RunCMakeTest.cmake

@@ -16,6 +16,8 @@ endfunction()
 
 run_iwyu(C)
 run_iwyu(CXX)
+run_iwyu(C-error)
+run_iwyu(CXX-error)
 if (NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
   run_iwyu(C-launch)
   run_iwyu(CXX-launch)