From: Argyrios Kyrtzidis Date: Tue, 7 May 2013 04:29:22 +0000 (+0000) Subject: Have SourceManager::getLocForEndOfFile() point at the "EOF" location of the FileID. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b18840ddd6aa472bbf78ab9de59159eb128fb6a9;p=clang Have SourceManager::getLocForEndOfFile() point at the "EOF" location of the FileID. This fixes a crash due to SourceManager::getLocForEndOfFile() returning an off-by-one location when the the FileID is for an empty file. rdar://13803893 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181285 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index f82b196929..eccbf1ede7 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -1005,7 +1005,7 @@ public: return SourceLocation(); unsigned FileOffset = Entry.getOffset(); - return SourceLocation::getFileLoc(FileOffset + getFileIDSize(FID) - 1); + return SourceLocation::getFileLoc(FileOffset + getFileIDSize(FID)); } /// \brief Returns the include location if \p FID is a \#include'd file diff --git a/lib/Rewrite/Frontend/InclusionRewriter.cpp b/lib/Rewrite/Frontend/InclusionRewriter.cpp index 878be84224..9e4bb3c89b 100644 --- a/lib/Rewrite/Frontend/InclusionRewriter.cpp +++ b/lib/Rewrite/Frontend/InclusionRewriter.cpp @@ -464,7 +464,7 @@ bool InclusionRewriter::Process(FileID FileId, RawLex.LexFromRawLexer(RawToken); } OutputContentUpTo(FromFile, NextToWrite, - SM.getFileOffset(SM.getLocForEndOfFile(FileId)) + 1, EOL, Line, + SM.getFileOffset(SM.getLocForEndOfFile(FileId)), EOL, Line, /*EnsureNewline*/true); return true; } diff --git a/test/Index/Inputs/empty.h b/test/Index/Inputs/empty.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Index/file-includes.c b/test/Index/file-includes.c index 2dfced0c0c..ac3d568dc5 100644 --- a/test/Index/file-includes.c +++ b/test/Index/file-includes.c @@ -22,3 +22,6 @@ int LocalVar; // TOP: inclusion directive=targeted-nested1.h ({{.*[/\\]}}test{{[/\\]}}Index{{[/\\]}}targeted-nested1.h) =[5:1 - 5:2] // TOP: inclusion directive=targeted-fields.h ({{.*[/\\]}}test{{[/\\]}}Index{{[/\\]}}targeted-fields.h) =[16:1 - 16:2] + +// rdar://13803893 +// RUN: c-index-test -file-includes-in=%S/Inputs/empty.h %S/Inputs/empty.h