Skip to content

Commit c455b46

Browse files
authored
[clang-format] Fix a bug in annotating CastRParen before unary && (#89346)
Also fix a bug in annotating TrailingAnnotation. Closes #61233.
1 parent f03cd2d commit c455b46

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

clang/lib/Format/TokenAnnotator.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -1543,6 +1543,7 @@ class AnnotatingParser {
15431543
return false;
15441544
if (Line.MustBeDeclaration && Contexts.size() == 1 &&
15451545
!Contexts.back().IsExpression && !Line.startsWith(TT_ObjCProperty) &&
1546+
!Line.startsWith(tok::l_paren) &&
15461547
!Tok->isOneOf(TT_TypeDeclarationParen, TT_RequiresExpressionLParen)) {
15471548
if (const auto *Previous = Tok->Previous;
15481549
!Previous ||
@@ -2726,8 +2727,10 @@ class AnnotatingParser {
27262727
}
27272728
}
27282729

2729-
if (Tok.Next->isOneOf(tok::question, tok::ampamp))
2730+
if (Tok.Next->is(tok::question) ||
2731+
(Tok.Next->is(tok::ampamp) && !Tok.Previous->isTypeName(IsCpp))) {
27302732
return false;
2733+
}
27312734

27322735
// `foreach((A a, B b) in someList)` should not be seen as a cast.
27332736
if (Tok.Next->is(Keywords.kw_in) && Style.isCSharp())

clang/unittests/Format/TokenAnnotatorTest.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsCasts) {
599599
ASSERT_EQ(Tokens.size(), 6u) << Tokens;
600600
EXPECT_TOKEN(Tokens[2], tok::r_paren, TT_CastRParen);
601601

602+
Tokens = annotate("(uint32_t)&&label;");
603+
ASSERT_EQ(Tokens.size(), 7u) << Tokens;
604+
EXPECT_TOKEN(Tokens[2], tok::r_paren, TT_CastRParen);
605+
EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_UnaryOperator);
606+
EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown);
607+
602608
Tokens = annotate("auto x = (Foo)p;");
603609
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
604610
EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_CastRParen);

0 commit comments

Comments
 (0)