diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-02-27 02:42:25 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-02-27 02:42:25 +0000 | 
| commit | b8b9f28e24370d2866bd401a308ebe4c93c02178 (patch) | |
| tree | 97278259a710061a5d338db6aee48a834c76d689 /clang/lib | |
| parent | af11dcf348db257e60c633e6bd2aba9df7e63653 (diff) | |
| download | bcm5719-llvm-b8b9f28e24370d2866bd401a308ebe4c93c02178.tar.gz bcm5719-llvm-b8b9f28e24370d2866bd401a308ebe4c93c02178.zip  | |
Robustify SourceManager::getLocation(), so that it returns an
end-of-line source location when given a column number beyond the
length of the line, or an end-of-file source location when given a
line number beyond the length of the file. Previously, we would return
an invalid location.
llvm-svn: 97299
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Basic/SourceManager.cpp | 32 | 
1 files changed, 18 insertions, 14 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index b91671ad17b..0c22de7bddb 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -980,20 +980,6 @@ SourceLocation SourceManager::getLocation(const FileEntry *SourceFile,    if (Content->SourceLineCache == 0)      ComputeLineNumbers(Content, ContentCacheAlloc); -  if (Line > Content->NumLines) -    return SourceLocation(); - -  unsigned FilePos = Content->SourceLineCache[Line - 1]; -  const char *Buf = Content->getBuffer()->getBufferStart() + FilePos; -  unsigned BufLength = Content->getBuffer()->getBufferEnd() - Buf; -  unsigned i = 0; - -  // Check that the given column is valid. -  while (i < BufLength-1 && i < Col-1 && Buf[i] != '\n' && Buf[i] != '\r') -    ++i; -  if (i < Col-1) -    return SourceLocation(); -    // Find the first file ID that corresponds to the given file.    FileID FirstFID; @@ -1020,6 +1006,24 @@ SourceLocation SourceManager::getLocation(const FileEntry *SourceFile,    if (FirstFID.isInvalid())      return SourceLocation(); +  if (Line > Content->NumLines) { +    unsigned Size = Content->getBuffer()->getBufferSize(); +    if (Size > 0) +      --Size; +    return getLocForStartOfFile(FirstFID).getFileLocWithOffset(Size); +  } + +  unsigned FilePos = Content->SourceLineCache[Line - 1]; +  const char *Buf = Content->getBuffer()->getBufferStart() + FilePos; +  unsigned BufLength = Content->getBuffer()->getBufferEnd() - Buf; +  unsigned i = 0; + +  // Check that the given column is valid. +  while (i < BufLength-1 && i < Col-1 && Buf[i] != '\n' && Buf[i] != '\r') +    ++i; +  if (i < Col-1) +    return getLocForStartOfFile(FirstFID).getFileLocWithOffset(FilePos + i); +    return getLocForStartOfFile(FirstFID).getFileLocWithOffset(FilePos + Col - 1);  }  | 

