Author: benlangmuir Date: Mon Jul 13 14:48:52 2015 New Revision: 242055 URL: http://llvm.org/viewvc/llvm-project?rev=242055&view=rev Log: [Modules] Allow missing header before a missing requirement
And make the module unavailable without breaking any parent modules. If there's a missing requirement after we've already seen a missing header, still update the IsMissingRequiement bit correctly. Also, diagnose missing requirements before missing headers, since the existence of the header is moot if there are missing requirements. Modified: cfe/trunk/lib/Basic/Module.cpp cfe/trunk/test/Modules/Inputs/module.map cfe/trunk/test/Modules/requires.m Modified: cfe/trunk/lib/Basic/Module.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=242055&r1=242054&r2=242055&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Module.cpp (original) +++ cfe/trunk/lib/Basic/Module.cpp Mon Jul 13 14:48:52 2015 @@ -82,10 +82,6 @@ bool Module::isAvailable(const LangOptio return true; for (const Module *Current = this; Current; Current = Current->Parent) { - if (!Current->MissingHeaders.empty()) { - MissingHeader = Current->MissingHeaders.front(); - return false; - } for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) { if (hasFeature(Current->Requirements[I].first, LangOpts, Target) != Current->Requirements[I].second) { @@ -93,6 +89,10 @@ bool Module::isAvailable(const LangOptio return false; } } + if (!Current->MissingHeaders.empty()) { + MissingHeader = Current->MissingHeaders.front(); + return false; + } } llvm_unreachable("could not find a reason why module is unavailable"); @@ -184,7 +184,11 @@ void Module::addRequirement(StringRef Fe } void Module::markUnavailable(bool MissingRequirement) { - if (!IsAvailable) + auto needUpdate = [MissingRequirement](Module *M) { + return M->IsAvailable || (!M->IsMissingRequirement && MissingRequirement); + }; + + if (!needUpdate(this)) return; SmallVector<Module *, 2> Stack; @@ -193,7 +197,7 @@ void Module::markUnavailable(bool Missin Module *Current = Stack.back(); Stack.pop_back(); - if (!Current->IsAvailable) + if (!needUpdate(Current)) continue; Current->IsAvailable = false; @@ -201,7 +205,7 @@ void Module::markUnavailable(bool Missin for (submodule_iterator Sub = Current->submodule_begin(), SubEnd = Current->submodule_end(); Sub != SubEnd; ++Sub) { - if ((*Sub)->IsAvailable) + if (needUpdate(*Sub)) Stack.push_back(*Sub); } } Modified: cfe/trunk/test/Modules/Inputs/module.map URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=242055&r1=242054&r2=242055&view=diff ============================================================================== --- cfe/trunk/test/Modules/Inputs/module.map (original) +++ cfe/trunk/test/Modules/Inputs/module.map Mon Jul 13 14:48:52 2015 @@ -336,3 +336,14 @@ module ImportNameInDir { header "ImportNameInDir.h" export * } + +module RequiresWithMissingHeader { + module HeaderBefore { + header "RequiresWithMissingHeader-Missing1.h" + requires missing + } + module HeaderAfter { + requires missing + header "RequiresWithMissingHeader-Missing2.h" + } +} Modified: cfe/trunk/test/Modules/requires.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/requires.m?rev=242055&r1=242054&r2=242055&view=diff ============================================================================== --- cfe/trunk/test/Modules/requires.m (original) +++ cfe/trunk/test/Modules/requires.m Mon Jul 13 14:48:52 2015 @@ -6,3 +6,7 @@ @import DependsOnModule.NotObjC; // expected-error{{module 'DependsOnModule.NotObjC' is incompatible with feature 'objc'}} @import DependsOnModule.CustomReq1; // OK @import DependsOnModule.CustomReq2; // expected-error{{module 'DependsOnModule.CustomReq2' requires feature 'custom_req2'}} + +@import RequiresWithMissingHeader; // OK +@import RequiresWithMissingHeader.HeaderBefore; // expected-error{{module 'RequiresWithMissingHeader.HeaderBefore' requires feature 'missing'}} +@import RequiresWithMissingHeader.HeaderAfter; // expected-error{{module 'RequiresWithMissingHeader.HeaderAfter' requires feature 'missing'}} _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits