From 09cf90f6d6d87c32f0611b4d6ca563ed1ab05c15 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 25 Jan 2008 00:00:30 +0000 Subject: [PATCH] Change the location we return for the EOF token to actually be on the last line of the file, in the common case where a file ends with a newline. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46335 91177308-0d34-0410-b5e6-96231b3b80d8 --- Lex/Preprocessor.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Lex/Preprocessor.cpp b/Lex/Preprocessor.cpp index d831093268..34b5fe2183 100644 --- a/Lex/Preprocessor.cpp +++ b/Lex/Preprocessor.cpp @@ -1296,10 +1296,26 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) { // Client should lex another token. return false; } + + // If the file ends with a newline, form the EOF token on the newline itself, + // rather than "on the line following it", which doesn't exist. This makes + // diagnostics relating to the end of file include the last file that the user + // actually typed, which is goodness. + const char *EndPos = CurLexer->BufferEnd; + if (EndPos != CurLexer->BufferStart && + (EndPos[-1] == '\n' || EndPos[-1] == '\r')) { + --EndPos; + + // Handle \n\r and \r\n: + if (EndPos != CurLexer->BufferStart && + (EndPos[-1] == '\n' || EndPos[-1] == '\r') && + EndPos[-1] != EndPos[0]) + --EndPos; + } Result.startToken(); - CurLexer->BufferPtr = CurLexer->BufferEnd; - CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd); + CurLexer->BufferPtr = EndPos; + CurLexer->FormTokenWithChars(Result, EndPos); Result.setKind(tok::eof); // We're done with the #included file. -- 2.50.1