diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1895,26 +1895,31 @@ void removeBraces(SmallVectorImpl &Lines, tooling::Replacements &Result) { const auto &SourceMgr = Env.getSourceManager(); + bool EndsWithComment = false; for (AnnotatedLine *Line : Lines) { removeBraces(Line->Children, Result); - if (!Line->Affected) - continue; - for (FormatToken *Token = Line->First; Token && !Token->Finalized; - Token = Token->Next) { - if (!Token->Optional) - continue; - assert(Token->isOneOf(tok::l_brace, tok::r_brace)); - assert(Token->Next || Token == Line->Last); - const auto Start = - Token == Line->Last || - (Token->Next->isOneOf(tok::kw_else, tok::comment) && - Token->Next->NewlinesBefore > 0) - ? Token->WhitespaceRange.getBegin() - : Token->Tok.getLocation(); - const auto Range = - CharSourceRange::getCharRange(Start, Token->Tok.getEndLoc()); - cantFail(Result.add(tooling::Replacement(SourceMgr, Range, ""))); + if (Line->Affected) { + for (FormatToken *Token = Line->First; Token && !Token->Finalized; + Token = Token->Next) { + if (!Token->Optional) + continue; + assert(Token->isOneOf(tok::l_brace, tok::r_brace)); + assert(Token->Previous || Token == Line->First); + const FormatToken *Next = Token->Next; + assert(Next || Token == Line->Last); + const auto Start = + (!Token->Previous && EndsWithComment) || + (Next && !(Next->isOneOf(tok::kw_else, tok::comment) && + Next->NewlinesBefore > 0)) + ? Token->Tok.getLocation() + : Token->WhitespaceRange.getBegin(); + const auto Range = + CharSourceRange::getCharRange(Start, Token->Tok.getEndLoc()); + cantFail(Result.add(tooling::Replacement(SourceMgr, Range, ""))); + } } + assert(Line->Last); + EndsWithComment = Line->Last->is(tok::comment); } } }; 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 @@ -25741,6 +25741,17 @@ "}", Style); + verifyFormat("if (a) {\n" + " if (b)\n" + " c = 1; // comment\n" + "}", + "if (a) {\n" + " if (b) {\n" + " c = 1; // comment\n" + " }\n" + "}", + Style); + verifyFormat("if (a) {\n" "Label:\n" "}",