]> granicus.if.org Git - clang/commitdiff
Avoid recursions when the parser finds out that it has too many brackets.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 25 Jul 2013 02:11:20 +0000 (02:11 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 25 Jul 2013 02:11:20 +0000 (02:11 +0000)
BalancedDelimiterTracker::diagnoseOverflow calls P.SkipUntil, and before this
patch P.SkipUnti is recursive, causing problems on systems with small stacks.
This patch fixes it by making P.SkipUnti non recursive when just looking for
eof.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187097 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/Parser.cpp

index 2c6d6b329dd33e9c039f58189609d229af0a607a..036278f72ed277f30c1b5147b80f2529d96817b6 100644 (file)
@@ -279,6 +279,16 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> Toks, bool StopAtSemi,
       }
     }
 
+    // Important special case: The caller has given up and just wants us to
+    // skip the rest of the file. Do this without recursing, since we can
+    // get here precisely because the caller detected too much recursion.
+    if (Toks.size() == 1 && Toks[0] == tok::eof && !StopAtSemi &&
+        !StopAtCodeCompletion) {
+      while (Tok.getKind() != tok::eof)
+        ConsumeAnyToken();
+      return true;
+    }
+
     switch (Tok.getKind()) {
     case tok::eof:
       // Ran out of tokens.
@@ -1908,7 +1918,7 @@ bool BalancedDelimiterTracker::diagnoseOverflow() {
   P.Diag(P.Tok, diag::err_bracket_depth_exceeded)
     << P.getLangOpts().BracketDepth;
   P.Diag(P.Tok, diag::note_bracket_depth);
-  P.SkipUntil(tok::eof, FinalToken);
+  P.SkipUntil(tok::eof, false);
   return true;  
 }