Fixed modularize to warn about missing headers referenced in a module map.
authorJohn Thompson <John.Thompson.JTSoftware@gmail.com>
Thu, 4 Jun 2015 23:35:19 +0000 (23:35 +0000)
committerJohn Thompson <John.Thompson.JTSoftware@gmail.com>
Thu, 4 Jun 2015 23:35:19 +0000 (23:35 +0000)
llvm-svn: 239122

clang-tools-extra/modularize/CoverageChecker.cpp
clang-tools-extra/modularize/Modularize.cpp
clang-tools-extra/modularize/ModularizeUtilities.cpp
clang-tools-extra/modularize/ModularizeUtilities.h
clang-tools-extra/test/modularize/Inputs/MissingHeader/Level1A.h [new file with mode: 0644]
clang-tools-extra/test/modularize/Inputs/MissingHeader/module.modulemap [new file with mode: 0644]
clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize [new file with mode: 0644]

index 3a9faa4..b3c4227 100644 (file)
@@ -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;
index 65ed3ea..667cd01 100644 (file)
@@ -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) {
index 62b6e91..7594b67 100644 (file)
@@ -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;
 }
 
index 61a97d8..9c1ee74 100644 (file)
@@ -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 (file)
index 0000000..10eef67
--- /dev/null
@@ -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 (file)
index 0000000..daa06fc
--- /dev/null
@@ -0,0 +1,10 @@
+// module.map\r
+\r
+module Level1A {\r
+  header "Level1A.h"\r
+  export *\r
+}\r
+module Missing {\r
+  header "Missing.h"\r
+  export *\r
+}\r
diff --git a/clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize b/clang-tools-extra/test/modularize/ProblemsMissingHeader.modularize
new file mode 100644 (file)
index 0000000..bc731fb
--- /dev/null
@@ -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