]> granicus.if.org Git - clang/commitdiff
When suggesting a module import for a #include or #import, suggest the
authorDouglas Gregor <dgregor@apple.com>
Tue, 6 Dec 2011 17:31:28 +0000 (17:31 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 6 Dec 2011 17:31:28 +0000 (17:31 +0000)
most specific (sub)module based on the actual file we find, rather
than always importing the top-level module. This means
that #include'ing <Foo/Blah.h> should give us the submodule Foo.Blah.

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

lib/Lex/HeaderSearch.cpp
test/Modules/auto-module-import.c

index 1d560fca024623185b568e80c141ba16196e8aab..f090e0317432033d0ece7581ab448ec734a46b91 100644 (file)
@@ -341,15 +341,12 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(
   }
 
   // Determine whether this is the module we're building or not.
-  // FIXME: Do we still need the ".." hack?
-  bool AutomaticImport = Module &&
-    !Filename.substr(SlashPos + 1).startswith("..");
-  
+  bool AutomaticImport = Module;  
   FrameworkName.append(Filename.begin()+SlashPos+1, Filename.end());
   if (const FileEntry *FE = FileMgr.getFile(FrameworkName.str(),
                                             /*openFile=*/!AutomaticImport)) {
     if (AutomaticImport)
-      *SuggestedModule = Module;
+      *SuggestedModule = HS.findModuleForHeader(FE);
     return FE;
   }
 
@@ -364,7 +361,7 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(
   const FileEntry *FE = FileMgr.getFile(FrameworkName.str(), 
                                         /*openFile=*/!AutomaticImport);
   if (FE && AutomaticImport)
-    *SuggestedModule = Module;
+    *SuggestedModule = HS.findModuleForHeader(FE);
   return FE;
 }
 
index 51e9ee2d03504cb785a2adfe2a0a03a1cfb0bba9..783b53d068d36ede1e30cc673182bc0317768371 100644 (file)
@@ -18,3 +18,14 @@ Module *mod; // expected-error{{unknown type name 'Module'}}
 Module *mod2;
 
 int getDependsOther() { return depends_on_module_other; }
+
+void testSubframeworkOther() {
+  double *sfo1 = sub_framework_other; // expected-error{{use of undeclared identifier 'sub_framework_other'}}
+}
+
+// Test header cross-subframework include pattern.
+#include <DependsOnModule/../Frameworks/SubFramework.framework/Headers/Other.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.SubFramework'}}
+
+void testSubframeworkOtherAgain() {
+  double *sfo1 = sub_framework_other;
+}