Author: Barry Revzin Date: 2026-06-26T20:56:08+02:00 New Revision: 00ca10569f366f59a6a6f52fdd2f0ce8b9128a01
URL: https://github.com/llvm/llvm-project/commit/00ca10569f366f59a6a6f52fdd2f0ce8b9128a01 DIFF: https://github.com/llvm/llvm-project/commit/00ca10569f366f59a6a6f52fdd2f0ce8b9128a01.diff LOG: [clang-format] Fixing erroneous trailing comma (#205631) Fixes #205571 --------- Co-authored-by: Barry Revzin <[email protected]> Co-authored-by: Björn Schäpers <[email protected]> Added: Modified: clang/lib/Format/Format.cpp clang/lib/Format/FormatToken.h clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 51a976783b589..ecfe5d2ce60d0 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -2824,12 +2824,12 @@ class EnumTrailingCommaEditor : public TokenAnalyzer { void editEnumTrailingComma(SmallVectorImpl<AnnotatedLine *> &Lines, tooling::Replacements &Result) { bool InEnumBraces = false; - const FormatToken *BeforeRBrace = nullptr; + FormatToken *BeforeRBrace = nullptr; const auto &SourceMgr = Env.getSourceManager(); for (auto *Line : Lines) { if (!Line->Children.empty()) editEnumTrailingComma(Line->Children, Result); - for (const auto *Token = Line->First; Token && !Token->Finalized; + for (auto *Token = Line->First; Token && !Token->Finalized; Token = Token->Next) { if (Token->isNot(TT_EnumRBrace)) { if (Token->is(TT_EnumLBrace)) @@ -2839,8 +2839,10 @@ class EnumTrailingCommaEditor : public TokenAnalyzer { continue; } InEnumBraces = false; - if (!BeforeRBrace) // Empty braces or Line not affected. + if (!BeforeRBrace || BeforeRBrace->HasEnumTrailingCommaHandled) { + // Empty braces, or Line not affected, or already handled. continue; + } if (BeforeRBrace->is(tok::comma)) { if (Style.EnumTrailingComma == FormatStyle::ETC_Remove) replaceToken(*BeforeRBrace, BeforeRBrace->Next, SourceMgr, Result); @@ -2848,6 +2850,7 @@ class EnumTrailingCommaEditor : public TokenAnalyzer { cantFail(Result.add(tooling::Replacement( SourceMgr, BeforeRBrace->Tok.getEndLoc(), 0, ","))); } + BeforeRBrace->HasEnumTrailingCommaHandled = true; BeforeRBrace = nullptr; } } diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index ed9ce435ea765..0eeb95950ea2b 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -331,9 +331,9 @@ struct FormatToken { EndsBinaryExpression(false), PartOfMultiVariableDeclStmt(false), ContinuesLineCommentSection(false), Finalized(false), ClosesRequiresClause(false), EndsCppAttributeGroup(false), - BlockKind(BK_Unknown), Decision(FD_Unformatted), - PackingKind(PPK_Inconclusive), TypeIsFinalized(false), - Type(TT_Unknown) {} + HasEnumTrailingCommaHandled(false), BlockKind(BK_Unknown), + Decision(FD_Unformatted), PackingKind(PPK_Inconclusive), + TypeIsFinalized(false), Type(TT_Unknown) {} /// The \c Token. Token Tok; @@ -409,6 +409,9 @@ struct FormatToken { /// \c true if this token ends a group of C++ attributes. unsigned EndsCppAttributeGroup : 1; + /// \c true if a comma has been inserted or removed after the token. + unsigned HasEnumTrailingCommaHandled : 1; + private: /// Contains the kind of block if this token is a brace. unsigned BlockKind : 2; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index c42cc147cf21e..78ddb27e61e95 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -25210,6 +25210,19 @@ TEST_F(FormatTest, EnumTrailingComma) { " MY_ENUM = 0U\n" "};", Style); + + // Issue https://github.com/llvm/llvm-project/issues/205571 + verifyFormat("#ifdef FOO\n" + "#else\n" + "#endif\n" + "enum {\n" + " E = 1,\n" + "};", + "#ifdef FOO\n" + "#else\n" + "#endif\n" + "enum { E = 1 };", + Style); } TEST_F(FormatTest, BreakAfterAttributes) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
