diff options
author | Alexander Kornienko <alexfh@google.com> | 2015-01-12 13:11:12 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2015-01-12 13:11:12 +0000 |
commit | b9409329e39a3fe87e7f853acc0c0dc14ffe62f4 (patch) | |
tree | bf0025a7ff4de8380c6fa5411e1e3f1a7904d928 | |
parent | 2034e8e48fa1ed2013861382064cb085e3b0ba2b (diff) |
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
-rw-r--r-- | lib/Format/BreakableToken.cpp | 3 | ||||
-rw-r--r-- | lib/Format/BreakableToken.h | 5 | ||||
-rw-r--r-- | unittests/Format/FormatTest.cpp | 11 |
3 files changed, 18 insertions, 1 deletions
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<int>(IndentAtLineBreak, StartOfLineColumn[i]); + IndentAtLineBreak = + std::min<int>(IndentAtLineBreak, std::max(0, StartOfLineColumn[i])); } IndentAtLineBreak = std::max<unsigned>(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<int, 16> 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" |