From: Manuel Klimek Date: Mon, 21 Oct 2013 08:11:15 +0000 (+0000) Subject: Fixes PR17617: Crash on joining short if statements. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d186f0b4c15d4c63e0ae7fbe6ca3207871ba2eb9;p=clang Fixes PR17617: Crash on joining short if statements. Now that we iterate on the formatting multiple times when we have chains of preprocessor branches, we need to correctly reset the token's previous and next pointer for the first / last token. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193071 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/TokenAnnotator.h b/lib/Format/TokenAnnotator.h index 91f1b4678a..e51003bac8 100644 --- a/lib/Format/TokenAnnotator.h +++ b/lib/Format/TokenAnnotator.h @@ -43,6 +43,11 @@ public: MustBeDeclaration(Line.MustBeDeclaration), MightBeFunctionDecl(false), StartsDefinition(false) { assert(!Line.Tokens.empty()); + + // Calculate Next and Previous for all tokens. Note that we must overwrite + // Next and Previous for every token, as previous formatting runs might have + // left them in a different state. + First->Previous = NULL; FormatToken *Current = First; for (std::list::const_iterator I = ++Line.Tokens.begin(), E = Line.Tokens.end(); @@ -60,6 +65,7 @@ public: } } Last = Current; + Last->Next = NULL; } ~AnnotatedLine() { diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 6a2d0d89b4..a7de81b267 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -2329,6 +2329,19 @@ TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { "int i;"); } +TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { + FormatStyle SingleLine = getLLVMStyle(); + SingleLine.AllowShortIfStatementsOnASingleLine = true; + verifyFormat( + "#if 0\n" + "#elif 1\n" + "#endif\n" + "void foo() {\n" + " if (test) foo2();\n" + "}", + SingleLine); +} + TEST_F(FormatTest, LayoutBlockInsideParens) { EXPECT_EQ("functionCall({ int i; });", format(" functionCall ( {int i;} );")); EXPECT_EQ("functionCall({\n"