Index: include/clang/Tooling/Tooling.h =================================================================== --- include/clang/Tooling/Tooling.h +++ include/clang/Tooling/Tooling.h @@ -326,6 +326,9 @@ /// Runs an action over all files specified in the command line. /// /// \param Action Tool action. + /// + /// \returns 0 on success; 1 if any error occured; 2 if there is no error but + /// some files are skipped due to missing compile commands. int run(ToolAction *Action); /// \brief Create an AST for each file specified in the command line and Index: lib/Tooling/Tooling.cpp =================================================================== --- lib/Tooling/Tooling.cpp +++ lib/Tooling/Tooling.cpp @@ -387,6 +387,7 @@ llvm::MemoryBuffer::getMemBuffer(MappedFile.second)); bool ProcessingFailed = false; + bool FileSkipped = false; for (const auto &SourcePath : SourcePaths) { std::string File(getAbsolutePath(SourcePath)); @@ -406,6 +407,7 @@ // specify all files I want to run over explicitly, where this should // be an error. We'll want to add an option for this. llvm::errs() << "Skipping " << File << ". Compile command not found.\n"; + FileSkipped = true; continue; } for (CompileCommand &CompileCommand : CompileCommandsForFile) { @@ -465,7 +467,7 @@ Twine(InitialDirectory) + "\n!"); } } - return ProcessingFailed ? 1 : 0; + return ProcessingFailed ? 1 : (FileSkipped ? 2 : 0); } namespace {