Skip to content

Commit bcd586b

Browse files
authored
[clang-format] Fix a bug in annotating CastRParen (#107675)
Fixes #107568.
1 parent 98563b1 commit bcd586b

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2874,21 +2874,26 @@ class AnnotatingParser {
28742874
if (Line.InPPDirective && AfterRParen->is(tok::minus))
28752875
return false;
28762876

2877+
const auto *Prev = BeforeRParen;
2878+
2879+
// Look for a function pointer type, e.g. `(*)()`.
2880+
if (Prev->is(tok::r_paren)) {
2881+
if (Prev->is(TT_CastRParen))
2882+
return false;
2883+
Prev = Prev->MatchingParen;
2884+
if (!Prev)
2885+
return false;
2886+
Prev = Prev->Previous;
2887+
if (!Prev || Prev->isNot(tok::r_paren))
2888+
return false;
2889+
Prev = Prev->MatchingParen;
2890+
return Prev && Prev->is(TT_FunctionTypeLParen);
2891+
}
2892+
28772893
// Search for unexpected tokens.
2878-
for (auto *Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous) {
2879-
if (Prev->is(tok::r_paren)) {
2880-
if (Prev->is(TT_CastRParen))
2881-
return false;
2882-
Prev = Prev->MatchingParen;
2883-
if (!Prev)
2884-
return false;
2885-
if (Prev->is(TT_FunctionTypeLParen))
2886-
break;
2887-
continue;
2888-
}
2894+
for (Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous)
28892895
if (!Prev->isOneOf(tok::kw_const, tok::identifier, tok::coloncolon))
28902896
return false;
2891-
}
28922897

28932898
return true;
28942899
}

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsCasts) {
775775
EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);
776776
EXPECT_TOKEN(Tokens[9], tok::minus, TT_BinaryOperator);
777777

778+
Tokens = annotate("return (double)(foo(30)) - 15;");
779+
ASSERT_EQ(Tokens.size(), 14u) << Tokens;
780+
EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);
781+
EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_Unknown);
782+
EXPECT_TOKEN(Tokens[10], tok::minus, TT_BinaryOperator);
783+
778784
auto Style = getLLVMStyle();
779785
Style.TypeNames.push_back("Foo");
780786
Tokens = annotate("#define FOO(bar) foo((Foo)&bar)", Style);

0 commit comments

Comments
 (0)