@@ -26,27 +26,31 @@ void Preprocessor::EnableBacktrackAtThisPos(bool Unannotated) {
2626 assert (LexLevel == 0 && " cannot use lookahead while lexing" );
2727 BacktrackPositions.push_back ((CachedLexPos << 1 ) | Unannotated);
2828 if (Unannotated)
29- UnannotatedBacktrackPositions.emplace_back (CachedTokens,
30- CachedTokens.size ());
29+ UnannotatedBacktrackTokens.emplace_back (CachedTokens, CachedTokens.size ());
3130 EnterCachingLexMode ();
3231}
3332
33+ Preprocessor::CachedTokensTy Preprocessor::PopUnannotatedBacktrackTokens () {
34+ assert (isUnannotatedBacktrackEnabled () && " missing unannotated tokens?" );
35+ auto [UnannotatedTokens, NumCachedToks] =
36+ std::move (UnannotatedBacktrackTokens.back ());
37+ UnannotatedBacktrackTokens.pop_back ();
38+ // If another unannotated backtrack is active, propagate any tokens that were
39+ // lexed (not cached) since EnableBacktrackAtThisPos was last called.
40+ if (isUnannotatedBacktrackEnabled ())
41+ UnannotatedBacktrackTokens.back ().first .append (
42+ UnannotatedTokens.begin () + NumCachedToks, UnannotatedTokens.end ());
43+ return std::move (UnannotatedTokens);
44+ }
45+
3446// Disable the last EnableBacktrackAtThisPos call.
3547void Preprocessor::CommitBacktrackedTokens () {
3648 assert (!BacktrackPositions.empty ()
3749 && " EnableBacktrackAtThisPos was not called!" );
3850 auto BacktrackPos = BacktrackPositions.back ();
3951 BacktrackPositions.pop_back ();
40- if (BacktrackPos & 1 ) {
41- assert (!UnannotatedBacktrackPositions.empty () &&
42- " missing unannotated tokens?" );
43- auto [UnannotatedTokens, NumCachedToks] =
44- std::move (UnannotatedBacktrackPositions.back ());
45- if (!UnannotatedBacktrackPositions.empty ())
46- UnannotatedBacktrackPositions.back ().first .append (
47- UnannotatedTokens.begin () + NumCachedToks, UnannotatedTokens.end ());
48- UnannotatedBacktrackPositions.pop_back ();
49- }
52+ if (BacktrackPos & 1 )
53+ PopUnannotatedBacktrackTokens ();
5054}
5155
5256// Make Preprocessor re-lex the tokens that were lexed since
@@ -57,17 +61,8 @@ void Preprocessor::Backtrack() {
5761 auto BacktrackPos = BacktrackPositions.back ();
5862 BacktrackPositions.pop_back ();
5963 CachedLexPos = BacktrackPos >> 1 ;
60- if (BacktrackPos & 1 ) {
61- assert (!UnannotatedBacktrackPositions.empty () &&
62- " missing unannotated tokens?" );
63- auto [UnannotatedTokens, NumCachedToks] =
64- std::move (UnannotatedBacktrackPositions.back ());
65- UnannotatedBacktrackPositions.pop_back ();
66- if (!UnannotatedBacktrackPositions.empty ())
67- UnannotatedBacktrackPositions.back ().first .append (
68- UnannotatedTokens.begin () + NumCachedToks, UnannotatedTokens.end ());
69- CachedTokens = std::move (UnannotatedTokens);
70- }
64+ if (BacktrackPos & 1 )
65+ CachedTokens = PopUnannotatedBacktrackTokens ();
7166 recomputeCurLexerKind ();
7267}
7368
@@ -94,7 +89,7 @@ void Preprocessor::CachingLex(Token &Result) {
9489 CachedTokens.push_back (Result);
9590 ++CachedLexPos;
9691 if (isUnannotatedBacktrackEnabled ())
97- UnannotatedBacktrackPositions .back ().first .push_back (Result);
92+ UnannotatedBacktrackTokens .back ().first .push_back (Result);
9893 return ;
9994 }
10095
@@ -137,7 +132,7 @@ const Token &Preprocessor::PeekAhead(unsigned N) {
137132 CachedTokens.push_back (Token ());
138133 Lex (CachedTokens.back ());
139134 if (isUnannotatedBacktrackEnabled ())
140- UnannotatedBacktrackPositions .back ().first .push_back (CachedTokens.back ());
135+ UnannotatedBacktrackTokens .back ().first .push_back (CachedTokens.back ());
141136 }
142137 EnterCachingLexMode ();
143138 return CachedTokens.back ();
0 commit comments