aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/Parser.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-17 10:52:18 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-17 10:52:18 +0000
commit36d36806f1972f7ec1d2a3f59155187278c56508 (patch)
tree192bc210f97918d96aa56b1f9e3bd8bc273dfe8f /lib/Parse/Parser.cpp
parent2574f6f35a54c1c1b5bcef1e69417fe58f566c11 (diff)
Make sure parens/braces/brackets are correctly balanced.
In a line like: (; the semicolon leaves Parser:ParenCount unbalanced (it's 1 even though we stopped looking for a right paren). This may affect later parsing and result in bad recovery for parsing errors. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106213 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/Parser.cpp')
-rw-r--r--lib/Parse/Parser.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index 225a793af5..7d999ac408 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -127,7 +127,16 @@ SourceLocation Parser::MatchRHSPunctuation(tok::TokenKind RHSTok,
}
Diag(Tok, DID);
Diag(LHSLoc, diag::note_matching) << LHSName;
- SkipUntil(RHSTok);
+ if (!SkipUntil(RHSTok)) {
+ // We stopped before finding a RHS token, e.g. we encountered a ';'.
+ // Balance Paren/Brace/Bracket counting.
+ switch (RHSTok) {
+ default: break;
+ case tok::r_paren : assert(ParenCount > 0); --ParenCount; break;
+ case tok::r_brace : assert(BraceCount > 0); --BraceCount; break;
+ case tok::r_square: assert(BracketCount > 0); --BracketCount; break;
+ }
+ }
return R;
}
@@ -401,6 +410,8 @@ void Parser::ParseTranslationUnit() {
///
/// [C++0x/GNU] 'extern' 'template' declaration
Parser::DeclGroupPtrTy Parser::ParseExternalDeclaration(CXX0XAttributeList Attr) {
+ ParenBraceBracketBalancer BalancerRAIIObj(*this);
+
DeclPtrTy SingleDecl;
switch (Tok.getKind()) {
case tok::semi: