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 | |
| 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')
| -rw-r--r-- | clang/lib/Basic/SourceManager.cpp | 32 | ||||
| -rw-r--r-- | clang/test/Index/annotate-tokens.c | 3 | 
2 files changed, 20 insertions, 15 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);  } diff --git a/clang/test/Index/annotate-tokens.c b/clang/test/Index/annotate-tokens.c index ef0069c8879..7fbf9cc4fb6 100644 --- a/clang/test/Index/annotate-tokens.c +++ b/clang/test/Index/annotate-tokens.c @@ -61,4 +61,5 @@ void f(void *ptr) {  // CHECK: Literal: ""Hello"" [9:24 - 9:31]  // CHECK: Punctuation: ";" [9:31 - 9:32]  // CHECK: Punctuation: "}" [10:1 - 10:2] - +// RUN: c-index-test -test-annotate-tokens=%s:4:1:165:32 %s | FileCheck %s +// RUN: c-index-test -test-annotate-tokens=%s:4:1:165:38 %s | FileCheck %s  | 

