<div dir="ltr">Thanks for looking into this! I've been a bit swamped this week but I promise I'll circle back around to that patch (hopefully next week).<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 13, 2015 at 12:48 PM, Ben Langmuir <span dir="ltr"><<a href="mailto:blangmuir@apple.com" target="_blank">blangmuir@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: benlangmuir<br>
Date: Mon Jul 13 14:48:52 2015<br>
New Revision: 242055<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D242055-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=LEzL4RPKQ-Rwf2-BxVfvdbC_c--YY9IGshEQcw6qPJs&s=n6JNer51Z5i15i4gO1JHUI85WLBhluQ97EcpNFaULig&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=242055&view=rev</a><br>
Log:<br>
[Modules] Allow missing header before a missing requirement<br>
<br>
And make the module unavailable without breaking any parent modules.<br>
<br>
If there's a missing requirement after we've already seen a missing<br>
header, still update the IsMissingRequiement bit correctly.  Also,<br>
diagnose missing requirements before missing headers, since the<br>
existence of the header is moot if there are missing requirements.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Basic/Module.cpp<br>
    cfe/trunk/test/Modules/Inputs/module.map<br>
    cfe/trunk/test/Modules/requires.m<br>
<br>
Modified: cfe/trunk/lib/Basic/Module.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_Module.cpp-3Frev-3D242055-26r1-3D242054-26r2-3D242055-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=LEzL4RPKQ-Rwf2-BxVfvdbC_c--YY9IGshEQcw6qPJs&s=F1aa_gnvk8Uk0LnFW1Z3IlmEAre1WQPbkrygQYQ2Q04&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=242055&r1=242054&r2=242055&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/Module.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Module.cpp Mon Jul 13 14:48:52 2015<br>
@@ -82,10 +82,6 @@ bool Module::isAvailable(const LangOptio<br>
     return true;<br>
<br>
   for (const Module *Current = this; Current; Current = Current->Parent) {<br>
-    if (!Current->MissingHeaders.empty()) {<br>
-      MissingHeader = Current->MissingHeaders.front();<br>
-      return false;<br>
-    }<br>
     for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) {<br>
       if (hasFeature(Current->Requirements[I].first, LangOpts, Target) !=<br>
               Current->Requirements[I].second) {<br>
@@ -93,6 +89,10 @@ bool Module::isAvailable(const LangOptio<br>
         return false;<br>
       }<br>
     }<br>
+    if (!Current->MissingHeaders.empty()) {<br>
+      MissingHeader = Current->MissingHeaders.front();<br>
+      return false;<br>
+    }<br>
   }<br>
<br>
   llvm_unreachable("could not find a reason why module is unavailable");<br>
@@ -184,7 +184,11 @@ void Module::addRequirement(StringRef Fe<br>
 }<br>
<br>
 void Module::markUnavailable(bool MissingRequirement) {<br>
-  if (!IsAvailable)<br>
+  auto needUpdate = [MissingRequirement](Module *M) {<br>
+    return M->IsAvailable || (!M->IsMissingRequirement && MissingRequirement);<br>
+  };<br>
+<br>
+  if (!needUpdate(this))<br>
     return;<br>
<br>
   SmallVector<Module *, 2> Stack;<br>
@@ -193,7 +197,7 @@ void Module::markUnavailable(bool Missin<br>
     Module *Current = Stack.back();<br>
     Stack.pop_back();<br>
<br>
-    if (!Current->IsAvailable)<br>
+    if (!needUpdate(Current))<br>
       continue;<br>
<br>
     Current->IsAvailable = false;<br>
@@ -201,7 +205,7 @@ void Module::markUnavailable(bool Missin<br>
     for (submodule_iterator Sub = Current->submodule_begin(),<br>
                          SubEnd = Current->submodule_end();<br>
          Sub != SubEnd; ++Sub) {<br>
-      if ((*Sub)->IsAvailable)<br>
+      if (needUpdate(*Sub))<br>
         Stack.push_back(*Sub);<br>
     }<br>
   }<br>
<br>
Modified: cfe/trunk/test/Modules/Inputs/module.map<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_Inputs_module.map-3Frev-3D242055-26r1-3D242054-26r2-3D242055-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=LEzL4RPKQ-Rwf2-BxVfvdbC_c--YY9IGshEQcw6qPJs&s=4gzJi_OX-nRzmuojyDSLanf1niYv5_c1y5gOj-Vvt38&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=242055&r1=242054&r2=242055&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/module.map (original)<br>
+++ cfe/trunk/test/Modules/Inputs/module.map Mon Jul 13 14:48:52 2015<br>
@@ -336,3 +336,14 @@ module ImportNameInDir {<br>
   header "ImportNameInDir.h"<br>
   export *<br>
 }<br>
+<br>
+module RequiresWithMissingHeader {<br>
+  module HeaderBefore {<br>
+    header "RequiresWithMissingHeader-Missing1.h"<br>
+    requires missing<br>
+  }<br>
+  module HeaderAfter {<br>
+    requires missing<br>
+    header "RequiresWithMissingHeader-Missing2.h"<br>
+  }<br>
+}<br>
<br>
Modified: cfe/trunk/test/Modules/requires.m<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_requires.m-3Frev-3D242055-26r1-3D242054-26r2-3D242055-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=LEzL4RPKQ-Rwf2-BxVfvdbC_c--YY9IGshEQcw6qPJs&s=Vf6y5-IGQvOPHy0D8C2L-lXlSZuZs4y_WTWwww24TA4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/requires.m?rev=242055&r1=242054&r2=242055&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/requires.m (original)<br>
+++ cfe/trunk/test/Modules/requires.m Mon Jul 13 14:48:52 2015<br>
@@ -6,3 +6,7 @@<br>
 @import DependsOnModule.NotObjC; // expected-error{{module 'DependsOnModule.NotObjC' is incompatible with feature 'objc'}}<br>
 @import DependsOnModule.CustomReq1; // OK<br>
 @import DependsOnModule.CustomReq2; // expected-error{{module 'DependsOnModule.CustomReq2' requires feature 'custom_req2'}}<br>
+<br>
+@import RequiresWithMissingHeader; // OK<br>
+@import RequiresWithMissingHeader.HeaderBefore; // expected-error{{module 'RequiresWithMissingHeader.HeaderBefore' requires feature 'missing'}}<br>
+@import RequiresWithMissingHeader.HeaderAfter; // expected-error{{module 'RequiresWithMissingHeader.HeaderAfter' requires feature 'missing'}}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>