diff options
Diffstat (limited to 'lib/Basic/SourceManager.cpp')
| -rw-r--r-- | lib/Basic/SourceManager.cpp | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 380ca373e69b..156aa0b11f7d 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -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 && @@ -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;  | 
