[HeaderSearch] loadSubdirectoryModuleMaps should respect -working-directory
authorAlex Lorenz <arphaman@gmail.com>
Wed, 14 Nov 2018 01:08:03 +0000 (01:08 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 14 Nov 2018 01:08:03 +0000 (01:08 +0000)
Include search paths can be relative paths. The loadSubdirectoryModuleMaps function
should account for that and respect the -working-directory parameter given to Clang.

rdar://46045849

Differential Revision: https://reviews.llvm.org/D54503

llvm-svn: 346822

clang/lib/Lex/HeaderSearch.cpp
clang/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h [new file with mode: 0644]
clang/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map [new file with mode: 0644]
clang/test/Modules/subdirectory-module-maps-working-dir.m [new file with mode: 0644]

index 27eca0a..5b827b1 100644 (file)
@@ -1638,8 +1638,10 @@ void HeaderSearch::loadSubdirectoryModuleMaps(DirectoryLookup &SearchDir) {
     return;
 
   std::error_code EC;
+  SmallString<128> Dir = SearchDir.getDir()->getName();
+  FileMgr.makeAbsolutePath(Dir);
   SmallString<128> DirNative;
-  llvm::sys::path::native(SearchDir.getDir()->getName(), DirNative);
+  llvm::sys::path::native(Dir, DirNative);
   llvm::vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem();
   for (llvm::vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC), DirEnd;
        Dir != DirEnd && !EC; Dir.increment(EC)) {
diff --git a/clang/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h b/clang/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h
new file mode 100644 (file)
index 0000000..c362dd0
--- /dev/null
@@ -0,0 +1 @@
+int bar();
diff --git a/clang/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map b/clang/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map
new file mode 100644 (file)
index 0000000..dc51f5d
--- /dev/null
@@ -0,0 +1,5 @@
+module ModuleInSubdir {
+header "h1.h"
+  export *
+}
+
diff --git a/clang/test/Modules/subdirectory-module-maps-working-dir.m b/clang/test/Modules/subdirectory-module-maps-working-dir.m
new file mode 100644 (file)
index 0000000..c106dd4
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t
+// RUN: %clang -fsyntax-only -fmodules -fmodules-cache-path=%t \
+// RUN:    -working-directory %S/Inputs \
+// RUN:    -I subdirectory-module-maps-working-dir \
+// RUN:    %s -Werror=implicit-function-declaration -Xclang -verify
+
+@import ModuleInSubdir;
+
+void foo() {
+  int x = bar();
+}
+
+// expected-no-diagnostics