Skip to content

Commit

Permalink
[Basic] getColumnNumber returns location of CR+LF on Windows
Browse files Browse the repository at this point in the history
When fixing a Clang-Tidy bug in D31406,
reuse of FileID enabled the missing highlightRange function.
Assertion in highlightRange failed because the end-of-range column
number was 2 + the last column of a line on Windows.
This fix is required to enable D31406.

Differential Revision: https://reviews.llvm.org/D31713

llvm-svn: 299681
  • Loading branch information
chih-hung committed Apr 6, 2017
1 parent 71724f6 commit a0b99e4
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions clang/lib/Basic/SourceManager.cpp
Expand Up @@ -1136,6 +1136,7 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos,
return 1;
}

const char *Buf = MemBuf->getBufferStart();
// See if we just calculated the line number for this FilePos and can use
// that to lookup the start of the line instead of searching for it.
if (LastLineNoFileIDQuery == FID &&
Expand All @@ -1144,11 +1145,19 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos,
unsigned *SourceLineCache = LastLineNoContentCache->SourceLineCache;
unsigned LineStart = SourceLineCache[LastLineNoResult - 1];
unsigned LineEnd = SourceLineCache[LastLineNoResult];
if (FilePos >= LineStart && FilePos < LineEnd)
if (FilePos >= LineStart && FilePos < LineEnd) {
// LineEnd is the LineStart of the next line.
// A line ends with separator LF or CR+LF on Windows.
// FilePos might point to the last separator,
// but we need a column number at most 1 + the last column.
if (FilePos + 1 == LineEnd && FilePos > LineStart) {
if (Buf[FilePos - 1] == '\r' || Buf[FilePos - 1] == '\n')
--FilePos;
}
return FilePos - LineStart + 1;
}
}

const char *Buf = MemBuf->getBufferStart();
unsigned LineStart = FilePos;
while (LineStart && Buf[LineStart-1] != '\n' && Buf[LineStart-1] != '\r')
--LineStart;
Expand Down

0 comments on commit a0b99e4

Please sign in to comment.