summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2017-05-09 00:41:38 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2017-05-09 00:41:38 +0000
commitd6e3289cb210764700f3f9dd33afceb99bb68f1e (patch)
tree5ef1e1c741ecfd5aecb43c39ce276d41eb373ca3
parent94cb34b6a1efc04ae7201d3bd7b025c781da1926 (diff)
downloadbcm5719-llvm-d6e3289cb210764700f3f9dd33afceb99bb68f1e.tar.gz
bcm5719-llvm-d6e3289cb210764700f3f9dd33afceb99bb68f1e.zip
[Modules] Allow umbrella frameworks to define private submodules for subframeworks
In r298391 we fixed the umbrella framework model to work when submodules named "Private" are used. This complements the work by allowing the umbrella framework model to work in general. rdar://problem/31790067 llvm-svn: 302491
-rw-r--r--clang/lib/Lex/ModuleMap.cpp6
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h1
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h2
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h1
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h1
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Headers/A.h1
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Headers/Main.h2
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Modules/module.modulemap12
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap12
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h1
-rw-r--r--clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/MainPriv.h1
-rw-r--r--clang/test/Modules/find-privateheaders.m13
12 files changed, 50 insertions, 3 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index 568894c32b9..6f44dc757e8 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -1913,8 +1913,10 @@ void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
// '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);
+ if (ActiveModule->IsFramework && ActiveModule->Name == "Private")
+ RelativePathName.clear();
+ else
+ RelativePathName.resize(RelativePathLength);
FullPathName.resize(FullPathLength);
llvm::sys::path::append(RelativePathName, "PrivateHeaders",
Header.FileName);
diff --git a/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h
new file mode 100644
index 00000000000..761540b09cb
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h
@@ -0,0 +1 @@
+// B.h
diff --git a/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h
new file mode 100644
index 00000000000..fd86e3cf872
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h
@@ -0,0 +1,2 @@
+// Sub.h
+#import "B.h"
diff --git a/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h
new file mode 100644
index 00000000000..4ab49b798c6
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h
@@ -0,0 +1 @@
+// BPriv.h
diff --git a/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h
new file mode 100644
index 00000000000..f6ac6188d65
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h
@@ -0,0 +1 @@
+#import "BPriv.h"
diff --git a/clang/test/Modules/Inputs/MainA.framework/Headers/A.h b/clang/test/Modules/Inputs/MainA.framework/Headers/A.h
new file mode 100644
index 00000000000..975f1f0437b
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Headers/A.h
@@ -0,0 +1 @@
+// A.h
diff --git a/clang/test/Modules/Inputs/MainA.framework/Headers/Main.h b/clang/test/Modules/Inputs/MainA.framework/Headers/Main.h
new file mode 100644
index 00000000000..cb8cc00a0c4
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Headers/Main.h
@@ -0,0 +1,2 @@
+// Main.h
+#import "A.h"
diff --git a/clang/test/Modules/Inputs/MainA.framework/Modules/module.modulemap b/clang/test/Modules/Inputs/MainA.framework/Modules/module.modulemap
new file mode 100644
index 00000000000..4b0b5e95538
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Modules/module.modulemap
@@ -0,0 +1,12 @@
+framework module MainA {
+ umbrella header "Main.h"
+
+ module * { export * }
+ export *
+
+ framework module Sub {
+ umbrella header "Sub.h"
+ module * { export * }
+ export *
+ }
+}
diff --git a/clang/test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap b/clang/test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap
new file mode 100644
index 00000000000..a8dc5c2be5f
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap
@@ -0,0 +1,12 @@
+framework module MainA_Private {
+ umbrella header "MainPriv.h"
+
+ module * { export * }
+ export *
+
+ explicit framework module Sub {
+ umbrella header "SubPriv.h"
+ module * { export * }
+ export *
+ }
+}
diff --git a/clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h b/clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h
new file mode 100644
index 00000000000..6ac683c39c5
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h
@@ -0,0 +1 @@
+// APriv.h
diff --git a/clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/MainPriv.h b/clang/test/Modules/Inputs/MainA.framework/PrivateHeaders/MainPriv.h
new file mode 100644
index 00000000000..68103017ad0
--- /dev/null
+++ b/clang/test/Modules/Inputs/MainA.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
index c5e82ac70da..5720a73f9be 100644
--- a/clang/test/Modules/find-privateheaders.m
+++ b/clang/test/Modules/find-privateheaders.m
@@ -1,2 +1,13 @@
-// RUN: %clang_cc1 -fmodules -fsyntax-only -F%S/Inputs %s
+// RUN: rm -rf %t.cache
+// RUN: %clang_cc1 -fmodules -fsyntax-only -F%S/Inputs -fimplicit-module-maps \
+// RUN: -fmodules-cache-path=%t.cache -Wno-private-module -DBUILD_PUBLIC -verify %s
+// RUN: rm -rf %t.cache
+// RUN: %clang_cc1 -fmodules -fsyntax-only -F%S/Inputs -fimplicit-module-maps \
+// RUN: -fmodules-cache-path=%t.cache -Wno-private-module -verify %s
+//expected-no-diagnostics
+
+#ifdef BUILD_PUBLIC
#import "Main/Main.h"
+#else
+#import "MainA/MainPriv.h"
+#endif
OpenPOWER on IntegriCloud