]> granicus.if.org Git - clang/commitdiff
Fix a hole with nested unavailable submodules from r206664
authorBen Langmuir <blangmuir@apple.com>
Fri, 18 Apr 2014 23:51:00 +0000 (23:51 +0000)
committerBen Langmuir <blangmuir@apple.com>
Fri, 18 Apr 2014 23:51:00 +0000 (23:51 +0000)
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.

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

include/clang/Basic/Module.h
lib/Basic/Module.cpp
test/Modules/Inputs/submodules/module.map

index 98f86df6d561e54fe08105afe770498f47e12a82..92de93a4d462c2b1fed94a73acb09d52a878f133 100644 (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.
   ///
index 6f29fae03a51b530f2bddb0820e276bd0c113af0..64013bd6bdd87ee0ccd14d0118c4979ab895738c 100644 (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) {
index 8677ea0c80b7f8706180b54308e67776325c63fe..27c1ee4c615e69f15fe67f48e0886a84c00d569c 100644 (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 { }
 }