summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/modularize/CoverageChecker.cpp10
-rw-r--r--clang-tools-extra/modularize/Modularize.cpp4
-rw-r--r--clang-tools-extra/modularize/ModularizeUtilities.cpp19
-rw-r--r--clang-tools-extra/modularize/ModularizeUtilities.h2
-rw-r--r--clang-tools-extra/test/modularize/Inputs/MissingHeader/Level1A.h1
-rw-r--r--clang-tools-extra/test/modularize/Inputs/MissingHeader/module.modulemap10
-rw-r--r--clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize3
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
OpenPOWER on IntegriCloud