Fix a hole with nested unavailable submodules from r206664

If a module doesn't meet a requirement, neither do its submodules. If we
don't propogate that, we might think it's an error to be missing a
header in one of those submodules.

llvm-svn: 206673
This commit is contained in:
Ben Langmuir 2014-04-18 23:51:00 +00:00
parent 4bc13f6b47
commit 993055f860
3 changed files with 6 additions and 4 deletions

View File

@ -413,7 +413,7 @@ public:
const TargetInfo &Target);
/// \brief Mark this module and all of its submodules as unavailable.
void markUnavailable();
void markUnavailable(bool MissingRequirement = false);
/// \brief Find the submodule with the given name.
///

View File

@ -39,6 +39,7 @@ Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
IsSystem = true;
if (Parent->IsExternC)
IsExternC = true;
IsMissingRequirement = Parent->IsMissingRequirement;
Parent->SubModuleIndex[Name] = Parent->SubModules.size();
Parent->SubModules.push_back(this);
@ -160,11 +161,10 @@ void Module::addRequirement(StringRef Feature, bool RequiredState,
if (hasFeature(Feature, LangOpts, Target) == RequiredState)
return;
IsMissingRequirement = true;
markUnavailable();
markUnavailable(/*MissingRequirement*/true);
}
void Module::markUnavailable() {
void Module::markUnavailable(bool MissingRequirement) {
if (!IsAvailable)
return;
@ -178,6 +178,7 @@ void Module::markUnavailable() {
continue;
Current->IsAvailable = false;
Current->IsMissingRequirement |= MissingRequirement;
for (submodule_iterator Sub = Current->submodule_begin(),
SubEnd = Current->submodule_end();
Sub != SubEnd; ++Sub) {

View File

@ -20,6 +20,7 @@ module missing_unavailable_headers {
module missing {
requires !objc
header "missing.h"
module also_missing { header "also_missing.h" }
}
module not_missing { }
}