-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[clang-format] Fix a bug in annotating &&
followed by *
or &
#65933
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang ChangesFixes #65877.Full diff: https://github.com/llvm/llvm-project/pull/65933.diff 2 Files Affected:
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index e925bee44cd0c6..142168e074bbc2 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2598,9 +2598,12 @@ class AnnotatingParser { if (InTemplateArgument && NextToken->Tok.isAnyIdentifier()) return TT_BinaryOperator; - // "&&(" is quite unlikely to be two successive unary "&". - if (Tok.is(tok::ampamp) && NextToken->is(tok::l_paren)) + // "&&" followed by "(", "*", or "&" is quite unlikely to be two successive + // unary "&". + if (Tok.is(tok::ampamp) && + NextToken->isOneOf(tok::l_paren, tok::star, tok::amp)) { return TT_BinaryOperator; + } // This catches some cases where evaluation order is used as control flow: // aaa && aaa->f(); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 43485298371294..be025dab86fafa 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -280,6 +280,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) { EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_BinaryOperator); EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator); + Tokens = annotate("foo = *i < *j && *j > *k;"); + EXPECT_EQ(Tokens.size(), 15u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::less, TT_BinaryOperator); + EXPECT_TOKEN(Tokens[7], tok::ampamp, TT_BinaryOperator); + EXPECT_TOKEN(Tokens[10], tok::greater, TT_BinaryOperator); + FormatStyle Style = getLLVMStyle(); Style.TypeNames.push_back("MYI"); Tokens = annotate("if (MYI *p{nullptr})", Style); |
@llvm/pr-subscribers-clang-format ChangesFixes #65877.Full diff: https://github.com/llvm/llvm-project/pull/65933.diff 2 Files Affected:
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index e925bee44cd0c6a..142168e074bbc27 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2598,9 +2598,12 @@ class AnnotatingParser { if (InTemplateArgument && NextToken->Tok.isAnyIdentifier()) return TT_BinaryOperator; - // "&&(" is quite unlikely to be two successive unary "&". - if (Tok.is(tok::ampamp) && NextToken->is(tok::l_paren)) + // "&&" followed by "(", "*", or "&" is quite unlikely to be two successive + // unary "&". + if (Tok.is(tok::ampamp) && + NextToken->isOneOf(tok::l_paren, tok::star, tok::amp)) { return TT_BinaryOperator; + } // This catches some cases where evaluation order is used as control flow: // aaa && aaa->f(); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 434852983712940..be025dab86fafa5 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -280,6 +280,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) { EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_BinaryOperator); EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator); + Tokens = annotate("foo = *i < *j && *j > *k;"); + EXPECT_EQ(Tokens.size(), 15u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::less, TT_BinaryOperator); + EXPECT_TOKEN(Tokens[7], tok::ampamp, TT_BinaryOperator); + EXPECT_TOKEN(Tokens[10], tok::greater, TT_BinaryOperator); + FormatStyle Style = getLLVMStyle(); Style.TypeNames.push_back("MYI"); Tokens = annotate("if (MYI *p{nullptr})", Style); |
&&
enclosed in <
and >
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm also suspicious of if a dereference like *j
should ever be legal in a template argument, but that would be a different case
&&
enclosed in <
and >
&&
followed by *
or &
86b8369
to
70aafbc
Compare
Fixes #65877.