rymiel created this revision. rymiel added reviewers: HazardyKnusperkeks, owenpan, MyDeveloperDay. Herald added a project: All. rymiel requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This change breaks no existing tests but does fix the linked issue. Declarations of operator overloads are annotated with `TT_FunctionDeclarationName` on the `operator` keyword, which is already being checked for when aligning, so the extra `kw_operator` doesn't seem to be necessary. (just for reference, it was added in rG92b397fb9d55ccdf4632c2b1b15b4a0ee417cf74 <https://reviews.llvm.org/rG92b397fb9d55ccdf4632c2b1b15b4a0ee417cf74> / 92b397fb9d55ccdf4632c2b1b15b4a0ee417cf74) Fixes https://github.com/llvm/llvm-project/issues/55733 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D137223 Files: clang/lib/Format/WhitespaceManager.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -437,6 +437,23 @@ ASSERT_EQ(Tokens.size(), 8u) << Tokens; EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator); EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen); + + Tokens = annotate("int operator+(int);"); + ASSERT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName); + EXPECT_TOKEN(Tokens[2], tok::plus, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen); + Tokens = annotate("auto operator=(T&) {}"); + ASSERT_EQ(Tokens.size(), 10u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName); + EXPECT_TOKEN(Tokens[2], tok::equal, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen); + Tokens = annotate("auto operator()() {}"); + ASSERT_EQ(Tokens.size(), 9u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName); + EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -17936,6 +17936,14 @@ " double bar();\n" "};\n", Alignment); + // Ensure operators are not aligned if they're being called, not declared + verifyFormat("int main() {\n" + " int operator()(int a);\n" + " double operator+(double a);\n" + " operator()(1);\n" + " operator+(1.0);\n" + "};\n", + Alignment); // http://llvm.org/PR52914 verifyFormat("char *a[] = {\"a\", // comment\n" " \"bb\"};\n" Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -870,9 +870,7 @@ AlignTokens( Style, [](Change const &C) { - // tok::kw_operator is necessary for aligning operator overload - // definitions. - if (C.Tok->isOneOf(TT_FunctionDeclarationName, tok::kw_operator)) + if (C.Tok->is(TT_FunctionDeclarationName)) return true; if (C.Tok->isNot(TT_StartOfName)) return false;
Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -437,6 +437,23 @@ ASSERT_EQ(Tokens.size(), 8u) << Tokens; EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator); EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen); + + Tokens = annotate("int operator+(int);"); + ASSERT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName); + EXPECT_TOKEN(Tokens[2], tok::plus, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen); + Tokens = annotate("auto operator=(T&) {}"); + ASSERT_EQ(Tokens.size(), 10u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName); + EXPECT_TOKEN(Tokens[2], tok::equal, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen); + Tokens = annotate("auto operator()() {}"); + ASSERT_EQ(Tokens.size(), 9u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName); + EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_OverloadedOperator); + EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -17936,6 +17936,14 @@ " double bar();\n" "};\n", Alignment); + // Ensure operators are not aligned if they're being called, not declared + verifyFormat("int main() {\n" + " int operator()(int a);\n" + " double operator+(double a);\n" + " operator()(1);\n" + " operator+(1.0);\n" + "};\n", + Alignment); // http://llvm.org/PR52914 verifyFormat("char *a[] = {\"a\", // comment\n" " \"bb\"};\n" Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -870,9 +870,7 @@ AlignTokens( Style, [](Change const &C) { - // tok::kw_operator is necessary for aligning operator overload - // definitions. - if (C.Tok->isOneOf(TT_FunctionDeclarationName, tok::kw_operator)) + if (C.Tok->is(TT_FunctionDeclarationName)) return true; if (C.Tok->isNot(TT_StartOfName)) return false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits