summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-08-28 09:17:37 +0000
committerDaniel Jasper <djasper@google.com>2013-08-28 09:17:37 +0000
commit96df37a6a14929ed3bb0cc2b736445f28775d671 (patch)
tree95548dda9273cf72d4435a97d37289a297ff8c3f
parenta49393f54de2f9944972c7b52789ab4ac120353e (diff)
downloadbcm5719-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.cpp7
-rw-r--r--clang/unittests/Format/FormatTest.cpp3
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) {
OpenPOWER on IntegriCloud