Author: owenca Date: 2026-06-15T22:06:55-07:00 New Revision: 08834adcae88734e92359941c594c2ef6474c817
URL: https://github.com/llvm/llvm-project/commit/08834adcae88734e92359941c594c2ef6474c817 DIFF: https://github.com/llvm/llvm-project/commit/08834adcae88734e92359941c594c2ef6474c817.diff LOG: [clang-format] Fix a bug in merging short inline functions (#203754) Fixes #203209 Added: Modified: clang/lib/Format/UnwrappedLineFormatter.cpp clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp index 42eabc065b1a8..7ea424349d923 100644 --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -314,8 +314,7 @@ class LineJoiner { } } - auto ShouldMergeShortFunctions = [this, &I, &NextLine, PreviousLine, - TheLine]() { + auto ShouldMergeShortFunctions = [&] { if (Style.AllowShortFunctionsOnASingleLine.isAll()) return true; @@ -326,12 +325,12 @@ class LineJoiner { if (Style.AllowShortFunctionsOnASingleLine.Inline && !Style.AllowShortFunctionsOnASingleLine.Other) { - // Just checking TheLine->Level != 0 is not enough, because it - // provokes treating functions inside indented namespaces as short. if (Style.isJavaScript() && TheLine->Last->is(TT_FunctionLBrace)) return true; - if (TheLine->Level != 0) { + // Just checking `TheLine->Level > 0` is not enough because it would + // cause functions inside indented namespaces to be treated as short. + if (const auto Level = TheLine->Level; Level > 0) { if (!PreviousLine) return false; @@ -339,15 +338,16 @@ class LineJoiner { // Find the last line with lower level. const AnnotatedLine *Line = nullptr; for (auto J = I - 1; J >= AnnotatedLines.begin(); --J) { - assert(*J); - if (((*J)->InPPDirective && !(*J)->InMacroBody) || - (*J)->isComment() || (*J)->Level > TheLine->Level) { + const auto *L = *J; + assert(L); + if (TheLine->InMacroBody && !L->InMacroBody) + break; + if (L->isComment() || (!TheLine->InPPDirective && L->InPPDirective)) continue; - } - if ((*J)->Level < TheLine->Level || - (Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths && - (*J)->First->is(tok::l_brace))) { - Line = *J; + if (L->Level < Level || + (L->Level == Level && L->First->is(tok::l_brace) && + Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths)) { + Line = L; break; } } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index a9e5d837843cd..acd584c811ae7 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -15425,6 +15425,15 @@ TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { "}", MergeInlineOnly); + MergeInlineOnly.NamespaceIndentation = FormatStyle::NI_All; + verifyFormat("namespace {\n" + " class Class {\n" + "#define MACRO 1\n" + " int f() { return 1; }\n" + " };\n" + "} // namespace", + MergeInlineOnly); + MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; verifyFormat("class Foo\n" " {\n" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
