diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Lex/PPDirectives.cpp | 23 | 
2 files changed, 27 insertions, 3 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 3825ceb0a6c..9554d3ba45a 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -320,6 +320,10 @@ void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule,  static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New,                                  const ModuleMap::KnownHeader &Old) { +  // Prefer available modules. +  if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable()) +    return true; +    // Prefer a public header over a private header.    if ((New.getRole() & ModuleMap::PrivateHeader) !=        (Old.getRole() & ModuleMap::PrivateHeader)) @@ -349,9 +353,6 @@ ModuleMap::KnownHeader ModuleMap::findModuleForHeader(const FileEntry *File) {        // Prefer a header from the current module over all others.        if (H.getModule()->getTopLevelModule() == CompilingModule)          return MakeResult(H); -      // Cannot use a module if it is unavailable. -      if (!H.getModule()->isAvailable()) -        continue;        if (!Result || isBetterKnownHeader(H, Result))          Result = H;      } diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index ce64538de41..82f94d7da4e 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -1674,6 +1674,29 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,            getLangOpts().CurrentModule &&        SuggestedModule.getModule()->getTopLevelModuleName() !=            getLangOpts().ImplementationOfModule) { + +    // If this include corresponds to a module but that module is +    // unavailable, diagnose the situation and bail out. +    if (!SuggestedModule.getModule()->isAvailable()) { +      clang::Module::Requirement Requirement; +      clang::Module::UnresolvedHeaderDirective MissingHeader; +      Module *M = SuggestedModule.getModule(); +      // Identify the cause. +      (void)M->isAvailable(getLangOpts(), getTargetInfo(), Requirement, +                           MissingHeader); +      if (MissingHeader.FileNameLoc.isValid()) { +        Diag(MissingHeader.FileNameLoc, diag::err_module_header_missing) +            << MissingHeader.IsUmbrella << MissingHeader.FileName; +      } else { +        Diag(M->DefinitionLoc, diag::err_module_unavailable) +            << M->getFullModuleName() << Requirement.second << Requirement.first; +      } +      Diag(FilenameTok.getLocation(), +           diag::note_implicit_top_level_module_import_here) +          << M->getTopLevelModuleName(); +      return; +    } +      // Compute the module access path corresponding to this module.      // FIXME: Should we have a second loadModule() overload to avoid this      // extra lookup step?  | 

