diff options
author | Volodymyr Sapsai <vsapsai@apple.com> | 2020-02-27 15:51:24 -0800 |
---|---|---|
committer | Volodymyr Sapsai <vsapsai@apple.com> | 2020-02-28 15:40:24 -0800 |
commit | 4069dd14124e9a84b46f48153d4fbc4da811a45e (patch) | |
tree | 9056458be42f7456f6e795e71073c570539cba03 | |
parent | 7d973307d5515b44df92f041916a0be25c1faa4b (diff) | |
download | llvm-4069dd14124e9a84b46f48153d4fbc4da811a45e.zip llvm-4069dd14124e9a84b46f48153d4fbc4da811a45e.tar.gz llvm-4069dd14124e9a84b46f48153d4fbc4da811a45e.tar.bz2 |
[modules] Allow frameworks to have only a private module without a public one.
Support only preferred spelling 'Modules/module.private.modulemap' and
not the deprecated 'module_private.map'.
rdar://problem/57715533
Reviewed By: bruno
Differential Revision: https://reviews.llvm.org/D75311
6 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 65d109e..1199f75 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -1568,6 +1568,16 @@ HeaderSearch::lookupModuleMapFile(const DirectoryEntry *Dir, bool IsFramework) { llvm::sys::path::append(ModuleMapFileName, "module.map"); if (auto F = FileMgr.getFile(ModuleMapFileName)) return *F; + + // For frameworks, allow to have a private module map with a preferred + // spelling when a public module map is absent. + if (IsFramework) { + ModuleMapFileName = Dir->getName(); + llvm::sys::path::append(ModuleMapFileName, "Modules", + "module.private.modulemap"); + if (auto F = FileMgr.getFile(ModuleMapFileName)) + return *F; + } return nullptr; } diff --git a/clang/test/Modules/Inputs/implicit-private-without-public/DeprecatedModuleMapLocation.framework/PrivateHeaders/A.h b/clang/test/Modules/Inputs/implicit-private-without-public/DeprecatedModuleMapLocation.framework/PrivateHeaders/A.h new file mode 100644 index 0000000..8ed2304 --- /dev/null +++ b/clang/test/Modules/Inputs/implicit-private-without-public/DeprecatedModuleMapLocation.framework/PrivateHeaders/A.h @@ -0,0 +1 @@ +void a(void); diff --git a/clang/test/Modules/Inputs/implicit-private-without-public/DeprecatedModuleMapLocation.framework/module_private.map b/clang/test/Modules/Inputs/implicit-private-without-public/DeprecatedModuleMapLocation.framework/module_private.map new file mode 100644 index 0000000..1b44bb5 --- /dev/null +++ b/clang/test/Modules/Inputs/implicit-private-without-public/DeprecatedModuleMapLocation.framework/module_private.map @@ -0,0 +1,4 @@ +framework module DeprecatedModuleMapLocation_Private { + header "A.h" + export * +} diff --git a/clang/test/Modules/Inputs/implicit-private-without-public/Foo.framework/Modules/module.private.modulemap b/clang/test/Modules/Inputs/implicit-private-without-public/Foo.framework/Modules/module.private.modulemap new file mode 100644 index 0000000..fa1057c --- /dev/null +++ b/clang/test/Modules/Inputs/implicit-private-without-public/Foo.framework/Modules/module.private.modulemap @@ -0,0 +1,4 @@ +framework module Foo_Private { + header "Foo_Priv.h" + export * +} diff --git a/clang/test/Modules/Inputs/implicit-private-without-public/Foo.framework/PrivateHeaders/Foo_Priv.h b/clang/test/Modules/Inputs/implicit-private-without-public/Foo.framework/PrivateHeaders/Foo_Priv.h new file mode 100644 index 0000000..2899e07c --- /dev/null +++ b/clang/test/Modules/Inputs/implicit-private-without-public/Foo.framework/PrivateHeaders/Foo_Priv.h @@ -0,0 +1 @@ +void foo_private(void); diff --git a/clang/test/Modules/implicit-private-without-public.m b/clang/test/Modules/implicit-private-without-public.m new file mode 100644 index 0000000..e4920bcc --- /dev/null +++ b/clang/test/Modules/implicit-private-without-public.m @@ -0,0 +1,11 @@ +// REQUIRES: shell +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \ +// RUN: -F%S/Inputs/implicit-private-without-public \ +// RUN: -fsyntax-only %s -verify + +@import Foo_Private; + +// Private module map without a public one isn't supported for deprecated module map locations. +@import DeprecatedModuleMapLocation_Private; +// expected-error@-1{{module 'DeprecatedModuleMapLocation_Private' not found}} |