Skip to content

Commit 4fd14b9

Browse files
authored
[clang-format] Correctly annotate pointer/reference in range-for loop (#109361)
Fixes #109358.
1 parent 2e89e6b commit 4fd14b9

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,12 @@ class AnnotatingParser {
14071407
}
14081408
} else if (Contexts.back().ColonIsForRangeExpr) {
14091409
Tok->setType(TT_RangeBasedForLoopColon);
1410+
for (auto *Prev = Tok->Previous;
1411+
Prev && !Prev->isOneOf(tok::semi, tok::l_paren);
1412+
Prev = Prev->Previous) {
1413+
if (Prev->isPointerOrReference())
1414+
Prev->setFinalizedType(TT_PointerOrReference);
1415+
}
14101416
} else if (Contexts.back().ContextType == Context::C11GenericSelection) {
14111417
Tok->setType(TT_GenericSelectionColon);
14121418
} else if (CurrentToken && CurrentToken->is(tok::numeric_constant)) {

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
333333
ASSERT_EQ(Tokens.size(), 17u) << Tokens;
334334
EXPECT_TOKEN(Tokens[11], tok::star, TT_BinaryOperator);
335335

336+
Tokens = annotate("for (int i; Foo *&foo : foos)");
337+
ASSERT_EQ(Tokens.size(), 13u) << Tokens;
338+
EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference);
339+
EXPECT_TOKEN(Tokens[7], tok::amp, TT_PointerOrReference);
340+
EXPECT_TOKEN(Tokens[9], tok::colon, TT_RangeBasedForLoopColon);
341+
336342
Tokens = annotate("#define FOO auto Foo = [] { f(a * b); };");
337343
ASSERT_EQ(Tokens.size(), 19u) << Tokens;
338344
EXPECT_TOKEN(Tokens[12], tok::star, TT_BinaryOperator);

0 commit comments

Comments
 (0)