summaryrefslogtreecommitdiffstats
path: root/clang/lib/Format/UnwrappedLineParser.cpp
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2013-09-04 08:20:47 +0000
committerManuel Klimek <klimek@google.com>2013-09-04 08:20:47 +0000
commitbab25fdfa53603d447eb7e2853c6a2e8c0c0db67 (patch)
treece817cffcf5a30fd6165a7bc513977c7b60fd54c /clang/lib/Format/UnwrappedLineParser.cpp
parent5b2000e4d9c930903bb376e2da8f78d53aea0a68 (diff)
downloadbcm5719-llvm-bab25fdfa53603d447eb7e2853c6a2e8c0c0db67.tar.gz
bcm5719-llvm-bab25fdfa53603d447eb7e2853c6a2e8c0c0db67.zip
Fix layout of lambda captures.
Before: int c = [ &, &a, a]{ [ =, c, &d]{ return b++; }(); }(); After: int c = [&, &a, a] { [=, c, &d] { return b++; }(); }(); llvm-svn: 189924
Diffstat (limited to 'clang/lib/Format/UnwrappedLineParser.cpp')
-rw-r--r--clang/lib/Format/UnwrappedLineParser.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 253dbf97fdc..f58ee823032 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -278,13 +278,11 @@ void UnwrappedLineParser::calculateBraceTypes() {
if (!LBraceStack.empty()) {
if (LBraceStack.back()->BlockKind == BK_Unknown) {
// If there is a comma, semicolon or right paren after the closing
- // brace, we assume this is a braced initializer list.
-
- // FIXME: Note that this currently works only because we do not
- // use the brace information while inside a braced init list.
- // Thus, if the parent is a braced init list, we consider all
- // brace blocks inside it braced init list. That works good enough
- // for now, but we will need to fix it to correctly handle lambdas.
+ // brace, we assume this is a braced initializer list. Note that
+ // regardless how we mark inner braces here, we will overwrite the
+ // BlockKind later if we parse a braced list (where all blocks inside
+ // are by default braced lists), or when we explicitly detect blocks
+ // (for example while parsing lambdas).
//
// We exclude + and - as they can be ObjC visibility modifiers.
if (NextTok->isOneOf(tok::comma, tok::semi, tok::r_paren,
@@ -315,12 +313,13 @@ void UnwrappedLineParser::calculateBraceTypes() {
}
Tok = NextTok;
Position += ReadTokens;
- } while (Tok->Tok.isNot(tok::eof));
+ } while (Tok->Tok.isNot(tok::eof) && !LBraceStack.empty());
// Assume other blocks for all unclosed opening braces.
for (unsigned i = 0, e = LBraceStack.size(); i != e; ++i) {
if (LBraceStack[i]->BlockKind == BK_Unknown)
LBraceStack[i]->BlockKind = BK_Block;
}
+
FormatTok = Tokens->setPosition(StoredPosition);
}
@@ -675,6 +674,7 @@ void UnwrappedLineParser::tryToParseLambda() {
break;
}
}
+ FormatTok->BlockKind = BK_Block;
nextToken();
{
ScopedLineState LineState(*this);
@@ -745,6 +745,9 @@ void UnwrappedLineParser::parseBracedList() {
tryToParseLambda();
break;
case tok::l_brace:
+ // Assume there are no blocks inside a braced init list apart
+ // from the ones we explicitly parse out (like lambdas).
+ FormatTok->BlockKind = BK_BracedInit;
parseBracedList();
break;
case tok::r_brace:
OpenPOWER on IntegriCloud