forked from OSchip/llvm-project
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:
parent
df1ecbd734
commit
5dca864366
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue