diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-10-12 16:37:45 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-10-12 16:37:45 +0000 |
commit | e7a8e3b6128af29fb39d48120b70ea8f95a462c0 (patch) | |
tree | 59117ddfd90de0f373740c4589af97738584e968 /clang/lib/Parse/ParseInit.cpp | |
parent | d74c0e7c14c9397e6c81d4cf8789771cedcbb3a9 (diff) | |
download | bcm5719-llvm-e7a8e3b6128af29fb39d48120b70ea8f95a462c0.tar.gz bcm5719-llvm-e7a8e3b6128af29fb39d48120b70ea8f95a462c0.zip |
Introduce BalancedDelimiterTracker, to better track open/close
delimiter pairs and detect when we exceed the implementation limit for
nesting depth, from Aaron Ballman!
llvm-svn: 141782
Diffstat (limited to 'clang/lib/Parse/ParseInit.cpp')
-rw-r--r-- | clang/lib/Parse/ParseInit.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/clang/lib/Parse/ParseInit.cpp b/clang/lib/Parse/ParseInit.cpp index ad7bcb2dd54..33abc932541 100644 --- a/clang/lib/Parse/ParseInit.cpp +++ b/clang/lib/Parse/ParseInit.cpp @@ -139,7 +139,10 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator() { // InMessageExpressionRAIIObject InMessage(*this, true); - SourceLocation StartLoc = ConsumeBracket(); + BalancedDelimiterTracker T(*this, tok::l_square); + T.consumeOpen(); + SourceLocation StartLoc = T.getOpenLocation(); + ExprResult Idx; // If Objective-C is enabled and this is a typename (class message @@ -266,8 +269,9 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator() { StartLoc, EllipsisLoc)); } - SourceLocation EndLoc = MatchRHSPunctuation(tok::r_square, StartLoc); - Desig.getDesignator(Desig.getNumDesignators() - 1).setRBracketLoc(EndLoc); + T.consumeClose(); + Desig.getDesignator(Desig.getNumDesignators() - 1).setRBracketLoc( + T.getCloseLocation()); } // Okay, we're done with the designator sequence. We know that there must be @@ -316,7 +320,9 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator() { ExprResult Parser::ParseBraceInitializer() { InMessageExpressionRAIIObject InMessage(*this, false); - SourceLocation LBraceLoc = ConsumeBrace(); + BalancedDelimiterTracker T(*this, tok::l_brace); + T.consumeOpen(); + SourceLocation LBraceLoc = T.getOpenLocation(); /// InitExprs - This is the actual list of expressions contained in the /// initializer. @@ -376,12 +382,13 @@ ExprResult Parser::ParseBraceInitializer() { // Handle trailing comma. if (Tok.is(tok::r_brace)) break; } - if (InitExprsOk && Tok.is(tok::r_brace)) + + bool closed = !T.consumeClose(); + + if (InitExprsOk && closed) return Actions.ActOnInitList(LBraceLoc, move_arg(InitExprs), - ConsumeBrace()); + T.getCloseLocation()); - // Match the '}'. - MatchRHSPunctuation(tok::r_brace, LBraceLoc); return ExprError(); // an error occurred. } |