File tree Expand file tree Collapse file tree 2 files changed +18
-1
lines changed
Expand file tree Collapse file tree 2 files changed +18
-1
lines changed Original file line number Diff line number Diff line change @@ -230,7 +230,22 @@ class Parser {
230230 // Cut off parsing by acting as if we reached the end-of-file.
231231 Tok.setKind (tok::eof);
232232 }
233-
233+
234+ // / Use this to assert that the parser has advanced the lexing location, e.g.
235+ // / before a specific parser function has returned.
236+ class AssertParserMadeProgressBeforeLeavingScopeRAII {
237+ Parser &P;
238+ SourceLoc InitialLoc;
239+ public:
240+ AssertParserMadeProgressBeforeLeavingScopeRAII (Parser &parser) : P(parser) {
241+ InitialLoc = P.Tok .getLoc ();
242+ }
243+ ~AssertParserMadeProgressBeforeLeavingScopeRAII () {
244+ assert (InitialLoc != P.Tok .getLoc () &&
245+ " parser did not make progress, this can result in infinite loop" );
246+ }
247+ };
248+
234249 // / A RAII object for temporarily changing CurDeclContext.
235250 class ContextChange {
236251 protected:
Original file line number Diff line number Diff line change @@ -568,6 +568,8 @@ static ParserResult<Stmt> recoverFromInvalidCase(Parser &P) {
568568}
569569
570570ParserResult<Stmt> Parser::parseStmt () {
571+ AssertParserMadeProgressBeforeLeavingScopeRAII apmp (*this );
572+
571573 SyntaxParsingContext LocalContext (SyntaxContext, SyntaxContextKind::Stmt);
572574
573575 // Note that we're parsing a statement.
You can’t perform that action at this time.
0 commit comments