forked from OSchip/llvm-project
Remove last (unnecessary) use of mapping from SourceLocation to Module and
remove the mechanism for doing so. This mechanism was incorrect in the presence of preprocessed modules (and #pragma clang module begin/end). llvm-svn: 303469
This commit is contained in:
parent
4971ed0fea
commit
cbf7d8a65a
|
@ -507,16 +507,6 @@ public:
|
|||
/// false otherwise.
|
||||
bool resolveConflicts(Module *Mod, bool Complain);
|
||||
|
||||
/// \brief Infers the (sub)module based on the given source location and
|
||||
/// source manager.
|
||||
///
|
||||
/// \param Loc The location within the source that we are querying, along
|
||||
/// with its source manager.
|
||||
///
|
||||
/// \returns The module that owns this source location, or null if no
|
||||
/// module owns this source location.
|
||||
Module *inferModuleFromLocation(FullSourceLoc Loc);
|
||||
|
||||
/// \brief Sets the umbrella header of the given module to the given
|
||||
/// header.
|
||||
void setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader,
|
||||
|
|
|
@ -1917,14 +1917,11 @@ public:
|
|||
/// into a module, or is outside any module, returns nullptr.
|
||||
Module *getModuleForLocation(SourceLocation Loc);
|
||||
|
||||
/// \brief Find the module that contains the specified location, either
|
||||
/// directly or indirectly.
|
||||
Module *getModuleContainingLocation(SourceLocation Loc);
|
||||
|
||||
/// \brief We want to produce a diagnostic at location IncLoc concerning a
|
||||
/// missing module import.
|
||||
///
|
||||
/// \param IncLoc The location at which the missing import was detected.
|
||||
/// \param M The desired module.
|
||||
/// \param MLoc A location within the desired module at which some desired
|
||||
/// effect occurred (eg, where a desired entity was declared).
|
||||
///
|
||||
|
@ -1932,6 +1929,7 @@ public:
|
|||
/// Null if no such file could be determined or if a #include is not
|
||||
/// appropriate.
|
||||
const FileEntry *getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
|
||||
Module *M,
|
||||
SourceLocation MLoc);
|
||||
|
||||
private:
|
||||
|
|
|
@ -950,39 +950,6 @@ bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
|
|||
return !Mod->UnresolvedConflicts.empty();
|
||||
}
|
||||
|
||||
Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
|
||||
if (Loc.isInvalid())
|
||||
return nullptr;
|
||||
|
||||
if (UmbrellaDirs.empty() && Headers.empty())
|
||||
return nullptr;
|
||||
|
||||
// Use the expansion location to determine which module we're in.
|
||||
FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
|
||||
if (!ExpansionLoc.isFileID())
|
||||
return nullptr;
|
||||
|
||||
const SourceManager &SrcMgr = Loc.getManager();
|
||||
FileID ExpansionFileID = ExpansionLoc.getFileID();
|
||||
|
||||
while (const FileEntry *ExpansionFile
|
||||
= SrcMgr.getFileEntryForID(ExpansionFileID)) {
|
||||
// Find the module that owns this header (if any).
|
||||
if (Module *Mod = findModuleForHeader(ExpansionFile).getModule())
|
||||
return Mod;
|
||||
|
||||
// No module owns this header, so look up the inclusion chain to see if
|
||||
// any included header has an associated module.
|
||||
SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
|
||||
if (IncludeLoc.isInvalid())
|
||||
return nullptr;
|
||||
|
||||
ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
// Module map file parser
|
||||
//----------------------------------------------------------------------------//
|
||||
|
|
|
@ -667,24 +667,17 @@ Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
|
|||
: HeaderInfo.lookupModule(getLangOpts().CurrentModule);
|
||||
}
|
||||
|
||||
Module *Preprocessor::getModuleContainingLocation(SourceLocation Loc) {
|
||||
return HeaderInfo.getModuleMap().inferModuleFromLocation(
|
||||
FullSourceLoc(Loc, SourceMgr));
|
||||
}
|
||||
|
||||
const FileEntry *
|
||||
Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
|
||||
Module *M,
|
||||
SourceLocation Loc) {
|
||||
assert(M && "no module to include");
|
||||
|
||||
// If we have a module import syntax, we shouldn't include a header to
|
||||
// make a particular module visible.
|
||||
if (getLangOpts().ObjC2)
|
||||
return nullptr;
|
||||
|
||||
// Figure out which module we'd want to import.
|
||||
Module *M = getModuleContainingLocation(Loc);
|
||||
if (!M)
|
||||
return nullptr;
|
||||
|
||||
Module *TopM = M->getTopLevelModule();
|
||||
Module *IncM = getModuleForLocation(IncLoc);
|
||||
|
||||
|
|
|
@ -4987,8 +4987,8 @@ void Sema::diagnoseMissingImport(SourceLocation UseLoc, NamedDecl *Decl,
|
|||
|
||||
Diag(UseLoc, diag::err_module_unimported_use_multiple)
|
||||
<< (int)MIK << Decl << ModuleList;
|
||||
} else if (const FileEntry *E =
|
||||
PP.getModuleHeaderToIncludeForDiagnostics(UseLoc, DeclLoc)) {
|
||||
} else if (const FileEntry *E = PP.getModuleHeaderToIncludeForDiagnostics(
|
||||
UseLoc, Modules[0], DeclLoc)) {
|
||||
// The right way to make the declaration visible is to include a header;
|
||||
// suggest doing so.
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue