]> granicus.if.org Git - clang/commitdiff
[Modules] Find PrivateHeaders when looking into subframeworks
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 21 Mar 2017 16:43:51 +0000 (16:43 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 21 Mar 2017 16:43:51 +0000 (16:43 +0000)
Fix the current parsing of subframeworks in modulemaps to lookup for
headers based on whether they are frameworks.

rdar://problem/30563982

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

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

index 384e5707dca854559e9709cc6014b5468ad5c634..61ad5948cd50d5c1701b3fc576649878ca369fcd 100644 (file)
@@ -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/test/Modules/Inputs/Main.framework/Frameworks/Sub.framework/Headers/B.h b/test/Modules/Inputs/Main.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/Main.framework/Frameworks/Sub.framework/Headers/Sub.h b/test/Modules/Inputs/Main.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/Main.framework/Frameworks/Sub.framework/PrivateHeaders/BPriv.h b/test/Modules/Inputs/Main.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/Main.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h b/test/Modules/Inputs/Main.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/Main.framework/Headers/A.h b/test/Modules/Inputs/Main.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/Main.framework/Headers/Main.h b/test/Modules/Inputs/Main.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/Main.framework/Modules/module.modulemap b/test/Modules/Inputs/Main.framework/Modules/module.modulemap
new file mode 100644 (file)
index 0000000..9fab5d3
--- /dev/null
@@ -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/test/Modules/Inputs/Main.framework/Modules/module.private.modulemap b/test/Modules/Inputs/Main.framework/Modules/module.private.modulemap
new file mode 100644 (file)
index 0000000..54e8be7
--- /dev/null
@@ -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/test/Modules/Inputs/Main.framework/PrivateHeaders/APriv.h b/test/Modules/Inputs/Main.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/Main.framework/PrivateHeaders/MainPriv.h b/test/Modules/Inputs/Main.framework/PrivateHeaders/MainPriv.h
new file mode 100644 (file)
index 0000000..6810301
--- /dev/null
@@ -0,0 +1 @@
+#import "APriv.h"
diff --git a/test/Modules/find-privateheaders.m b/test/Modules/find-privateheaders.m
new file mode 100644 (file)
index 0000000..c5e82ac
--- /dev/null
@@ -0,0 +1,2 @@
+// RUN: %clang_cc1 -fmodules -fsyntax-only -F%S/Inputs %s
+#import "Main/Main.h"