https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/100852
>From f06f3ab5e59217348e72179c9581be338efa8789 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Fri, 26 Jul 2024 19:17:33 -0700 Subject: [PATCH] [clang-format] Handle parenthesized list in RemoveParentheses Also, reformat clang-format source to remove redundant parentheses enclosing single list items. Fixes #100768. --- clang/lib/Format/UnwrappedLineParser.cpp | 12 +++++++++++- clang/tools/clang-format/ClangFormat.cpp | 2 +- clang/unittests/Format/FormatTest.cpp | 4 ++++ clang/unittests/Format/MatchFilePathTest.cpp | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index d406a531a5c0c..3ebf8a44acc0f 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2534,6 +2534,7 @@ bool UnwrappedLineParser::parseBracedList(bool IsAngleBracket, bool IsEnum) { bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { assert(FormatTok->is(tok::l_paren) && "'(' expected."); auto *LeftParen = FormatTok; + bool SeenComma = false; bool SeenEqual = false; bool MightBeFoldExpr = false; const bool MightBeStmtExpr = Tokens->peekNextToken()->is(tok::l_brace); @@ -2553,10 +2554,14 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { const auto *Next = Tokens->peekNextToken(); const bool DoubleParens = Prev && Prev->is(tok::l_paren) && Next && Next->is(tok::r_paren); + const bool CommaSeparated = + !DoubleParens && Prev && Prev->isOneOf(tok::l_paren, tok::comma) && + Next && Next->isOneOf(tok::comma, tok::r_paren); const auto *PrevPrev = Prev ? Prev->getPreviousNonComment() : nullptr; const bool Blacklisted = PrevPrev && (PrevPrev->isOneOf(tok::kw___attribute, tok::kw_decltype) || + SeenComma || (SeenEqual && (PrevPrev->isOneOf(tok::kw_if, tok::kw_while) || PrevPrev->endsSequence(tok::kw_constexpr, tok::kw_if)))); @@ -2566,7 +2571,8 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { (!NestedLambdas.empty() && !NestedLambdas.back())) && Prev && Prev->isOneOf(tok::kw_return, tok::kw_co_return) && Next && Next->is(tok::semi); - if ((DoubleParens && !Blacklisted) || ReturnParens) { + if ((DoubleParens && !Blacklisted) || (CommaSeparated && !SeenComma) || + ReturnParens) { LeftParen->Optional = true; FormatTok->Optional = true; } @@ -2595,6 +2601,10 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { parseBracedList(); } break; + case tok::comma: + SeenComma = true; + nextToken(); + break; case tok::ellipsis: MightBeFoldExpr = true; nextToken(); diff --git a/clang/tools/clang-format/ClangFormat.cpp b/clang/tools/clang-format/ClangFormat.cpp index 6cba1267f3b0d..6582d73eae40e 100644 --- a/clang/tools/clang-format/ClangFormat.cpp +++ b/clang/tools/clang-format/ClangFormat.cpp @@ -364,7 +364,7 @@ emitReplacementWarnings(const Replacements &Replaces, StringRef AssumedFileName, : SourceMgr::DiagKind::DK_Warning, "code should be clang-formatted [-Wclang-format-violations]"); - Diag.print(nullptr, llvm::errs(), (ShowColors && !NoShowColors)); + Diag.print(nullptr, llvm::errs(), ShowColors && !NoShowColors); if (ErrorLimit && ++Errors >= ErrorLimit) break; } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d7f81813835fa..2a754a29e81e7 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -27445,6 +27445,10 @@ TEST_F(FormatTest, RemoveParentheses) { verifyFormat("static_assert((std::is_constructible_v<T, Args &&> && ...));", "static_assert(((std::is_constructible_v<T, Args &&> && ...)));", Style); + verifyFormat("foo((a, b));", "foo(((a, b)));", Style); + verifyFormat("foo((a, b));", "foo(((a), b));", Style); + verifyFormat("foo((a, b));", "foo((a, (b)));", Style); + verifyFormat("foo((a, b, c));", "foo((a, ((b)), c));", Style); verifyFormat("return (0);", "return (((0)));", Style); verifyFormat("return (({ 0; }));", "return ((({ 0; })));", Style); verifyFormat("return ((... && std::is_convertible_v<TArgsLocal, TArgs>));", diff --git a/clang/unittests/Format/MatchFilePathTest.cpp b/clang/unittests/Format/MatchFilePathTest.cpp index f41cf7f971596..28f665635718e 100644 --- a/clang/unittests/Format/MatchFilePathTest.cpp +++ b/clang/unittests/Format/MatchFilePathTest.cpp @@ -53,7 +53,7 @@ TEST_F(MatchFilePathTest, Newline) { TEST_F(MatchFilePathTest, Star) { EXPECT_TRUE(match(std::string(50, 'a'), "*a*a*a*a*a*a*a*a*a*a")); - EXPECT_FALSE(match((std::string(50, 'a') + 'b'), "*a*a*a*a*a*a*a*a*a*a")); + EXPECT_FALSE(match(std::string(50, 'a') + 'b', "*a*a*a*a*a*a*a*a*a*a")); } TEST_F(MatchFilePathTest, CaseSensitive) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits