https://github.com/owenca created https://github.com/llvm/llvm-project/pull/128410
Fixes #105482 >From bcec5b1bfe6fefbdcaab59e1361c71db395ebdb0 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sun, 23 Feb 2025 00:54:55 -0800 Subject: [PATCH] [clang-format] Fix a bug that changes keyword `or` to an identifier Fixes #105482 --- clang/lib/Format/FormatToken.h | 23 ------------------- clang/lib/Format/UnwrappedLineParser.cpp | 6 ----- clang/unittests/Format/FormatTest.cpp | 6 +++-- clang/unittests/Format/TokenAnnotatorTest.cpp | 11 +++++++-- 4 files changed, 13 insertions(+), 33 deletions(-) diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 29aba281ae103..02429970599c0 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -743,29 +743,6 @@ struct FormatToken { return isOneOf(tok::star, tok::amp, tok::ampamp); } - bool isCppAlternativeOperatorKeyword() const { - assert(!TokenText.empty()); - if (!isalpha(TokenText[0])) - return false; - - switch (Tok.getKind()) { - case tok::ampamp: - case tok::ampequal: - case tok::amp: - case tok::pipe: - case tok::tilde: - case tok::exclaim: - case tok::exclaimequal: - case tok::pipepipe: - case tok::pipeequal: - case tok::caret: - case tok::caretequal: - return true; - default: - return false; - } - } - bool isUnaryOperator() const { switch (Tok.getKind()) { case tok::plus: diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 57ddd80382d88..16f19e955bf55 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -1712,12 +1712,6 @@ void UnwrappedLineParser::parseStructuralElement( OpeningBrace && OpeningBrace->isOneOf(TT_RequiresExpressionLBrace, TT_CompoundRequirementLBrace); !eof();) { - if (IsCpp && FormatTok->isCppAlternativeOperatorKeyword()) { - if (auto *Next = Tokens->peekNextToken(/*SkipComment=*/true); - Next && Next->isBinaryOperator()) { - FormatTok->Tok.setKind(tok::identifier); - } - } const FormatToken *Previous = FormatTok->Previous; switch (FormatTok->Tok.getKind()) { case tok::at: diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index fe0e47080a577..0012a456e6cff 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -18072,9 +18072,11 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { verifyFormat("int a = 5;"); verifyFormat("a += 42;"); verifyFormat("a or_eq 8;"); - verifyFormat("xor = foo;"); - FormatStyle Spaces = getLLVMStyle(); + auto Spaces = getLLVMStyle(FormatStyle::LK_C); + verifyFormat("xor = foo;", Spaces); + + Spaces.Language = FormatStyle::LK_Cpp; Spaces.SpaceBeforeAssignmentOperators = false; verifyFormat("int a= 5;", Spaces); verifyFormat("a+= 42;", Spaces); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 8ada6c3daeaf6..1e1774ba5b3b5 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -3677,6 +3677,11 @@ TEST_F(TokenAnnotatorTest, CppAltOperatorKeywords) { ASSERT_EQ(Tokens.size(), 7u) << Tokens; EXPECT_TOKEN(Tokens[3], tok::pipepipe, TT_BinaryOperator); + Tokens = annotate("return segment < *this or *this < segment;"); + ASSERT_EQ(Tokens.size(), 12u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::pipepipe, TT_BinaryOperator); + EXPECT_TOKEN(Tokens[6], tok::star, TT_UnaryOperator); + Tokens = annotate("a = b or_eq c;"); ASSERT_EQ(Tokens.size(), 7u) << Tokens; EXPECT_TOKEN(Tokens[3], tok::pipeequal, TT_BinaryOperator); @@ -3689,11 +3694,13 @@ TEST_F(TokenAnnotatorTest, CppAltOperatorKeywords) { ASSERT_EQ(Tokens.size(), 7u) << Tokens; EXPECT_TOKEN(Tokens[3], tok::caretequal, TT_BinaryOperator); - Tokens = annotate("xor = foo;"); + const auto StyleC = getLLVMStyle(FormatStyle::LK_C); + + Tokens = annotate("xor = foo;", StyleC); ASSERT_EQ(Tokens.size(), 5u) << Tokens; EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown); - Tokens = annotate("int xor = foo;"); + Tokens = annotate("int xor = foo;", StyleC); ASSERT_EQ(Tokens.size(), 6u) << Tokens; EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits