diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2476,6 +2476,14 @@ if (Next->MatchingParen->Next && Next->MatchingParen->Next->is(TT_PointerOrReference)) return true; + // Check for K&R C function definitions, e.g.: + // int f(i) + // { + // return i + 1; + // } + if (Next->Next && Next->Next->is(tok::identifier) && + !(Next->MatchingParen->Next && Next->MatchingParen->Next->is(tok::semi))) + return true; for (const FormatToken *Tok = Next->Next; Tok && Tok != Next->MatchingParen; Tok = Tok->Next) { if (Tok->is(TT_TypeDeclarationParen)) 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 @@ -8209,6 +8209,16 @@ "}\n", Style); + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterFunction = true; + verifyFormat("int f(i);\n" // No break here. + "int\n" // Break here. + "f(i)\n" + "{\n" + " return i + 1;\n" + "}\n", + Style); + Style = getGNUStyle(); // Test for comments at the end of function declarations.