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 @@ -411,7 +411,7 @@ ? tryMergeSimpleControlStatement(I, E, Limit) : 0; } - if (TheLine->First->isOneOf(tok::kw_for, tok::kw_while)) { + if (TheLine->First->isOneOf(tok::kw_for, tok::kw_while, tok::kw_do)) { return Style.AllowShortLoopsOnASingleLine ? tryMergeSimpleControlStatement(I, E, Limit) : 0; @@ -514,7 +514,10 @@ return 0; Limit = limitConsideringMacros(I + 1, E, Limit); AnnotatedLine &Line = **I; - if (Line.Last->isNot(tok::r_paren)) + if (!Line.First->is(tok::kw_do) && Line.Last->isNot(tok::r_paren)) + return 0; + // Only merge do while if do is the only statement on the line. + if (Line.First->is(tok::kw_do) && !Line.Last->is(tok::kw_do)) return 0; if (1 + I[1]->Last->TotalLength > Limit) return 0; 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 @@ -556,6 +556,30 @@ verifyFormat("for (;;) /* still don't merge */\n" " continue;", AllowsMergedLoops); + verifyFormat("do a++;\n" + "while (true);", + AllowsMergedLoops); + verifyFormat("do /* Don't merge */\n" + " a++;\n" + "while (true);", + AllowsMergedLoops); + verifyFormat("do // Don't merge\n" + " a++;\n" + "while (true);", + AllowsMergedLoops); + verifyFormat("do\n" + " // Don't merge\n" + " a++;\n" + "while (true);", + AllowsMergedLoops); + // Without braces labels are interpreted differently. + verifyFormat("{\n" + " do\n" + " label:\n" + " a++;\n" + " while (true);\n" + "}", + AllowsMergedLoops); } TEST_F(FormatTest, FormatShortBracedStatements) {