forked from qt-creator/qt-creator
		
	C++: Fix preprocessor blocked macro bug.
By lexing the first token after a macro call (meaning: the token after the closing parenthesis (which was passed to handleFunctionLikeMacro which in turn pushed it back into the token buffer)), a token buffer might be popped, which unblocks the macro that generated the actual param pack. The effect was that if this happens in the expansion of a recursive macro (with parameters!), the preprocessor ended up in an infinite loop. Task-number: QTCREATORBUG-9015 Task-number: QTCREATORBUG-9447 Change-Id: I0d83c59188ec15c4a948970e9fa944a17d765475 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
		
				
					committed by
					
						 Erik Verbruggen
						Erik Verbruggen
					
				
			
			
				
	
			
			
			
						parent
						
							d0afdfcc2b
						
					
				
				
					commit
					271c3f45a4
				
			| @@ -1048,7 +1048,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk) | ||||
|                                           argRefs); | ||||
|         } | ||||
|  | ||||
|         if (!handleFunctionLikeMacro(tk, macro, body, allArgTks, baseLine)) { | ||||
|         if (!handleFunctionLikeMacro(macro, body, allArgTks, baseLine)) { | ||||
|             if (m_client && !idTk.expanded()) | ||||
|                 m_client->stopExpandingMacro(idTk.offset, *macro); | ||||
|             return false; | ||||
| @@ -1119,8 +1119,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk) | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool Preprocessor::handleFunctionLikeMacro(PPToken *tk, | ||||
|                                            const Macro *macro, | ||||
| bool Preprocessor::handleFunctionLikeMacro(const Macro *macro, | ||||
|                                            QVector<PPToken> &body, | ||||
|                                            const QVector<QVector<PPToken> > &actuals, | ||||
|                                            unsigned baseLine) | ||||
| @@ -1220,9 +1219,6 @@ bool Preprocessor::handleFunctionLikeMacro(PPToken *tk, | ||||
|     body = expanded; | ||||
|     body.squeeze(); | ||||
|  | ||||
|     // Next token to be lexed after the expansion. | ||||
|     pushToken(tk); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| @@ -1479,9 +1475,9 @@ bool Preprocessor::collectActualArguments(PPToken *tk, QVector<QVector<PPToken> | ||||
|         actuals->append(tokens); | ||||
|     } | ||||
|  | ||||
|     if (tk->is(T_RPAREN)) | ||||
|         lex(tk); | ||||
|     //###TODO: else error message | ||||
|     if (!tk->is(T_RPAREN)) { | ||||
|         //###TODO: else error message | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user