Prevent lookup of subframework modules by name without parent framework

We were 'allowing' the following import
@import Sub;

where Sub is a subframework of Foo and we had a -F path inside
Foo.framework/Frameworks and no module map file for Sub. This would
later hit assertion failures in debug builds.

Now we should correctly diagnose this as a module not found error.

llvm-svn: 204368
This commit is contained in:
Ben Langmuir 2014-03-20 18:27:26 +00:00
parent e6c97e01a5
commit c3ea5654f9
2 changed files with 7 additions and 23 deletions

View File

@ -1223,30 +1223,9 @@ Module *HeaderSearch::loadFrameworkModule(StringRef Name,
return ModMap.findModule(Name);
}
// Figure out the top-level framework directory and the submodule path from
// that top-level framework to the requested framework.
SmallVector<std::string, 2> SubmodulePath;
SubmodulePath.push_back(Name);
const DirectoryEntry *TopFrameworkDir
= ::getTopFrameworkDir(FileMgr, Dir->getName(), SubmodulePath);
// Try to infer a module map from the top-level framework directory.
Module *Result = ModMap.inferFrameworkModule(SubmodulePath.back(),
TopFrameworkDir,
IsSystem,
/*Parent=*/0);
if (!Result)
return 0;
// Follow the submodule path to find the requested (sub)framework module
// within the top-level framework module.
SubmodulePath.pop_back();
while (!SubmodulePath.empty() && Result) {
Result = ModMap.lookupModuleQualified(SubmodulePath.back(), Result);
SubmodulePath.pop_back();
}
return Result;
// Try to infer a module map from the framework directory.
return ModMap.inferFrameworkModule(Name, Dir, IsSystem, /*Parent=*/0);
}

View File

@ -0,0 +1,5 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -F %S/Inputs -F %S/Inputs/DependsOnModule.framework/Frameworks %s -verify
@import DependsOnModule;
@import SubFramework; // expected-error{{module 'SubFramework' not found}}