Browse Source

clang-format: Fix access to uninitialized memory.

With incomplete code, we aren't guaranteed to generated changes for
every token. In that case, we need to assume that even the very first
change can continue a preprocessor directive and initialize values
accordingly.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231066 91177308-0d34-0410-b5e6-96231b3b80d8
Daniel Jasper 10 years ago
parent
commit
ace92c4e2b
2 changed files with 5 additions and 0 deletions
  1. 1 0
      lib/Format/WhitespaceManager.cpp
  2. 4 0
      unittests/Format/FormatTest.cpp

+ 1 - 0
lib/Format/WhitespaceManager.cpp

@@ -232,6 +232,7 @@ void WhitespaceManager::alignEscapedNewlines() {
   unsigned MaxEndOfLine =
   unsigned MaxEndOfLine =
       Style.AlignEscapedNewlinesLeft ? 0 : Style.ColumnLimit;
       Style.AlignEscapedNewlinesLeft ? 0 : Style.ColumnLimit;
   unsigned StartOfMacro = 0;
   unsigned StartOfMacro = 0;
+  Changes[0].EscapedNewlineColumn = 0;
   for (unsigned i = 1, e = Changes.size(); i < e; ++i) {
   for (unsigned i = 1, e = Changes.size(); i < e; ++i) {
     Change &C = Changes[i];
     Change &C = Changes[i];
     if (C.NewlinesBefore > 0) {
     if (C.NewlinesBefore > 0) {

+ 4 - 0
unittests/Format/FormatTest.cpp

@@ -2656,6 +2656,10 @@ TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
                getLLVMStyleWithColumns(28));
                getLLVMStyleWithColumns(28));
   verifyFormat("#d, = };");
   verifyFormat("#d, = };");
   verifyFormat("#if \"a");
   verifyFormat("#if \"a");
+  verifyFormat("({\n"
+               "#define b }\\\n"
+               "  a\n"
+               "a");
 
 
   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");