diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2017-03-21 16:43:51 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2017-03-21 16:43:51 +0000 |
commit | 08ebd61a80b3a0c68675a75bdff984fd2b7c6b39 (patch) | |
tree | 96cfa4bf1bec1f7c03cf0ee5a45d032c91563186 /clang | |
parent | 5af82a7ae1eea8477be87bb9003aee5583003562 (diff) | |
download | bcm5719-llvm-08ebd61a80b3a0c68675a75bdff984fd2b7c6b39.tar.gz bcm5719-llvm-08ebd61a80b3a0c68675a75bdff984fd2b7c6b39.zip |
[Modules] Find PrivateHeaders when looking into subframeworks
Fix the current parsing of subframeworks in modulemaps to lookup for
headers based on whether they are frameworks.
rdar://problem/30563982
llvm-svn: 298391
Diffstat (limited to 'clang')
12 files changed, 48 insertions, 7 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 384e5707dca..61ad5948cd5 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -1841,7 +1841,7 @@ void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken, Module::UnresolvedHeaderDirective Header; Header.FileName = Tok.getString(); Header.FileNameLoc = consumeToken(); - + // Check whether we already have an umbrella. if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) { Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash) @@ -1861,19 +1861,25 @@ void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken, // Search for the header file within the search directory. SmallString<128> FullPathName(Directory->getName()); unsigned FullPathLength = FullPathName.size(); - + if (ActiveModule->isPartOfFramework()) { appendSubframeworkPaths(ActiveModule, RelativePathName); - + unsigned RelativePathLength = RelativePathName.size(); + // Check whether this file is in the public headers. llvm::sys::path::append(RelativePathName, "Headers", Header.FileName); llvm::sys::path::append(FullPathName, RelativePathName); File = SourceMgr.getFileManager().getFile(FullPathName); - + + // Check whether this file is in the private headers. if (!File) { - // Check whether this file is in the private headers. - // FIXME: Should we retain the subframework paths here? - RelativePathName.clear(); + // Ideally, private modules in the form 'FrameworkName.Private' should + // be defined as 'module FrameworkName.Private', and not as + // 'framework module FrameworkName.Private', since a 'Private.Framework' + // does not usually exist. However, since both are currently widely used + // for private modules, make sure we find the right path in both cases. + RelativePathName.resize(ActiveModule->IsFramework ? 0 + : RelativePathLength); FullPathName.resize(FullPathLength); llvm::sys::path::append(RelativePathName, "PrivateHeaders", Header.FileName); diff --git a/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/B.h b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/B.h new file mode 100644 index 00000000000..761540b09cb --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/B.h @@ -0,0 +1 @@ +// B.h diff --git a/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/Sub.h b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/Sub.h new file mode 100644 index 00000000000..fd86e3cf872 --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/Sub.h @@ -0,0 +1,2 @@ +// Sub.h +#import "B.h" diff --git a/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h new file mode 100644 index 00000000000..4ab49b798c6 --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h @@ -0,0 +1 @@ +// BPriv.h diff --git a/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h new file mode 100644 index 00000000000..f6ac6188d65 --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h @@ -0,0 +1 @@ +#import "BPriv.h" diff --git a/clang/test/Modules/Inputs/Main.framework/Headers/A.h b/clang/test/Modules/Inputs/Main.framework/Headers/A.h new file mode 100644 index 00000000000..975f1f0437b --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Headers/A.h @@ -0,0 +1 @@ +// A.h diff --git a/clang/test/Modules/Inputs/Main.framework/Headers/Main.h b/clang/test/Modules/Inputs/Main.framework/Headers/Main.h new file mode 100644 index 00000000000..cb8cc00a0c4 --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Headers/Main.h @@ -0,0 +1,2 @@ +// Main.h +#import "A.h" diff --git a/clang/test/Modules/Inputs/Main.framework/Modules/module.modulemap b/clang/test/Modules/Inputs/Main.framework/Modules/module.modulemap new file mode 100644 index 00000000000..9fab5d350fe --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Modules/module.modulemap @@ -0,0 +1,12 @@ +framework module Main { + umbrella header "Main.h" + + module * { export * } + export * + + framework module Sub { + umbrella header "Sub.h" + module * { export * } + export * + } +} diff --git a/clang/test/Modules/Inputs/Main.framework/Modules/module.private.modulemap b/clang/test/Modules/Inputs/Main.framework/Modules/module.private.modulemap new file mode 100644 index 00000000000..54e8be79bfa --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/Modules/module.private.modulemap @@ -0,0 +1,11 @@ +module Main.Private { + umbrella header "MainPriv.h" + module * { export * } + export * +} + +module Main.Sub.Private { + umbrella header "SubPriv.h" + module * { export * } + export * +} diff --git a/clang/test/Modules/Inputs/Main.framework/PrivateHeaders/APriv.h b/clang/test/Modules/Inputs/Main.framework/PrivateHeaders/APriv.h new file mode 100644 index 00000000000..6ac683c39c5 --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/PrivateHeaders/APriv.h @@ -0,0 +1 @@ +// APriv.h diff --git a/clang/test/Modules/Inputs/Main.framework/PrivateHeaders/MainPriv.h b/clang/test/Modules/Inputs/Main.framework/PrivateHeaders/MainPriv.h new file mode 100644 index 00000000000..68103017ad0 --- /dev/null +++ b/clang/test/Modules/Inputs/Main.framework/PrivateHeaders/MainPriv.h @@ -0,0 +1 @@ +#import "APriv.h" diff --git a/clang/test/Modules/find-privateheaders.m b/clang/test/Modules/find-privateheaders.m new file mode 100644 index 00000000000..c5e82ac70da --- /dev/null +++ b/clang/test/Modules/find-privateheaders.m @@ -0,0 +1,2 @@ +// RUN: %clang_cc1 -fmodules -fsyntax-only -F%S/Inputs %s +#import "Main/Main.h" |