C++: Stop parsing a declaration after two tries

If we fail to parse a declaration, we rewind, eat the token and look for the
next token that might be a good candidate for a declaration start (e.g. an
identifier). This becomes cpu and memory expensive with super long and invalid
expressions like

    typedef b:Ⓜ️:if_< b:Ⓜ️:bool_<
	(sizeof(fun((Dummy *) 0, (ThisT *) 0, (b:Ⓜ️:int_<70> *) 0)) ==
	 sizeof(defined_)) >, b:Ⓜ️:if_< b:Ⓜ️:bool_<
	(sizeof(fun((Dummy *) 0, (ThisT *) 0, (b:Ⓜ️:int_<71> *) 0)) ==
	 sizeof(defined_)) >, b:Ⓜ️:if_< b:Ⓜ️:bool_<
	(sizeof(fun((Dummy *) 0, (ThisT *) 0, (b:Ⓜ️:int_<72> *) 0)) ==
	 sizeof(defined_)) >, b:Ⓜ️:if_< b:Ⓜ️:bool_<
	(sizeof(fun((Dummy *) 0, (ThisT *) 0, (b:Ⓜ️:int_<73> *) 0)) ==
	 sizeof(defined_)) >, b:Ⓜ️:if_< b:Ⓜ️:bool_<
	(sizeof(fun((Dummy *) 0, (ThisT *) 0, (b:Ⓜ️:int_<74> *) 0)) ==
	 sizeof(defined_)) >, b:Ⓜ️:if_< b:Ⓜ️:bool_<
	(sizeof(fun((Dummy *) 0, (ThisT *) 0, (b:Ⓜ️:int_<75> *) 0)) ==
	 sizeof(defined_)) >, b:Ⓜ️:if_< b:Ⓜ️:bool_<
	// ...some more crazy lines like this

Therefore, stop trying after two failures by looking for the next semicolon or
closing curly brace.

Task-number: QTCREATORBUG-12890
Change-Id: I6637daeb840dd549d669080775228fa91fc932eb
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2014-11-18 11:58:37 +01:00
parent 657797f7a0
commit 78ab287fc6
2 changed files with 31 additions and 2 deletions

View File

@@ -254,6 +254,7 @@ public:
bool parseDesignator(DesignatorAST *&node);
bool skipUntil(int token);
void skipUntilAfterSemicolonOrRightBrace();
void skipUntilDeclaration();
bool skipUntilStatement();
bool skip(int l, int r);