diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Lex/PPCaching.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Lex/PPCaching.cpp b/lib/Lex/PPCaching.cpp index 20e3b3dd9d..16fcaa365c 100644 --- a/lib/Lex/PPCaching.cpp +++ b/lib/Lex/PPCaching.cpp @@ -45,13 +45,19 @@ void Preprocessor::Backtrack() { } void Preprocessor::CachingLex(Token &Result) { + if (!InCachingLexMode()) + return; + if (CachedLexPos < CachedTokens.size()) { Result = CachedTokens[CachedLexPos++]; return; } ExitCachingLexMode(); - Lex(Result); + // True if we consumed everything already. + bool PastEOF = CurPPLexer == 0 && CurTokenLexer == 0; + if (!PastEOF) + Lex(Result); if (!isBacktrackEnabled()) { // All cached tokens were consumed. @@ -60,10 +66,12 @@ void Preprocessor::CachingLex(Token &Result) { return; } - // Cache the lexed token. + // Cache the lexed token if it's not a repeated tok::eof. EnterCachingLexMode(); - CachedTokens.push_back(Result); - ++CachedLexPos; + if (!PastEOF) { + CachedTokens.push_back(Result); + ++CachedLexPos; + } } void Preprocessor::EnterCachingLexMode() { |