diff options
author | Mark Doffman <mark.doffman@codethink.co.uk> | 2014-12-04 16:09:29 +0000 |
---|---|---|
committer | Mark Doffman <mark.doffman@codethink.co.uk> | 2014-12-04 16:09:29 +0000 |
commit | 7118740b5c5c8daeb09db7b7e4302d50853573ac (patch) | |
tree | 0e5cc84e79b7badb1949bc322fb52ebfacffdac7 | |
parent | 6052953bdf7c7a9542042212c235ae9d404eef02 (diff) | |
download | flang-7118740b5c5c8daeb09db7b7e4302d50853573ac.tar.gz |
Fix include file buffer ID breakage.
Broken in llvm 3.6 update. Was using internal
properties of SourceManger presuming sequential buffer ID's.
-rw-r--r-- | include/flang/Parse/Parser.h | 2 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 15 |
2 files changed, 9 insertions, 8 deletions
diff --git a/include/flang/Parse/Parser.h b/include/flang/Parse/Parser.h index f94b8b83ef..f6f922b192 100644 --- a/include/flang/Parse/Parser.h +++ b/include/flang/Parse/Parser.h @@ -79,7 +79,7 @@ private: /// This is the current buffer index we're lexing from as managed by the /// SourceMgr object. - int CurBuffer; + std::vector<int> CurBufferIndex; ASTContext &Context; diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 5d6c6930e7..bb48e7ff18 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -60,11 +60,12 @@ void PrettyStackTraceParserEntry::print(llvm::raw_ostream &OS) const { Parser::Parser(llvm::SourceMgr &SM, const LangOptions &Opts, DiagnosticsEngine &D, Sema &actions) : TheLexer(SM, Opts, D), Features(Opts), CrashInfo(*this), SrcMgr(SM), - CurBuffer(0), Context(actions.Context), Diag(D), Actions(actions), + Context(actions.Context), Diag(D), Actions(actions), Identifiers(Opts), DontResolveIdentifiers(false), DontResolveIdentifiersInSubExpressions(false), LexFORMATTokens(false), StmtConstructName(SourceLocation(),nullptr) { - getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)); + CurBufferIndex.push_back(SrcMgr.getMainFileID()); + getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBufferIndex.back())); Tok.startToken(); NextTok.startToken(); @@ -80,18 +81,18 @@ bool Parser::EnterIncludeFile(const std::string &Filename) { if (NewBuf == -1) return true; - CurBuffer = NewBuf; + CurBufferIndex.push_back(NewBuf); LexerBufferContext.push_back(getLexer().getBufferPtr()); - getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)); + getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBufferIndex.back())); Diag.getClient()->BeginSourceFile(Features, &TheLexer); return false; } bool Parser::LeaveIncludeFile() { - if(CurBuffer == 0) return true;//No files included. + if(CurBufferIndex.size() == 1) return true;//No files included. Diag.getClient()->EndSourceFile(); - --CurBuffer; - getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBuffer), + CurBufferIndex.pop_back(); + getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBufferIndex.back()), LexerBufferContext.back()); LexerBufferContext.pop_back(); return false; |