diff options
Diffstat (limited to 'clang/lib/Parse/Parser.cpp')
-rw-r--r-- | clang/lib/Parse/Parser.cpp | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 79a02eea423..2dc3d2c8757 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -159,7 +159,8 @@ static bool IsCommonTypo(tok::TokenKind ExpectedTok, const Token &Tok) { /// SkipToTok is specified, it calls SkipUntil(SkipToTok). Finally, true is /// returned. bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID, - const char *Msg, tok::TokenKind SkipToTok) { + const char *Msg, tok::TokenKind SkipToTok, + bool NoCount) { if (Tok.is(ExpectedTok) || Tok.is(tok::code_completion)) { ConsumeAnyToken(); return false; @@ -189,8 +190,12 @@ bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID, } else Diag(Tok, DiagID) << Msg; - if (SkipToTok != tok::unknown) - SkipUntil(SkipToTok, StopAtSemi); + if (SkipToTok != tok::unknown) { + SkipUntilFlags Flags = StopAtSemi; + if (NoCount) + Flags = Flags | NoBracketsCount; + SkipUntil(SkipToTok, Flags); + } return true; } @@ -314,26 +319,32 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> Toks, SkipUntilFlags Flags) { case tok::l_paren: // Recursively skip properly-nested parens. ConsumeParen(); - if (HasFlagsSet(Flags, StopAtCodeCompletion)) - SkipUntil(tok::r_paren, StopAtCodeCompletion); - else - SkipUntil(tok::r_paren); + if (!HasFlagsSet(Flags, NoBracketsCount)) { + if (HasFlagsSet(Flags, StopAtCodeCompletion)) + SkipUntil(tok::r_paren, StopAtCodeCompletion); + else + SkipUntil(tok::r_paren); + } break; case tok::l_square: // Recursively skip properly-nested square brackets. ConsumeBracket(); - if (HasFlagsSet(Flags, StopAtCodeCompletion)) - SkipUntil(tok::r_square, StopAtCodeCompletion); - else - SkipUntil(tok::r_square); + if (!HasFlagsSet(Flags, NoBracketsCount)) { + if (HasFlagsSet(Flags, StopAtCodeCompletion)) + SkipUntil(tok::r_square, StopAtCodeCompletion); + else + SkipUntil(tok::r_square); + } break; case tok::l_brace: // Recursively skip properly-nested braces. ConsumeBrace(); - if (HasFlagsSet(Flags, StopAtCodeCompletion)) - SkipUntil(tok::r_brace, StopAtCodeCompletion); - else - SkipUntil(tok::r_brace); + if (!HasFlagsSet(Flags, NoBracketsCount)) { + if (HasFlagsSet(Flags, StopAtCodeCompletion)) + SkipUntil(tok::r_brace, StopAtCodeCompletion); + else + SkipUntil(tok::r_brace); + } break; // Okay, we found a ']' or '}' or ')', which we think should be balanced. @@ -342,17 +353,17 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> Toks, SkipUntilFlags Flags) { // higher level, we will assume that this matches the unbalanced token // and return it. Otherwise, this is a spurious RHS token, which we skip. case tok::r_paren: - if (ParenCount && !isFirstTokenSkipped) + if (!HasFlagsSet(Flags, NoBracketsCount) && ParenCount && !isFirstTokenSkipped) return false; // Matches something. ConsumeParen(); break; case tok::r_square: - if (BracketCount && !isFirstTokenSkipped) + if (!HasFlagsSet(Flags, NoBracketsCount) && BracketCount && !isFirstTokenSkipped) return false; // Matches something. ConsumeBracket(); break; case tok::r_brace: - if (BraceCount && !isFirstTokenSkipped) + if (!HasFlagsSet(Flags, NoBracketsCount) && BraceCount && !isFirstTokenSkipped) return false; // Matches something. ConsumeBrace(); break; @@ -2031,7 +2042,7 @@ bool BalancedDelimiterTracker::expectAndConsume(unsigned DiagID, const char *Msg, tok::TokenKind SkipToToc ) { LOpen = P.Tok.getLocation(); - if (P.ExpectAndConsume(Kind, DiagID, Msg, SkipToToc)) + if (P.ExpectAndConsume(Kind, DiagID, Msg, SkipToToc, NoCount)) return true; if (getDepth() < MaxDepth) @@ -2056,16 +2067,21 @@ bool BalancedDelimiterTracker::diagnoseMissingClose() { // If we're not already at some kind of closing bracket, skip to our closing // token. + Parser::SkipUntilFlags Flags = Parser::StopAtSemi | Parser::StopBeforeMatch; + if (NoCount) + Flags = Flags | Parser::NoBracketsCount; if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) && P.Tok.isNot(tok::r_square) && - P.SkipUntil(Close, FinalToken, - Parser::StopAtSemi | Parser::StopBeforeMatch) && + P.SkipUntil(Close, FinalToken, Flags) && P.Tok.is(Close)) LClose = P.ConsumeAnyToken(); return true; } void BalancedDelimiterTracker::skipToEnd() { - P.SkipUntil(Close, Parser::StopBeforeMatch); + Parser::SkipUntilFlags Flags = Parser::StopBeforeMatch; + if (NoCount) + Flags = Flags | Parser::NoBracketsCount; + P.SkipUntil(Close, Flags); consumeClose(); } |