Skip to content

Commit 8c7a038

Browse files
authored
[clang-format] Fix a bug in annotating CastRParen (#102261)
Fixes #102102.
1 parent e49549f commit 8c7a038

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2874,9 +2874,18 @@ class AnnotatingParser {
28742874
return false;
28752875

28762876
// Search for unexpected tokens.
2877-
for (auto *Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous)
2877+
for (auto *Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous) {
2878+
if (Prev->is(tok::r_paren)) {
2879+
Prev = Prev->MatchingParen;
2880+
if (!Prev)
2881+
return false;
2882+
if (Prev->is(TT_FunctionTypeLParen))
2883+
break;
2884+
continue;
2885+
}
28782886
if (!Prev->isOneOf(tok::kw_const, tok::identifier, tok::coloncolon))
28792887
return false;
2888+
}
28802889

28812890
return true;
28822891
}

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsCasts) {
740740
EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_Unknown);
741741
EXPECT_TOKEN(Tokens[11], tok::amp, TT_BinaryOperator);
742742

743+
Tokens = annotate("func((void (*)())&a);");
744+
ASSERT_EQ(Tokens.size(), 15u) << Tokens;
745+
EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionTypeLParen);
746+
EXPECT_TOKEN(Tokens[5], tok::star, TT_PointerOrReference);
747+
EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_CastRParen);
748+
EXPECT_TOKEN(Tokens[10], tok::amp, TT_UnaryOperator);
749+
743750
auto Style = getLLVMStyle();
744751
Style.TypeNames.push_back("Foo");
745752
Tokens = annotate("#define FOO(bar) foo((Foo)&bar)", Style);

0 commit comments

Comments
 (0)