diff options
author | Chris Lattner <sabre@nondot.org> | 2007-12-02 01:13:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-12-02 01:13:47 +0000 |
commit | 26de4655a38b899e0f0dcef4175032175854d1cf (patch) | |
tree | 25e3041cf87bb739e0aa0b5d680d3f75bb89aa3f /Driver/RewriteTest.cpp | |
parent | 182745ae7892bca0842d9c023370ade5f8d1c6e8 (diff) |
fix a crash when the rewriter would scan off the beginning of the file.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44499 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Driver/RewriteTest.cpp')
-rw-r--r-- | Driver/RewriteTest.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index 2073f7e391..b199f7151f 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -18,9 +18,10 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/Diagnostic.h" +#include "clang/Lex/Lexer.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/SmallPtrSet.h" -#include "clang/Lex/Lexer.h" +#include "llvm/Support/MemoryBuffer.h" #include <sstream> using namespace clang; using llvm::utostr; @@ -32,6 +33,7 @@ namespace { ASTContext *Context; SourceManager *SM; unsigned MainFileID; + const char *MainFileStart, *MainFileEnd; SourceLocation LastIncLoc; llvm::SmallVector<ObjcImplementationDecl *, 8> ClassImplementation; llvm::SmallVector<ObjcCategoryImplDecl *, 8> CategoryImplementation; @@ -58,7 +60,6 @@ namespace { void Initialize(ASTContext &context, unsigned mainFileID) { Context = &context; SM = &Context->SourceMgr; - MainFileID = mainFileID; MsgSendFunctionDecl = 0; MsgSendSuperFunctionDecl = 0; GetClassFunctionDecl = 0; @@ -69,6 +70,13 @@ namespace { CurMethodDecl = 0; SuperStructDecl = 0; + // Get the ID and start/end of the main file. + MainFileID = mainFileID; + const llvm::MemoryBuffer *MainBuf = SM->getBuffer(MainFileID); + MainFileStart = MainBuf->getBufferStart(); + MainFileEnd = MainBuf->getBufferEnd(); + + Rewrite.setSourceMgr(Context->SourceMgr); // declaring objc_selector outside the parameter list removes a silly // scope related warning... @@ -952,7 +960,7 @@ void RewriteTest::RewriteObjcQualifiedInterfaceTypes( const char *endBuf = SM->getCharacterData(Loc); const char *startBuf = endBuf; - while (*startBuf != ';') + while (*startBuf != ';' && startBuf != MainFileStart) startBuf--; // scan backward (from the decl location) for return type. const char *startRef = 0, *endRef = 0; if (scanForProtocolRefs(startBuf, endBuf, startRef, endRef)) { |