]> granicus.if.org Git - clang/commitdiff
Change the location we return for the EOF token to actually be on the last
authorChris Lattner <sabre@nondot.org>
Fri, 25 Jan 2008 00:00:30 +0000 (00:00 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 25 Jan 2008 00:00:30 +0000 (00:00 +0000)
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

index d8310932687247b43c25169c916a638155e2c930..34b5fe21833dc62c81ae2241052d22f4cf702154 100644 (file)
@@ -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.