diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-06-17 10:52:22 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-06-17 10:52:22 +0000 |
commit | 7558cd00a5ac620990174f3cba86aea4bd9a000a (patch) | |
tree | 553b1e9eb04500a025c85a412b24e5b5292e9118 /lib/Parse/ParseCXXInlineMethods.cpp | |
parent | 36d36806f1972f7ec1d2a3f59155187278c56508 (diff) |
Make sure the caching mechanism in Parser::ParseLexedMethodDefs is robust against the parser reading too few tokens.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106214 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseCXXInlineMethods.cpp')
-rw-r--r-- | lib/Parse/ParseCXXInlineMethods.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp index fd231901a4..e765a06087 100644 --- a/lib/Parse/ParseCXXInlineMethods.cpp +++ b/lib/Parse/ParseCXXInlineMethods.cpp @@ -216,8 +216,10 @@ void Parser::ParseLexedMethodDefs(ParsingClass &Class) { assert(!PP.getSourceManager().isBeforeInTranslationUnit(origLoc, Tok.getLocation()) && "ParseFunctionTryBlock went over the cached tokens!"); - assert(Tok.getLocation() == origLoc && - "ParseFunctionTryBlock left tokens in the token stream!"); + // There could be leftover tokens (e.g. because of an error). + // Skip through until we reach the original token position. + while (Tok.getLocation() != origLoc) + ConsumeAnyToken(); continue; } if (Tok.is(tok::colon)) { @@ -233,8 +235,18 @@ void Parser::ParseLexedMethodDefs(ParsingClass &Class) { ParseFunctionStatementBody(LM.D); - // FIXME: We need to make sure the caching mechanism here is robust - // against the parser reading too few token + if (Tok.getLocation() != origLoc) { + // Due to parsing error, we either went over the cached tokens or + // there are still cached tokens left. If it's the latter case skip the + // leftover tokens. + // Since this is an uncommon situation that should be avoided, use the + // expensive isBeforeInTranslationUnit call. + if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(), + origLoc)) + while (Tok.getLocation() != origLoc) + ConsumeAnyToken(); + + } } for (unsigned I = 0, N = Class.NestedClasses.size(); I != N; ++I) |