Add some safety checks in a couple of SourceManager functions.

This is to address crash in rdar://13932308

llvm-svn: 182681
This commit is contained in:
Argyrios Kyrtzidis 2013-05-24 22:24:04 +00:00
parent df1ecbd734
commit 5dca864366
1 changed files with 14 additions and 5 deletions

View File

@ -1958,6 +1958,9 @@ SourceManager::getMacroArgExpandedLocation(SourceLocation Loc) const {
std::pair<FileID, unsigned>
SourceManager::getDecomposedIncludedLoc(FileID FID) const {
if (FID.isInvalid())
return std::make_pair(FileID(), 0);
// Uses IncludedLocMap to retrieve/cache the decomposed loc.
typedef std::pair<FileID, unsigned> DecompTy;
@ -1969,11 +1972,14 @@ SourceManager::getDecomposedIncludedLoc(FileID FID) const {
return DecompLoc; // already in map.
SourceLocation UpperLoc;
const SrcMgr::SLocEntry &Entry = getSLocEntry(FID);
if (Entry.isExpansion())
UpperLoc = Entry.getExpansion().getExpansionLocStart();
else
UpperLoc = Entry.getFile().getIncludeLoc();
bool Invalid = false;
const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
if (!Invalid) {
if (Entry.isExpansion())
UpperLoc = Entry.getExpansion().getExpansionLocStart();
else
UpperLoc = Entry.getFile().getIncludeLoc();
}
if (UpperLoc.isValid())
DecompLoc = getDecomposedLoc(UpperLoc);
@ -2033,6 +2039,9 @@ bool SourceManager::isBeforeInTranslationUnit(SourceLocation LHS,
std::pair<FileID, unsigned> LOffs = getDecomposedLoc(LHS);
std::pair<FileID, unsigned> ROffs = getDecomposedLoc(RHS);
if (LOffs.first.isInvalid() || ROffs.first.isInvalid())
return false;
// If the source locations are in the same file, just compare offsets.
if (LOffs.first == ROffs.first)
return LOffs.second < ROffs.second;