Skip to content

Commit cb58e0b

Browse files
committedJul 11, 2024··
[FOLD] fix bug when propagating newly lexed tokens from current unannotated backtrack
1 parent ade60c6 commit cb58e0b

File tree

2 files changed

+26
-27
lines changed

2 files changed

+26
-27
lines changed
 

‎clang/include/clang/Lex/Preprocessor.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,7 @@ class Preprocessor {
11611161
std::vector<CachedTokensTy::size_type> BacktrackPositions;
11621162

11631163
std::vector<std::pair<CachedTokensTy, CachedTokensTy::size_type>>
1164-
UnannotatedBacktrackPositions;
1164+
UnannotatedBacktrackTokens;
11651165

11661166
/// True if \p Preprocessor::SkipExcludedConditionalBlock() is running.
11671167
/// This is used to guard against calling this function recursively.
@@ -1727,6 +1727,10 @@ class Preprocessor {
17271727
///
17281728
void EnableBacktrackAtThisPos(bool Unannotated = false);
17291729

1730+
private:
1731+
CachedTokensTy PopUnannotatedBacktrackTokens();
1732+
1733+
public:
17301734
/// Disable the last EnableBacktrackAtThisPos call.
17311735
void CommitBacktrackedTokens();
17321736

@@ -1739,7 +1743,7 @@ class Preprocessor {
17391743

17401744
bool isBacktrackEnabled() const { return !BacktrackPositions.empty(); }
17411745
bool isUnannotatedBacktrackEnabled() const {
1742-
return !UnannotatedBacktrackPositions.empty();
1746+
return !UnannotatedBacktrackTokens.empty();
17431747
}
17441748

17451749
/// Lex the next token for this preprocessor.

‎clang/lib/Lex/PPCaching.cpp

+20-25
Original file line numberDiff line numberDiff line change
@@ -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.
3547
void 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

Comments
 (0)
Please sign in to comment.