diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp --- a/clang/lib/Format/WhitespaceManager.cpp +++ b/clang/lib/Format/WhitespaceManager.cpp @@ -957,7 +957,8 @@ if (Style.AlignTrailingComments.Kind == FormatStyle::TCAS_Leave) { auto OriginalSpaces = Changes[i].OriginalWhitespaceRange.getEnd().getRawEncoding() - - Changes[i].OriginalWhitespaceRange.getBegin().getRawEncoding(); + Changes[i].OriginalWhitespaceRange.getBegin().getRawEncoding() - + Changes[i].Tok->NewlinesBefore; unsigned RestoredLineLength = Changes[i].StartOfTokenColumn + Changes[i].TokenLength + OriginalSpaces; // If leaving comments makes the line exceed the column limit, give up to diff --git a/clang/unittests/Format/FormatTestComments.cpp b/clang/unittests/Format/FormatTestComments.cpp --- a/clang/unittests/Format/FormatTestComments.cpp +++ b/clang/unittests/Format/FormatTestComments.cpp @@ -3062,6 +3062,61 @@ "int d;// comment\n", Style)); + EXPECT_EQ("// do not touch\n" + "int a; // any comments\n" + "\n" + " // comment\n" + "// comment\n" + "\n" + "// comment", + format("// do not touch\n" + "int a; // any comments\n" + "\n" + " // comment\n" + "// comment\n" + "\n" + "// comment", + Style)); + + EXPECT_EQ("// do not touch\n" + "int a; // any comments\n" + "\n" + " // comment\n" + "// comment\n" + "\n" + "// comment", + format("// do not touch\n" + "int a; // any comments\n" + "\n" + "\n" + " // comment\n" + "// comment\n" + "\n" + "\n" + "// comment", + Style)); + + // Allow to keep 2 empty lines + Style.MaxEmptyLinesToKeep = 2; + EXPECT_EQ("// do not touch\n" + "int a; // any comments\n" + "\n" + "\n" + " // comment\n" + "// comment\n" + "\n" + "// comment", + format("// do not touch\n" + "int a; // any comments\n" + "\n" + "\n" + " // comment\n" + "// comment\n" + "\n" + "// comment", + Style)); + Style.MaxEmptyLinesToKeep = 1; + // Just format comments normally when leaving exceeds the column limit Style.ColumnLimit = 35; EXPECT_EQ("int foo = 12345; // comment\n"