diff options
7 files changed, 42 insertions, 7 deletions
diff --git a/clang-tools-extra/modularize/CoverageChecker.cpp b/clang-tools-extra/modularize/CoverageChecker.cpp index 3a9faa4f696..b3c4227b623 100644 --- a/clang-tools-extra/modularize/CoverageChecker.cpp +++ b/clang-tools-extra/modularize/CoverageChecker.cpp @@ -221,13 +221,13 @@ bool CoverageChecker::collectModuleHeaders(const Module &Mod) { } for (auto &HeaderKind : Mod.Headers) - for (auto &Header : HeaderKind) - ModuleMapHeadersSet.insert(ModularizeUtilities::getCanonicalPath( - Header.Entry->getName())); + for (auto &Header : HeaderKind) + ModuleMapHeadersSet.insert(ModularizeUtilities::getCanonicalPath( + Header.Entry->getName())); for (Module::submodule_const_iterator MI = Mod.submodule_begin(), - MIEnd = Mod.submodule_end(); - MI != MIEnd; ++MI) + MIEnd = Mod.submodule_end(); + MI != MIEnd; ++MI) collectModuleHeaders(**MI); return true; diff --git a/clang-tools-extra/modularize/Modularize.cpp b/clang-tools-extra/modularize/Modularize.cpp index 65ed3eadc70..667cd01cdf3 100644 --- a/clang-tools-extra/modularize/Modularize.cpp +++ b/clang-tools-extra/modularize/Modularize.cpp @@ -738,8 +738,8 @@ int main(int Argc, const char **Argv) { ListFileNames, HeaderPrefix)); // Get header file names and dependencies. - ModUtil->loadAllHeaderListsAndDependencies(); - + if (ModUtil->loadAllHeaderListsAndDependencies()) + HadErrors = 1; // If we are in assistant mode, output the module map and quit. if (ModuleMapPath.length() != 0) { diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp b/clang-tools-extra/modularize/ModularizeUtilities.cpp index 62b6e911fbf..7594b6725cc 100644 --- a/clang-tools-extra/modularize/ModularizeUtilities.cpp +++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp @@ -46,6 +46,7 @@ ModularizeUtilities::ModularizeUtilities(std::vector<std::string> &InputPaths, : InputFilePaths(InputPaths), HeaderPrefix(Prefix), HasModuleMap(false), + MissingHeaderCount(0), // Init clang stuff needed for loading the module map and preprocessing. LangOpts(new LangOptions()), DiagIDs(new DiagnosticIDs()), DiagnosticOpts(new DiagnosticOptions()), @@ -234,6 +235,9 @@ std::error_code ModularizeUtilities::loadModuleMap( // Do matching end call. DC.EndSourceFile(); + // Reset missing header count. + MissingHeaderCount = 0; + if (!collectModuleMapHeaders(ModMap.get())) return std::error_code(1, std::generic_category()); @@ -243,6 +247,10 @@ std::error_code ModularizeUtilities::loadModuleMap( // Indicate we are using module maps. HasModuleMap = true; + // Return code of 1 for missing headers. + if (MissingHeaderCount) + return std::error_code(1, std::generic_category()); + return std::error_code(); } @@ -310,6 +318,17 @@ bool ModularizeUtilities::collectModuleHeaders(const Module &Mod) { HeaderFileNames.push_back(HeaderPath); } + int MissingCountThisModule = Mod.MissingHeaders.size(); + + for (int Index = 0; Index < MissingCountThisModule; ++Index) { + std::string MissingFile = Mod.MissingHeaders[Index].FileName; + SourceLocation Loc = Mod.MissingHeaders[Index].FileNameLoc; + errs() << Loc.printToString(*SourceMgr) + << ": error : Header not found: " << MissingFile << "\n"; + } + + MissingHeaderCount += MissingCountThisModule; + return true; } diff --git a/clang-tools-extra/modularize/ModularizeUtilities.h b/clang-tools-extra/modularize/ModularizeUtilities.h index 61a97d8f22e..9c1ee74107d 100644 --- a/clang-tools-extra/modularize/ModularizeUtilities.h +++ b/clang-tools-extra/modularize/ModularizeUtilities.h @@ -52,6 +52,8 @@ public: DependencyMap Dependencies; /// True if we have module maps. bool HasModuleMap; + /// Missing header count. + int MissingHeaderCount; // Functions. diff --git a/clang-tools-extra/test/modularize/Inputs/MissingHeader/Level1A.h b/clang-tools-extra/test/modularize/Inputs/MissingHeader/Level1A.h new file mode 100644 index 00000000000..10eef6787e4 --- /dev/null +++ b/clang-tools-extra/test/modularize/Inputs/MissingHeader/Level1A.h @@ -0,0 +1 @@ +#define MACRO_1A 1 diff --git a/clang-tools-extra/test/modularize/Inputs/MissingHeader/module.modulemap b/clang-tools-extra/test/modularize/Inputs/MissingHeader/module.modulemap new file mode 100644 index 00000000000..daa06fca78d --- /dev/null +++ b/clang-tools-extra/test/modularize/Inputs/MissingHeader/module.modulemap @@ -0,0 +1,10 @@ +// module.map
+
+module Level1A {
+ header "Level1A.h"
+ export *
+}
+module Missing {
+ header "Missing.h"
+ export *
+}
diff --git a/clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize b/clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize new file mode 100644 index 00000000000..bc731fb0fdf --- /dev/null +++ b/clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize @@ -0,0 +1,3 @@ +# RUN: not modularize %S/Inputs/MissingHeader/module.modulemap 2>&1 | FileCheck %s + +# CHECK: {{.*}}{{[/\\]}}Inputs/MissingHeader/module.modulemap:8:10: error : Header not found: Missing.h |