Skip to content

Commit 0e75810

Browse files
authored
[clang-format] Fix a bug in annotating binary operator && (#138633)
Fix #138485
1 parent b1e6c4b commit 0e75810

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3084,10 +3084,12 @@ class AnnotatingParser {
30843084
if (InTemplateArgument && NextToken->Tok.isAnyIdentifier())
30853085
return TT_BinaryOperator;
30863086

3087-
// "&&" followed by "*" or "&" is quite unlikely to be two successive unary
3088-
// "&".
3089-
if (Tok.is(tok::ampamp) && NextToken->isOneOf(tok::star, tok::amp))
3087+
// "&&" followed by "(", "*", or "&" is quite unlikely to be two successive
3088+
// unary "&".
3089+
if (Tok.is(tok::ampamp) &&
3090+
NextToken->isOneOf(tok::l_paren, tok::star, tok::amp)) {
30903091
return TT_BinaryOperator;
3092+
}
30913093

30923094
// This catches some cases where evaluation order is used as control flow:
30933095
// aaa && aaa->f();

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsNonTemplateAngleBrackets) {
754754
ASSERT_EQ(Tokens.size(), 27u) << Tokens;
755755
EXPECT_TOKEN(Tokens[7], tok::less, TT_BinaryOperator);
756756
EXPECT_TOKEN(Tokens[20], tok::greater, TT_BinaryOperator);
757+
758+
Tokens = annotate("bool foo = a < b && (c * d) > e;");
759+
ASSERT_EQ(Tokens.size(), 16u) << Tokens;
760+
EXPECT_TOKEN(Tokens[4], tok::less, TT_BinaryOperator);
761+
EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_BinaryOperator);
762+
EXPECT_TOKEN(Tokens[9], tok::star, TT_BinaryOperator);
763+
EXPECT_TOKEN(Tokens[12], tok::greater, TT_BinaryOperator);
757764
}
758765

759766
TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {

0 commit comments

Comments
 (0)