Author: James Wobser Date: 2026-02-28T19:04:08Z New Revision: 3034c0966931bef36c169b5727ee20129aa4d4e3
URL: https://github.com/llvm/llvm-project/commit/3034c0966931bef36c169b5727ee20129aa4d4e3 DIFF: https://github.com/llvm/llvm-project/commit/3034c0966931bef36c169b5727ee20129aa4d4e3.diff LOG: [clang-format] bugfix: Whitesmiths with IndentAccessModifiers (#182432) Due to special handling of Whitesmiths when parsing, the additional level(s) needed for the block, when used with IndentAccessModifiers, were not being applied. Consequently, when calculating the access modifier indent offset, the modifiers were being placed at the class level. This change ensures that the additional level(s) are not omitted for Whitesmiths. Added: Modified: clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index f57ef1328eac7..d76a74349fe04 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -762,12 +762,13 @@ FormatToken *UnwrappedLineParser::parseBlock(bool MustBeDeclaration, const bool MacroBlock = FormatTok->is(TT_MacroBlockBegin); FormatTok->setBlockKind(BK_Block); + const bool IsWhitesmiths = + Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths; + // For Whitesmiths mode, jump to the next level prior to skipping over the // braces. - if (!VerilogHierarchy && AddLevels > 0 && - Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths) { + if (!VerilogHierarchy && AddLevels > 0 && IsWhitesmiths) ++Line->Level; - } size_t PPStartHash = computePPHash(); @@ -802,8 +803,11 @@ FormatToken *UnwrappedLineParser::parseBlock(bool MustBeDeclaration, ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, MustBeDeclaration); - if (AddLevels > 0u && Style.BreakBeforeBraces != FormatStyle::BS_Whitesmiths) - Line->Level += AddLevels; + + // Whitesmiths logic has already added a level by this point, so avoid + // adding it twice. + if (AddLevels > 0u) + Line->Level += AddLevels - (IsWhitesmiths ? 1 : 0); FormatToken *IfLBrace = nullptr; const bool SimpleBlock = parseLevel(Tok, IfKind, &IfLBrace); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index dfc21bcefad53..33af71de398be 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -27325,6 +27325,23 @@ TEST_F(FormatTest, IndentAccessModifiers) { " int i;\n" "};", Style); + + Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; + verifyFormat("struct S\n" + " {\n" + " public:\n" + " int i;\n" + "\n" + " private:\n" + " class C\n" + " {\n" + " private:\n" + " int j;\n" + " };\n" + " };", + Style); + + Style.BreakBeforeBraces = FormatStyle::BS_Attach; // Enumerations are not records and should be unaffected. Style.AllowShortEnumsOnASingleLine = false; verifyFormat("enum class E {\n" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
