Index: lib/Format/BreakableToken.h =================================================================== --- lib/Format/BreakableToken.h +++ lib/Format/BreakableToken.h @@ -212,6 +212,11 @@ // StartOfLineColumn[i] is the target column at which Line[i] should be. // Note that this excludes a leading "* " or "*" in case all lines have // a "*" prefix. + // The first line's target column is always positive. The rest lines' target + // columns are relative to the first line to allow correct indentation of + // comments in \c WhitespaceManager, so they can be negative as well (in case + // the first line needs to be unindented more than there's actual whitespace + // in another line). SmallVector StartOfLineColumn; // The column at which the text of a broken line should start. Index: lib/Format/BreakableToken.cpp =================================================================== --- lib/Format/BreakableToken.cpp +++ lib/Format/BreakableToken.cpp @@ -303,7 +303,8 @@ StartOfLineColumn[i] += Decoration.size(); Lines[i] = Lines[i].substr(Decoration.size()); LeadingWhitespace[i] += Decoration.size(); - IndentAtLineBreak = std::min(IndentAtLineBreak, StartOfLineColumn[i]); + IndentAtLineBreak = + std::min(IndentAtLineBreak, std::max(0, StartOfLineColumn[i])); } IndentAtLineBreak = std::max(IndentAtLineBreak, Decoration.size()); DEBUG({ Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -2812,6 +2812,17 @@ EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/")); } +TEST_F(FormatTest, DontCrashOnBlockComments) { + EXPECT_EQ( + "int xxxxxxxxx; /* " + "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n" + "zzzzzz\n" + "0*/", + format("int xxxxxxxxx; /* " + "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n" + "0*/")); +} + TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { verifyFormat("#define A \\\n" " int v( \\\n"