diff options
| author | Daniel Jasper <djasper@google.com> | 2013-08-28 09:17:37 +0000 |
|---|---|---|
| committer | Daniel Jasper <djasper@google.com> | 2013-08-28 09:17:37 +0000 |
| commit | 96df37a6a14929ed3bb0cc2b736445f28775d671 (patch) | |
| tree | 95548dda9273cf72d4435a97d37289a297ff8c3f | |
| parent | a49393f54de2f9944972c7b52789ab4ac120353e (diff) | |
| download | bcm5719-llvm-96df37a6a14929ed3bb0cc2b736445f28775d671.tar.gz bcm5719-llvm-96df37a6a14929ed3bb0cc2b736445f28775d671.zip | |
clang-format: Fix segfault in 'incomplete' macros.
The code leading to a segfault was:
#pragma omp threadprivate(y)), // long comment leading to a line break
This fixes llvm.org/PR16513.
llvm-svn: 189460
| -rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 7 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 3 |
2 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 199fc022048..798e4f3aecd 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -536,9 +536,10 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State, // If we encounter a closing ), ], } or >, we can remove a level from our // stacks. - if (Current.isOneOf(tok::r_paren, tok::r_square) || - (Current.is(tok::r_brace) && State.NextToken != Line.First) || - State.NextToken->Type == TT_TemplateCloser) { + if (State.Stack.size() > 1 && + (Current.isOneOf(tok::r_paren, tok::r_square) || + (Current.is(tok::r_brace) && State.NextToken != Line.First) || + State.NextToken->Type == TT_TemplateCloser)) { State.Stack.pop_back(); --State.ParenLevel; } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d80011ba175..067a259b2ce 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1942,6 +1942,9 @@ TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { verifyFormat("#define A template <typename T>"); verifyFormat("#define STR(x) #x\n" "f(STR(this_is_a_string_literal{));"); + verifyFormat("#pragma omp threadprivate( \\\n" + " y)), // expected-warning", + getLLVMStyleWithColumns(28)); } TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { |

