]> granicus.if.org Git - clang/commitdiff
[Modules] Allow umbrella frameworks to define private submodules for subframeworks
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 9 May 2017 00:41:38 +0000 (00:41 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 9 May 2017 00:41:38 +0000 (00:41 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@302491 91177308-0d34-0410-b5e6-96231b3b80d8

12 files changed:
lib/Lex/ModuleMap.cpp
test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Headers/A.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Headers/Main.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Modules/module.modulemap [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h [new file with mode: 0644]
test/Modules/Inputs/MainA.framework/PrivateHeaders/MainPriv.h [new file with mode: 0644]
test/Modules/find-privateheaders.m

index 568894c32b9d23dcad64f58152438815a55bb7bd..6f44dc757e850932f25e754261b2a56a16b2f28a 100644 (file)
@@ -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/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h b/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/B.h
new file mode 100644 (file)
index 0000000..761540b
--- /dev/null
@@ -0,0 +1 @@
+// B.h
diff --git a/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h b/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/Headers/Sub.h
new file mode 100644 (file)
index 0000000..fd86e3c
--- /dev/null
@@ -0,0 +1,2 @@
+// Sub.h
+#import "B.h"
diff --git a/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h b/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h
new file mode 100644 (file)
index 0000000..4ab49b7
--- /dev/null
@@ -0,0 +1 @@
+// BPriv.h
diff --git a/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h b/test/Modules/Inputs/MainA.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h
new file mode 100644 (file)
index 0000000..f6ac618
--- /dev/null
@@ -0,0 +1 @@
+#import "BPriv.h"
diff --git a/test/Modules/Inputs/MainA.framework/Headers/A.h b/test/Modules/Inputs/MainA.framework/Headers/A.h
new file mode 100644 (file)
index 0000000..975f1f0
--- /dev/null
@@ -0,0 +1 @@
+// A.h
diff --git a/test/Modules/Inputs/MainA.framework/Headers/Main.h b/test/Modules/Inputs/MainA.framework/Headers/Main.h
new file mode 100644 (file)
index 0000000..cb8cc00
--- /dev/null
@@ -0,0 +1,2 @@
+// Main.h
+#import "A.h"
diff --git a/test/Modules/Inputs/MainA.framework/Modules/module.modulemap b/test/Modules/Inputs/MainA.framework/Modules/module.modulemap
new file mode 100644 (file)
index 0000000..4b0b5e9
--- /dev/null
@@ -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/test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap b/test/Modules/Inputs/MainA.framework/Modules/module.private.modulemap
new file mode 100644 (file)
index 0000000..a8dc5c2
--- /dev/null
@@ -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/test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h b/test/Modules/Inputs/MainA.framework/PrivateHeaders/APriv.h
new file mode 100644 (file)
index 0000000..6ac683c
--- /dev/null
@@ -0,0 +1 @@
+// APriv.h
diff --git a/test/Modules/Inputs/MainA.framework/PrivateHeaders/MainPriv.h b/test/Modules/Inputs/MainA.framework/PrivateHeaders/MainPriv.h
new file mode 100644 (file)
index 0000000..6810301
--- /dev/null
@@ -0,0 +1 @@
+#import "APriv.h"
index c5e82ac70da2d21694da560b7d3d964a477bfd61..5720a73f9be87552b3d41cf0a6c2a0d5b053276f 100644 (file)
@@ -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