]> granicus.if.org Git - clang/commitdiff
Fix assertion in BreakableBlockComment (http://llvm.org/PR21916).
authorAlexander Kornienko <alexfh@google.com>
Mon, 12 Jan 2015 13:11:12 +0000 (13:11 +0000)
committerAlexander Kornienko <alexfh@google.com>
Mon, 12 Jan 2015 13:11:12 +0000 (13:11 +0000)
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

lib/Format/BreakableToken.cpp
lib/Format/BreakableToken.h
unittests/Format/FormatTest.cpp

index 1bea0e565131fe8a7f765cdc346d9612f07830cb..26f1371b4092e0970bbf4c126d4abb92c7cc3de1 100644 (file)
@@ -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({
index 6f49ed2d367e0c370cd5bf89043242f1cebca0e5..eb1f9fda307114ff112a4f4d996df75ed42f1e86 100644 (file)
@@ -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.
index 3bb55402e715a2951fdf77bfe33fd05171647978..8e770c2e9cd56cd634a2d1e991c64b580ed66660 100644 (file)
@@ -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"