From: Alexander Kornienko Date: Mon, 12 Jan 2015 13:11:12 +0000 (+0000) Subject: Fix assertion in BreakableBlockComment (http://llvm.org/PR21916). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9409329e39a3fe87e7f853acc0c0dc14ffe62f4;p=clang Fix assertion in BreakableBlockComment (http://llvm.org/PR21916). Reviewers: djasper Reviewed By: djasper Subscribers: klimek, cfe-commits Differential Revision: http://reviews.llvm.org/D6894 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225628 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/BreakableToken.cpp b/lib/Format/BreakableToken.cpp index 1bea0e5651..26f1371b40 100644 --- a/lib/Format/BreakableToken.cpp +++ b/lib/Format/BreakableToken.cpp @@ -303,7 +303,8 @@ BreakableBlockComment::BreakableBlockComment( 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({ diff --git a/lib/Format/BreakableToken.h b/lib/Format/BreakableToken.h index 6f49ed2d36..eb1f9fda30 100644 --- a/lib/Format/BreakableToken.h +++ b/lib/Format/BreakableToken.h @@ -212,6 +212,11 @@ private: // 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 remaining lines' + // target columns are relative to the first line to allow correct indentation + // of comments in \c WhitespaceManager. Thus 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. diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 3bb55402e7..8e770c2e9c 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -2816,6 +2816,17 @@ TEST_F(FormatTest, NoEscapedNewlineHandlingInBlockComments) { 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"