From 993055f860b4c65998394044495dc408d51214ee Mon Sep 17 00:00:00 2001 From: Ben Langmuir Date: Fri, 18 Apr 2014 23:51:00 +0000 Subject: [PATCH] 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 --- clang/include/clang/Basic/Module.h | 2 +- clang/lib/Basic/Module.cpp | 7 ++++--- clang/test/Modules/Inputs/submodules/module.map | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/Module.h b/clang/include/clang/Basic/Module.h index 98f86df6d561..92de93a4d462 100644 --- a/clang/include/clang/Basic/Module.h +++ b/clang/include/clang/Basic/Module.h @@ -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. /// diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 6f29fae03a51..64013bd6bdd8 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -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) { diff --git a/clang/test/Modules/Inputs/submodules/module.map b/clang/test/Modules/Inputs/submodules/module.map index 8677ea0c80b7..27c1ee4c615e 100644 --- a/clang/test/Modules/Inputs/submodules/module.map +++ b/clang/test/Modules/Inputs/submodules/module.map @@ -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 { } }