]> granicus.if.org Git - clang/commitdiff
Make -Wincomplete-umbrella go through the VFS
authorBen Langmuir <blangmuir@apple.com>
Wed, 25 Jun 2014 23:53:43 +0000 (23:53 +0000)
committerBen Langmuir <blangmuir@apple.com>
Wed, 25 Jun 2014 23:53:43 +0000 (23:53 +0000)
By using vfs::recursive_directory_iterator, this warning will now fire
when some or all of a module's headers are from VFS mappings.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211746 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/VirtualFileSystem.h
lib/Lex/PPLexerChange.cpp
test/VFS/Inputs/Incomplete.h [new file with mode: 0644]
test/VFS/Inputs/IncompleteVFS.h [new file with mode: 0644]
test/VFS/Inputs/incomplete-umbrella.modulemap [new file with mode: 0644]
test/VFS/Inputs/vfsoverlay.yaml
test/VFS/incomplete-umbrella.m [new file with mode: 0644]

index 882ebdb12b5e72d4f6e6a48b6475e4090c9e2b22..36f78fd8725f979b5aa687864e0375833fc013aa 100644 (file)
@@ -200,7 +200,7 @@ public:
                                    bool IsVolatile = false);
 
   /// \brief Get a directory_iterator for \p Dir.
-  /// \note The 'end' iterator is directory_iterator()
+  /// \note The 'end' iterator is directory_iterator().
   virtual directory_iterator dir_begin(const Twine &Dir,
                                        std::error_code &EC) = 0;
 };
index 81bb077632ffba3a931d67cce0b84a832bf744c2..7586293151927f98df2e4aef137bdfda6bc0372a 100644 (file)
@@ -455,19 +455,21 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) {
         typedef llvm::sys::fs::recursive_directory_iterator
           recursive_directory_iterator;
         const DirectoryEntry *Dir = Mod->getUmbrellaDir();
+        vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem();
         std::error_code EC;
-        for (recursive_directory_iterator Entry(Dir->getName(), EC), End;
+        for (vfs::recursive_directory_iterator Entry(FS, Dir->getName(), EC), End;
              Entry != End && !EC; Entry.increment(EC)) {
           using llvm::StringSwitch;
           
           // Check whether this entry has an extension typically associated with
           // headers.
-          if (!StringSwitch<bool>(llvm::sys::path::extension(Entry->path()))
+          if (!StringSwitch<bool>(llvm::sys::path::extension(Entry->getName()))
                  .Cases(".h", ".H", ".hh", ".hpp", true)
                  .Default(false))
             continue;
 
-          if (const FileEntry *Header = getFileManager().getFile(Entry->path()))
+          if (const FileEntry *Header =
+                  getFileManager().getFile(Entry->getName()))
             if (!getSourceManager().hasFileInfo(Header)) {
               if (!ModMap.isHeaderInUnavailableModule(Header)) {
                 // Find the relative path that would access this header.
diff --git a/test/VFS/Inputs/Incomplete.h b/test/VFS/Inputs/Incomplete.h
new file mode 100644 (file)
index 0000000..29fafc3
--- /dev/null
@@ -0,0 +1 @@
+// does not include IncompleteVFS.h or IncompleteReal.h
diff --git a/test/VFS/Inputs/IncompleteVFS.h b/test/VFS/Inputs/IncompleteVFS.h
new file mode 100644 (file)
index 0000000..22cfe7d
--- /dev/null
@@ -0,0 +1 @@
+// IncompleteVFS.h
diff --git a/test/VFS/Inputs/incomplete-umbrella.modulemap b/test/VFS/Inputs/incomplete-umbrella.modulemap
new file mode 100644 (file)
index 0000000..5afac92
--- /dev/null
@@ -0,0 +1,5 @@
+framework module Incomplete {
+  umbrella header "Incomplete.h"
+  export *
+  module * { export * }
+}
index 0aa8cd619a5f62fdad5195aab682e9dd6ed24156..f395d45ee3b7e9fc5980ddacae6229e5e9829f86 100644 (file)
         },
         { 'name': 'Foo.framework/Headers/Foo.h', 'type': 'file',
           'external-contents': 'INPUT_DIR/Foo.h'
+        },
+        { 'name': 'Incomplete.framework', 'type': 'directory',
+          'contents': [
+            { 'name': 'Headers', 'type': 'directory',
+              'contents': [
+                { 'name': 'Incomplete.h', 'type': 'file',
+                  'external-contents': 'INPUT_DIR/Incomplete.h'
+                },
+                { 'name': 'IncompleteVFS.h', 'type': 'file',
+                  'external-contents': 'INPUT_DIR/IncompleteVFS.h'
+                }
+              ]
+            },
+            { 'name': 'Modules/module.modulemap', 'type': 'file',
+              'external-contents': 'INPUT_DIR/incomplete-umbrella.modulemap'
+            }
+          ]
         }
       ]
     }
diff --git a/test/VFS/incomplete-umbrella.m b/test/VFS/incomplete-umbrella.m
new file mode 100644 (file)
index 0000000..4e138cc
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t/Incomplete.framework/Headers
+// RUN: echo '// IncompleteReal.h' > %t/Incomplete.framework/Headers/IncompleteReal.h
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: not %clang_cc1 -Werror -fmodules -fmodules-cache-path=%t \
+// RUN:     -ivfsoverlay %t.yaml -F %t -fsyntax-only %s 2>&1 | FileCheck %s
+// REQUIRES: shell
+
+@import Incomplete;
+// CHECK: umbrella header for module 'Incomplete' {{.*}}IncompleteVFS.h
+// CHECK: umbrella header for module 'Incomplete' {{.*}}IncompleteReal.h
+// CHECK: could not build module 'Incomplete'