diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index cff6fc5f6d9f..b7b41c9741a3 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -480,7 +480,7 @@ public: SmallVectorImpl::const_iterator I, SmallVectorImpl::const_iterator E) { // We can never merge stuff if there are trailing line comments. - AnnotatedLine *TheLine = *I; + const AnnotatedLine *TheLine = *I; if (TheLine->Last->Type == TT_LineComment) return 0; @@ -498,7 +498,8 @@ public: if (I + 1 == E || I[1]->Type == LT_Invalid) return 0; - if (TheLine->Last->Type == TT_FunctionLBrace) { + if (TheLine->Last->Type == TT_FunctionLBrace && + TheLine->First != TheLine->Last) { return Style.AllowShortFunctionsOnASingleLine ? tryMergeSimpleBlock(I, E, Limit) : 0; @@ -510,9 +511,11 @@ public: } if (I[1]->First->Type == TT_FunctionLBrace && Style.BreakBeforeBraces != FormatStyle::BS_Attach) { - // Reduce the column limit by the number of spaces we need to insert - // around braces. - Limit = Limit > 3 ? Limit - 3 : 0; + // Check for Limit <= 2 to accomodate for the " {". + if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(TheLine))) + return 0; + Limit -= 2; + unsigned MergedLines = 0; if (Style.AllowShortFunctionsOnASingleLine) { MergedLines = tryMergeSimpleBlock(I + 1, E, Limit); @@ -641,6 +644,14 @@ private: return 1 + I[1]->Last->TotalLength + 1 + I[2]->Last->TotalLength <= Limit; } + bool containsMustBreak(const AnnotatedLine *Line) { + for (const FormatToken *Tok = Line->First; Tok; Tok = Tok->Next) { + if (Tok->MustBreakBefore) + return true; + } + return false; + } + const FormatStyle &Style; }; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 65124a80575d..1ef701a6eb2e 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -6997,6 +6997,16 @@ TEST_F(FormatTest, AllmanBraceBreaking) { "}\n", BreakBeforeBrace); + BreakBeforeBrace.ColumnLimit = 19; + verifyFormat("void f() { int i; }", BreakBeforeBrace); + BreakBeforeBrace.ColumnLimit = 18; + verifyFormat("void f()\n" + "{\n" + " int i;\n" + "}", + BreakBeforeBrace); + BreakBeforeBrace.ColumnLimit = 80; + FormatStyle BreakBeforeBraceShortIfs = BreakBeforeBrace; BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true; BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; @@ -7716,16 +7726,26 @@ TEST_F(FormatTest, FormatsWithWebKitStyle) { " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" " aaaaaaaaaaaaaa)\n" - " , aaaaaaaaaaaaaaaaaaaaaaa() {}", - Style); - verifyFormat("SomeClass::Constructor()\n" - " : a(a) {}", + " , aaaaaaaaaaaaaaaaaaaaaaa()\n" + "{\n" + "}", Style); verifyFormat("SomeClass::Constructor()\n" " : a(a)\n" - " , b(b)\n" - " , c(c) {}", + "{\n" + "}", Style); + EXPECT_EQ("SomeClass::Constructor()\n" + " : a(a)\n" + "{\n" + "}", + format("SomeClass::Constructor():a(a){}", Style)); + verifyFormat("SomeClass::Constructor()\n" + " : a(a)\n" + " , b(b)\n" + " , c(c)\n" + "{\n" + "}", Style); verifyFormat("SomeClass::Constructor()\n" " : a(a)\n" "{\n"