diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -393,11 +393,17 @@ // Try to merge a block with left brace wrapped that wasn't yet covered if (TheLine->Last->is(tok::l_brace)) { - return !Style.BraceWrapping.AfterFunction || - (I[1]->First->is(tok::r_brace) && - !Style.BraceWrapping.SplitEmptyRecord) - ? tryMergeSimpleBlock(I, E, Limit) - : 0; + bool ShouldMerge = false; + if (TheLine->First->isOneOf(tok::kw_class, tok::kw_struct)) { + ShouldMerge = !Style.BraceWrapping.AfterClass || + (I[1]->First->is(tok::r_brace) && + !Style.BraceWrapping.SplitEmptyRecord); + } else { + ShouldMerge = !Style.BraceWrapping.AfterFunction || + (I[1]->First->is(tok::r_brace) && + !Style.BraceWrapping.SplitEmptyFunction); + } + return ShouldMerge ? tryMergeSimpleBlock(I, E, Limit) : 0; } // Try to merge a function block with left brace wrapped if (I[1]->First->is(TT_FunctionLBrace) && diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -12200,6 +12200,38 @@ "}", Style); } + +TEST_F(FormatTest, SplitEmptyFunctionButNotRecord) { + FormatStyle Style = getLLVMStyle(); + Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterFunction = true; + Style.BraceWrapping.SplitEmptyFunction = true; + Style.BraceWrapping.SplitEmptyRecord = false; + Style.ColumnLimit = 40; + + verifyFormat("class C {};", Style); + verifyFormat("struct C {};", Style); + verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " int bbbbbbbbbbbbbbbbbbbbbbbb)\n" + "{\n" + "}", + Style); + verifyFormat("class C {\n" + " C()\n" + " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa(),\n" + " bbbbbbbbbbbbbbbbbbb()\n" + " {\n" + " }\n" + " void\n" + " m(int aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " int bbbbbbbbbbbbbbbbbbbbbbbb)\n" + " {\n" + " }\n" + "};", + Style); +} + TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { FormatStyle Style = getLLVMStyle(); Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;