aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXDeme <66138117+XDeme@users.noreply.github.com>2023-12-13 16:57:56 -0300
committerGitHub <noreply@github.com>2023-12-13 11:57:56 -0800
commit9512d6d2133a15a3e6272cbadd7fbb479011ccdb (patch)
tree36f6f86facdadfe69fcd5362f60090780518e514
parentddd13b6e5df5dc8a56fe7fca9c7a458663cd4687 (diff)
downloadllvm-9512d6d2133a15a3e6272cbadd7fbb479011ccdb.zip
llvm-9512d6d2133a15a3e6272cbadd7fbb479011ccdb.tar.gz
llvm-9512d6d2133a15a3e6272cbadd7fbb479011ccdb.tar.bz2
[clang-format] Fix parsing of `operator<() {}` (#75144)
Fixes #74876. During the parsing of `operator<(Foo&) {}`, there was no handling for the operator<, so it called `consumeToken()` again, causing the `AnnotationParser::Scopes` to have one additional left brace each time it tried to parse it, leaving it unbalanced. Because of this, in the following code: ```cpp class Foo { void operator<(Foo&) {} Foo& f; }; ``` The `&` in the reference member, was being interpreted as `TT_BinaryOperator` instead of `TT_PointerOrReference`.
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp4
-rw-r--r--clang/unittests/Format/TokenAnnotatorTest.cpp11
2 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index febd683..f3551af 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -164,6 +164,10 @@ private:
TT_OverloadedOperatorLParen))) {
return false;
}
+ if (Previous.Previous->is(tok::kw_operator) &&
+ CurrentToken->is(tok::l_paren)) {
+ return false;
+ }
}
FormatToken *Left = CurrentToken->Previous;
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 65b1f0f..8e69353 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -298,6 +298,17 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
EXPECT_TOKEN(Tokens[2], tok::identifier, TT_TypeName);
EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
+
+ Tokens = annotate("class Foo {\n"
+ " void operator<() {}\n"
+ " Foo &f;\n"
+ "};");
+ ASSERT_EQ(Tokens.size(), 17u) << Tokens;
+ EXPECT_TOKEN(Tokens[4], tok::kw_operator, TT_FunctionDeclarationName);
+ EXPECT_TOKEN(Tokens[5], tok::less, TT_OverloadedOperator);
+ EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_OverloadedOperatorLParen);
+ EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_FunctionLBrace);
+ EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
}
TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {