From 87d8b2e8044fee827b6799d5ad7266f3a5112a38 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 14 Nov 2018 01:08:03 +0000 Subject: [PATCH] [HeaderSearch] loadSubdirectoryModuleMaps should respect -working-directory 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@346822 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/HeaderSearch.cpp | 4 +++- .../subdir_module/h1.h | 1 + .../subdir_module/module.map | 5 +++++ test/Modules/subdirectory-module-maps-working-dir.m | 13 +++++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h create mode 100644 test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map create mode 100644 test/Modules/subdirectory-module-maps-working-dir.m diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp index 27eca0a81c..5b827b13c0 100644 --- a/lib/Lex/HeaderSearch.cpp +++ b/lib/Lex/HeaderSearch.cpp @@ -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/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h b/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h new file mode 100644 index 0000000000..c362dd03f0 --- /dev/null +++ b/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/h1.h @@ -0,0 +1 @@ +int bar(); diff --git a/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map b/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map new file mode 100644 index 0000000000..dc51f5d03a --- /dev/null +++ b/test/Modules/Inputs/subdirectory-module-maps-working-dir/subdir_module/module.map @@ -0,0 +1,5 @@ +module ModuleInSubdir { +header "h1.h" + export * +} + diff --git a/test/Modules/subdirectory-module-maps-working-dir.m b/test/Modules/subdirectory-module-maps-working-dir.m new file mode 100644 index 0000000000..c106dd453e --- /dev/null +++ b/test/Modules/subdirectory-module-maps-working-dir.m @@ -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 -- 2.40.0